| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <!-- Generated by Apache Maven Doxia at 2018-11-03 --> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| <title>Log4j_Kotlin – - Apache Log4j Kotlin API Parent</title> |
| <link rel="stylesheet" href="./css/bootstrap.min.css" type="text/css" /> |
| <link rel="stylesheet" href="./css/site.css" type="text/css" /> |
| <script type="text/javascript" src="./js/jquery.min.js"></script> |
| <script type="text/javascript" src="./js/bootstrap.min.js"></script> |
| <script type="text/javascript" src="./js/prettify.min.js"></script> |
| <script type="text/javascript" src="./js/site.js"></script> |
| <meta name="Date-Revision-yyyymmdd" content="20181103" /> |
| <meta http-equiv="Content-Language" content="en" /> |
| |
| </head> |
| <body class="composite"> |
| <a href="http://www.apache.org/events/current-event.html"> |
| <img class=logo-left src="http://www.apache.org/events/current-event-234x60.png"/> |
| </a> |
| <img class="logo-right" src="./images/logo.png" alt="Apache log4j logo" /> |
| <a href="https://logging.apache.org/"> |
| <img class="logo-center" src="./images/ls-logo.jpg" alt="Apache logging services logo" /> |
| </a> |
| <div class="clear"></div> |
| |
| <div class="navbar"> |
| <div class="navbar-inner"> |
| <div class="container-fluid"> |
| <a class="brand" href="https://logging.apache.org/log4j/kotlin/">Apache Log4j Kotlin API Parent ™</a> |
| <ul class="nav"> |
| <li> |
| |
| |
| <a href="https://cwiki.apache.org/confluence/display/LOGGING/Home" class="external" target="_blank" title="Logging Wiki">Logging Wiki</a> |
| </li> |
| <li> |
| |
| |
| <a href="https://www.apache.org/" class="external" target="_blank" title="Apache">Apache</a> |
| </li> |
| <li> |
| <a href="../../" title="Logging Services">Logging Services</a> |
| </li> |
| <li> |
| |
| |
| <a href="https://github.com/apache/logging-log4j-kotlin" class="external" target="_blank" title="GitHub">GitHub</a> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| |
| <div class="container-fluid"> |
| <table class="layout-table"> |
| <tr> |
| <td class="sidebar"> |
| <div class="well sidebar-nav"> |
| <ul class="nav nav-list"> |
| <li class="nav-header"><i class="icon-home"></i>Apache Log4j Kotlin</li> |
| <li class="none active"> |
| <a href="index.html" title="About">About</a> |
| </li> |
| <li class="none"> |
| <a href="download.html" title="Download">Download</a> |
| </li> |
| <li class="none"> |
| <a href="usage.html" title="Usage">Usage</a> |
| </li> |
| </ul> |
| <ul class="nav nav-list"> |
| <li class="nav-header"><i class="icon-pencil"></i>For Contributors</li> |
| <li class="none"> |
| <a href="build.html" title="Building Log4j Kotlin from Source">Building Log4j Kotlin from Source</a> |
| </li> |
| <li class="none"> |
| <a href="contributing.html" title="Contributing">Contributing</a> |
| </li> |
| </ul> |
| <ul class="nav nav-list"> |
| <li class="nav-header"><i class="icon-cog"></i>Component Reports</li> |
| <li class="none"> |
| <a href="log4j-api-kotlin/index.html" title="Log4j Kotlin API">Log4j Kotlin API</a> |
| </li> |
| <li class="none"> |
| <a href="log4j-api-kotlin-sample/index.html" title="Log4j Kotlin Samples">Log4j Kotlin Samples</a> |
| </li> |
| </ul> |
| <ul class="nav nav-list"> |
| <li class="nav-header"><i class="icon-info-sign"></i>Project Information</li> |
| <li class="none"> |
| <a href="dependency-convergence.html" title="Dependency Convergence">Dependency Convergence</a> |
| </li> |
| <li class="none"> |
| <a href="dependency-management.html" title="Dependency Management">Dependency Management</a> |
| </li> |
| <li class="none"> |
| <a href="team-list.html" title="Project Team">Project Team</a> |
| </li> |
| <li class="none"> |
| <a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a> |
| </li> |
| <li class="none"> |
| <a href="issue-tracking.html" title="Issue Tracking">Issue Tracking</a> |
| </li> |
| <li class="none"> |
| <a href="license.html" title="Project License">Project License</a> |
| </li> |
| <li class="none"> |
| <a href="source-repository.html" title="Source Repository">Source Repository</a> |
| </li> |
| <li class="none"> |
| <a href="project-summary.html" title="Project Summary">Project Summary</a> |
| </li> |
| </ul> |
| <ul class="nav nav-list"> |
| <li class="nav-header"><i class="icon-cog"></i>Project Reports</li> |
| <li class="none"> |
| <a href="changes-report.html" title="Changes Report">Changes Report</a> |
| </li> |
| <li class="none"> |
| <a href="jira-report.html" title="JIRA Report">JIRA Report</a> |
| </li> |
| <li class="none"> |
| <a href="rat-report.html" title="RAT Report">RAT Report</a> |
| </li> |
| </ul> |
| </div> |
| <div id="poweredBy"> |
| <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"> |
| <img class="poweredBy" alt="Built by Maven" src="./images/maven-feather.png" /> |
| </a> |
| </div> |
| </td> |
| <td class="content"> |
| <h1>Apache Log4j Kotlin API</h1> |
| <div id="toc" class="toc"> |
| <div id="toctitle">Table of Contents</div> |
| <ul class="sectlevel1"> |
| <li><a href="#usage">Usage</a> |
| <ul class="sectlevel2"> |
| <li><a href="#api_documentation">API Documentation</a></li> |
| <li><a href="#configuration">Configuration</a></li> |
| <li><a href="#substituting_parameters">Substituting Parameters</a></li> |
| <li><a href="#logger_names">Logger Names</a></li> |
| </ul> |
| </li> |
| <li><a href="#building_from_source">Building From Source</a></li> |
| <li><a href="#contributing">Contributing</a> |
| <ul class="sectlevel2"> |
| <li><a href="#getting_started">Getting Started</a></li> |
| <li><a href="#making_changes">Making Changes</a></li> |
| <li><a href="#making_trivial_changes">Making Trivial Changes</a></li> |
| <li><a href="#submitting_changes">Submitting Changes</a></li> |
| <li><a href="#additional_resources">Additional Resources</a></li> |
| </ul> |
| </li> |
| </ul> |
| </div> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Log4j Kotlin API is a <a href="https://kotlinlang.org/">Kotlin</a> logging facade based on <a href="https://logging.apache.org/log4j/2.x/">Log4j 2</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Log4j Kotlin API uses Log4j 2.x as its logging backend.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Log4j Kotlin API uses Log4j 2.x as its logging backend by default, but this can also be replaced with compatible libraries (e.g., <a href="https://logback.qos.ch/">Logback</a>).</p> |
| </div> |
| <div class="paragraph"> |
| <p>While this library is not required to use Log4j API in Kotlin, it does provide idiomatic Kotlin APIs which are friendlier to use in Kotlin programs than the Java APIs.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="usage">Usage</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Using the Kotlin API is as simple as mixing in the <a href="https://github.com/apache/logging-log4j-kotlin/blob/master/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt"><code>Logging</code></a> interface to your class. Example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">import org.apache.logging.log4j.kotlin.Logging |
| |
| class MyClass: BaseClass, Logging { |
| fun doStuff() { |
| logger.info("Doing stuff") |
| } |
| fun doStuffWithUser(user: User) { |
| logger.info { "Doing stuff with ${user.name}." } |
| } |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>Logging</code> interface can also be mixed into <code>object</code> declarations, including companions. This is generally preferable over the previous approach as there is a single logger created for every instance of the class.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">import org.apache.logging.log4j.kotlin.Logging |
| |
| class MyClass: BaseClass { |
| companion object : Logging |
| |
| ... |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Alternatively, a more traditional style can be used to instantiate a logger instance:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">import org.apache.logging.log4j.kotlin |
| |
| class MyClass: BaseClass { |
| val logger = logger() |
| |
| ... |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The function <code>logger()</code> is an extension function on the <code>Any</code> type (or more specifically, any type <code>T</code> that extends <code>Any</code>).</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="api_documentation">API Documentation</h3> |
| <div class="paragraph"> |
| <p>See <a href="https://logging.apache.org/TODO">KDocs</a>.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="configuration">Configuration</h3> |
| <div class="paragraph"> |
| <p>Log4j Kotlin API uses <a href="https://logging.apache.org/log4j/2.x/manual/configuration.html">Log4j configuration</a> by default.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This supports XML, properties files, and Java-based builders, as well as JSON and YAML with additional dependencies.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="substituting_parameters">Substituting Parameters</h3> |
| <div class="paragraph"> |
| <p>Unlike Java, Kotlin provides native functionality for <a href="https://kotlinlang.org/docs/reference/basic-syntax.html#using-string-templates">string templates</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>However, using a string template still incurs the message construction cost if the logger level is not enabled. To avoid this, prefer passing a lambda which won’t be evaluated until necessary.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">logger.debug { "Logging in user ${user.name} with birthday ${user.calcBirthday()}" }</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="logger_names">Logger Names</h3> |
| <div class="paragraph"> |
| <p>Most logging implementations use a hierarchical scheme for matching logger names with logging configuration.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In this scheme the logger name hierarchy is represented by '.' characters in the logger name, in a fashion very similar to the hierarchy used for Java/Kotlin package names.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>Logger</code> property added by the <code>Logging</code> interface follows this convention: the interface ensures the <code>Logger</code> is automatically named according to the class it is being used in.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The value returned when calling the <code>logger()</code> extension method depends on the receiver of the extension. When called within an Object as shown above, the receiver is <code>this</code> and therefore the logger will again be named according to the class it is being used in. However, a logger named via another class can be obtained as well:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">import org.apache.logging.log4j.kotlin |
| |
| class MyClass: BaseClass { |
| val logger = SomeOtherClass.logger() |
| |
| ... |
| }</code></pre> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="explicitly_named_loggers">Explicitly Named Loggers</h4> |
| <div class="paragraph"> |
| <p>An explicitly-named logger may be obtained via the <code>logger</code> function that takes a <code>name</code> parameter:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlight"><code class="language-kotlin" data-lang="kotlin">import org.apache.logging.log4j.kotlin |
| |
| class MyClass: BaseClass { |
| val logger = logger("MyCustomLoggerName") |
| |
| ... |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>This is also needed in scopes that do not have a <code>this</code> Object, such as top-level functions.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Unresolved directive in <stdin> - include::download.adoc[]</p> |
| </div> |
| <div class="paragraph"> |
| <p>Unresolved directive in <stdin> - include::changes.adoc[]</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="building_from_source">Building From Source</h2> |
| <div class="sectionbody"> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <div class="title">Note</div> |
| </td> |
| <td class="content"> |
| The following information is for developers who wish to modify Log4j Kotlin API or contribute. |
| If your goal is to add logging to your application, then you can use the <a href="build.html">pre-built binaries</a> instead. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="listingblock"> |
| <div class="title">Building</div> |
| <div class="content"> |
| <pre class="highlight"><code class="language-bash" data-lang="bash">mvn package</code></pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="contributing">Contributing</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>You have found a bug or you have an idea for a cool new feature? |
| Contributing code is a great way to give something back to the open source community. |
| Before you dig right into the code there are a few guidelines that we need contributors to follow so that we can have a chance of keeping on top of things.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="getting_started">Getting Started</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Make sure you have a <a href="https://issues.apache.org/jira/">Jira account</a>.</p> |
| </li> |
| <li> |
| <p>Make sure you have a <a href="https://github.com/signup/free">GitHub account</a>.</p> |
| </li> |
| <li> |
| <p>If you’re planning to implement a new feature it makes sense to discuss your changes on the <a href="https://logging.apache.org/log4j/2.x/mail-lists.html">dev list</a> first. |
| This way you can make sure you’re not wasting your time on something that isn’t considered to be in Apache Log4j’s scope.</p> |
| </li> |
| <li> |
| <p>Submit a ticket for your issue, assuming one does not already exist.</p> |
| </li> |
| <li> |
| <p>Clearly describe the issue including steps to reproduce when it is a bug.</p> |
| </li> |
| <li> |
| <p>Make sure you fill in the earliest version that you know has the issue.</p> |
| </li> |
| <li> |
| <p>Fork the repository on GitHub.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="making_changes">Making Changes</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Create a topic branch from where you want to base your work (this is usually the master branch).</p> |
| </li> |
| <li> |
| <p>Make commits of logical units.</p> |
| </li> |
| <li> |
| <p>Respect the original code style:</p> |
| </li> |
| <li> |
| <p>Only use spaces for indentation.</p> |
| </li> |
| <li> |
| <p>Create minimal diffs - disable on save actions like reformat source code or organize imports. |
| If you feel the source code should be reformatted create a separate PR for this change.</p> |
| </li> |
| <li> |
| <p>Check for unnecessary whitespace with <code>git diff --check</code> before committing.</p> |
| </li> |
| <li> |
| <p>Make sure your commit messages are in the proper format. |
| Your commit message should contain the key of the Jira issue.</p> |
| </li> |
| <li> |
| <p>Make sure you have added the necessary tests for your changes.</p> |
| </li> |
| <li> |
| <p>Run all the tests with <code>sbt "+ test"</code> to assure nothing else was accidentally broken.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="making_trivial_changes">Making Trivial Changes</h3> |
| <div class="paragraph"> |
| <p>For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA. |
| In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="submitting_changes">Submitting Changes</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Sign the <a href="https://www.apache.org/licenses/#clas">Contributor License Agreement</a> if you haven’t already.</p> |
| </li> |
| <li> |
| <p>Push your changes to a topic branch in your fork of the repository.</p> |
| </li> |
| <li> |
| <p>Submit a pull request to the repository in the apache organization.</p> |
| </li> |
| <li> |
| <p>Update your Jira ticket and include a link to the pull request in the ticket.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="additional_resources">Additional Resources</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="https://issues.apache.org/jira/browse/LOG4J2">Apache Log4j 2 Jira project page</a></p> |
| </li> |
| <li> |
| <p><a href="https://www.apache.org/licenses/#clas">Contributor License Agreement</a></p> |
| </li> |
| <li> |
| <p><a href="https://help.github.com/">General GitHub documentation</a></p> |
| </li> |
| <li> |
| <p><a href="https://help.github.com/send-pull-requests/">GitHub pull request documentation</a></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| |
| <div class="footer"> |
| <p>Copyright © 1999-2018 <a class="external" href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> |
| <p>Apache Logging, Apache Log4j, Log4j, Apache Log4j Audit, Log4j Audit, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p> |
| <p>Site powered by <a class="external" href="http://getbootstrap.com/">Twitter Bootstrap</a>. Icons from <a class="external" href="http://glyphicons.com/">Glyphicons Free</a>.</p> |
| </div> |
| </div> |
| </body> |
| </html> |