| //// |
| 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. |
| //// |
| |
| = Layouts |
| |
| An xref:manual/appenders.adoc[appender] uses a *layout* to encode a link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html[`LogEvent`] into a form that meets the needs of whatever will be consuming the log event. |
| This page will try to answer following questions: |
| |
| * <<concerns,What are some common concerns shared by all predefined layouts?>> |
| * <<collection,Which layouts does Log4j provide?>> |
| * <<extending,How can you create custom layouts?>> |
| |
| [#concerns] |
| == Common concerns |
| |
| This section introduces you to some common concerns shared by almost all <<collection,predefined layouts>> that you need to be aware of while using them. |
| |
| [#structured-logging] |
| === Structured logging |
| |
| include::partial$manual/structured-logging.adoc[] |
| |
| Log4j strives to provide top of the class support for structured logging. |
| To create an end-to-end experience, it provides several xref:manual/messages.adoc#collection-structured[structured message types] along with layouts supporting structured logging. |
| |
| We recommend xref:manual/json-template-layout.adoc[] for structured logging purposes. |
| |
| [#charset] |
| === Character encoding |
| |
| All <<collection,predefined layouts>> produce `String` that eventually get converted into a `byte` using the https://docs.oracle.com/javase/{java-target-version}/docs/api/java/nio/charset/Charset.html[`Charset`] configured. |
| While doing so, unless an explicit encoding configuration is stated, they use `UTF-8` by default. |
| If you want all your log events to be formatted in a certain character encoding that is different from what the employed layout defaults to, make sure to configure the layout's character encoding as needed. |
| |
| [#LocationInformation] |
| === Location information |
| |
| include::partial$manual/layouts-location-information.adoc[] |
| |
| [#collection] |
| == Collection |
| |
| Log4j bundles predefined layouts to assist in several common deployment use cases. |
| Let's start with shortcuts to most used ones: |
| |
| * Are you looking for a production-grade *JSON layout ready to be deployed to a log ingestion system* such as Elasticsearch or Google Cloud? |
| Refer to xref:manual/json-template-layout.adoc[]. |
| |
| * Are you looking for a layout that encodes log events in a *human-readable format suitable for tests and local development*? |
| Refer to xref:manual/pattern-layout.adoc[]. |
| |
| Following sections explain all predefined layouts in detail. |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-Layout[{plugin-reference-marker} Plugin reference for all `Layout` implementations] |
| |
| [#csv-layouts] |
| === [[CSVLayouts]] CSV Layouts |
| |
| There are two layouts performing https://en.wikipedia.org/wiki/Comma-separated_values[Comma Separated Value (CSV)] encoding: |
| |
| [#csv-layout-parameter] |
| ==== CSV Parameter Layout |
| |
| `CsvParameterLayout` encodes *only* the parameters of the message of a log event. |
| Generated CSV records will be composed of fields denoting the message parameters. |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-CsvParameterLayout[{plugin-reference-marker} Plugin reference for `CsvParameterLayout`] |
| |
| .Click here for examples |
| [%collapsible] |
| ==== |
| Given the following statement |
| |
| [source,java] |
| ---- |
| LOGGER.info("Record1 {} {}", "arg1", "arg2"); |
| LOGGER.error("Record2 {} {} {}", "arg3", "arg4", "arg5", throwable); |
| ---- |
| |
| `CsvParameterLayout` will output |
| |
| [source,text] |
| ---- |
| arg1,arg2 |
| arg3,arg4,arg5 |
| ---- |
| |
| The same can be achieved using link:../javadoc/log4j-api/org/apache/logging/log4j/message/ObjectArrayMessage.html[`ObjectArrayMessage`] as follows: |
| |
| [source,java] |
| ---- |
| LOGGER.info(new ObjectArrayMessage("arg1", "arg2")); |
| LOGGER.info(new ObjectArrayMessage("arg3", "arg4", "arg5")); |
| ---- |
| ==== |
| |
| [#csv-layout-log-event] |
| ==== CSV Log Event Layout |
| |
| `CsvLogEventLayout` encodes the complete log event, including the formatted message. |
| Generated CSV records will be composed of following fields in the given order: |
| |
| . Time (in nanoseconds) |
| . Time (in milliseconds) |
| . Level |
| . Thread ID |
| . Thread name |
| . Thread priority |
| . Message (formatted, hence including parameters) |
| . Logger FQCN |
| . Logger name |
| . Marker |
| . Throwable |
| . Source |
| . Thread context map |
| . Thread context stack |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-CsvLogEventLayout[{plugin-reference-marker} Plugin reference for `CsvLogEventLayout`] |
| |
| .Click here for examples |
| [%collapsible] |
| ==== |
| Given the following statement |
| |
| [source,java] |
| ---- |
| LOGGER.debug("one={}, two={}, three={}", 1, 2, 3); |
| ---- |
| |
| `CsvLogEventLayout` will output |
| |
| [source,text] |
| ---- |
| 0,1441617184044,DEBUG,main,"one=1, two=2, three=3",org.apache.logging.log4j.spi.AbstractLogger,,,,org.apache.logging.log4j.core.layout.CsvLogEventLayoutTest.testLayout(CsvLogEventLayoutTest.java:98),{},[] |
| ---- |
| ==== |
| |
| [#csv-layout-config] |
| ==== Configuration |
| |
| Both `CsvParameterLayout` and `CsvLogEventLayout` are configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter |
| |Type |
| |Description |
| |
| |format |
| |String |
| |A predefined format name (`Default`, `Excel`, `MySQL`, `RFC4180`, `TDF`, etc.) accepted by https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVFormat.html[`CSVFormat`] |
| |
| |delimiter |
| |Character |
| |The field delimiter character |
| |
| |escape |
| |Character |
| |The escape character |
| |
| |quote |
| |Character |
| |The quote character |
| |
| |quoteMode |
| |String |
| |A quote mode name (`ALL`, `ALL_NONE_NULL`, `MINIMAL`, `NON_NUMERIC`, `NONE`, etc.) accepted by https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/QuoteMode.html[`QuoteMode`] |
| |
| |nullString |
| |String |
| |The string to denote `null` values |
| |
| |recordSeparator |
| |String |
| |The record separator string |
| |
| |charset |
| |Charset |
| |The character encoding |
| |
| |header |
| |String |
| |The header to include when the stream is opened |
| |
| |footer |
| |String |
| |The footer to include when the stream is closed |
| |=== |
| |
| Additional runtime dependencies are required for using CSV layouts: |
| |
| include::partial$features/layout-csv.adoc[] |
| |
| [#GELFLayout] |
| === GELF Layout |
| |
| `GelfLayout` encodes log events in https://go2docs.graylog.org/current/getting_in_log_data/gelf.html#GELFPayloadSpecification[the GELF specification] version `1.1`. |
| It can compress the output when it exceeds a certain threshold. |
| This layout does not implement chunking. |
| |
| [WARNING] |
| ==== |
| *This layout is planned to be removed in the next major release!* |
| Unless compression is needed, we advise you to use xref:manual/json-template-layout.adoc[JSON Template Layout] instead, which provides GELF Layout support out of the box and offers more capabilities and performance. |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-GelfLayout[{plugin-reference-marker} Plugin reference for `GelfLayout`] |
| |
| GELF Layout is configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter |
| |Type |
| |Description |
| |
| |additionalFields |
| |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[KeyValuePair[\]] |
| |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[`KeyValuePair`] elements denoting additional entries. |
| Entry values can contain xref:manual/lookups.adoc[] using `${` syntax. |
| |
| |compressionThreshold |
| |int |
| |Triggers compression if the output is larger than this number of bytes (optional, defaults to 1024) |
| |
| |compressionType |
| |String |
| |The compression to use. |
| It is optional, and defaults to `GZIP`. |
| Accepted values are `GZIP`, `ZLIB`, or `OFF`. |
| |
| |host |
| |String |
| |The value of the `host` property (optional, defaults to the local host name) |
| |
| |includeMapMessage |
| |boolean |
| |Whether to include fields from xref:manual/messages.adoc#MapMessage[`MapMessage`]s as additional fields (optional, defaults to `true`) |
| |
| |includeNullDelimiter |
| |boolean |
| |Whether to include `NULL` byte as delimiter after each event. |
| Optional and defaults to `false`. |
| Useful for Graylog GELF TCP input. |
| Cannot be used with compression. |
| |
| |includeStacktrace |
| |boolean |
| |Whether to include full stacktrace of logged ``Throwable``s. |
| Optional and defaults to `true`. |
| If set to `false`, only the class name and message of the `Throwable` will be included. |
| |
| |includeThreadContext |
| |boolean |
| |Whether to include thread context as additional fields (optional, defaults to `true`) |
| |
| |mapMessageExcludes |
| |String |
| |A comma separated list of attributes from the xref:manual/messages.adoc#MapMessage[`MapMessage`] to exclude when formatting the event. |
| This attribute only applies when `includeMapMessage` is `true`. |
| If `mapMessageIncludes` are also specified, this attribute will be ignored. |
| |
| |mapMessageIncludes |
| |String |
| |A comma separated list of attributes from the xref:manual/messages.adoc#MapMessage[`MapMessage`] to include when formatting the event. |
| This attribute only applies when `includeMapMessage` is `true`. |
| If `mapMessageExcludes` are also specified, this attribute will override them. |
| `MapMessage` fields specified here that have no value will be omitted. |
| |
| |mapPrefix |
| |String |
| |A string to prepend to all elements of the xref:manual/messages.adoc#MapMessage[`MapMessage`] when rendered as a field (optional, defaults to an empty string) |
| |
| |[[GELFLayout-messagePattern]] messagePattern |
| |String |
| |The pattern to use to format the `String`. |
| A `messagePattern` and <<GELFLayout-patternSelector,`patternSelector`>> cannot both be specified. |
| If both are present, the message pattern will be ignored and an error will be logged. |
| If not supplied, only the text derived from the log message will be used. |
| See xref:manual/pattern-layout.adoc[] for information on the pattern strings. |
| |
| |omitEmptyFields |
| |boolean |
| |If `true`, fields which are null or are zero-length strings will not be included as a field in the produced JSON. |
| This setting will not affect if those fields appear in the message fields. |
| The default value is `false`. |
| |
| |[[GELFLayout-patternSelector]] patternSelector |
| |xref:manual/pattern-layout.adoc#plugin-element-PatternSelector[PatternSelector] |
| |The `PatternSelector` to use to format the `String`. |
| A <<GELFLayout-messagePattern,`messagePattern`>> and `patternSelector` cannot both be specified. |
| If both are present, the message pattern will be ignored and an error will be logged. |
| If not supplied, only the text derived from the logging message will be used. |
| See xref:manual/pattern-layout.adoc#plugin-element-PatternSelector[`PatternSelector`] for information on how to specify a `PatternSelector`. |
| See xref:manual/pattern-layout.adoc[] for information on the pattern strings. |
| |
| |threadContextExcludes |
| |String |
| |A comma separated list of xref:manual/thread-context.adoc[] map keys to exclude when formatting the event. |
| This attribute only applies when `includeThreadContext` is `true`. |
| If `threadContextIncludes` are also specified, this attribute will be ignored. |
| |
| |threadContextIncludes |
| |String |
| |A comma separated list of xref:manual/thread-context.adoc[] map keys to include when formatting the event. |
| This attribute only applies when `includeThreadContext` is `true`. |
| If `threadContextExcludes` are also, specified this attribute will override them. |
| Thread context fields specified here that have no value will be omitted. |
| |
| |threadContextPrefix |
| |String |
| |A string to prepend to all elements of the xref:manual/thread-context.adoc[] map when rendered as a field (defaults to an empty string) |
| |=== |
| |
| GELF Layout is garbage-free if `compressionType` is `OFF` and there are no additional fields containing `${`. |
| |
| .Example configurations |
| [%collapsible] |
| ==== |
| [tabs] |
| ===== |
| XML:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/gelf-layout/log4j2.xml[`log4j2.xml`] |
| [source,xml] |
| ---- |
| include::example$manual/gelf-layout/log4j2.xml[lines=26..41,indent=0] |
| ---- |
| |
| JSON:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/gelf-layout/log4j2.json[`log4j2.json`] |
| [source,json] |
| ---- |
| include::example$manual/gelf-layout/log4j2.json[lines=5..48,indent=0] |
| ---- |
| |
| YAML:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/gelf-layout/log4j2.yaml[`log4j2.yaml`] |
| [source,xml] |
| ---- |
| include::example$manual/gelf-layout/log4j2.yaml[lines=21..53,indent=0] |
| ---- |
| |
| Properties:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/gelf-layout/log4j2.properties[`log4j2.properties`] |
| [source,xml] |
| ---- |
| include::example$manual/gelf-layout/log4j2.properties[lines=17..48,indent=0] |
| ---- |
| ===== |
| |
| <1> Configuration with additional key value pairs |
| <2> Configuration for appending to a Graylog server using TCP |
| <3> Configuration for appending to a Graylog server using UDP |
| ==== |
| |
| [#HTMLLayout] |
| === HTML Layout |
| |
| `HtmlLayout` generates an HTML page, and adds each log event to a row in a table. |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-HtmlLayout[{plugin-reference-marker} Plugin reference for `HtmlLayout`] |
| |
| It is configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter |
| |Type |
| |Description |
| |
| |charset |
| |String |
| |The character encoding |
| |
| |contentType |
| |String |
| |The `Content-Type` header value (defaults to `text/html`) |
| |
| |datePattern |
| |String |
| |The date format of the log event. |
| The default is `JVM_ELAPSE_TIME`, which outputs the milliseconds since JVM started. |
| For other valid values, refer to xref:manual/pattern-layout.adoc#converter-date[the `date` conversion specifier of Pattern Layout]. |
| |
| |fontName |
| |String |
| |The `font-family` (defaults to `arial,sans-serif`) |
| |
| |fontSize |
| |String |
| |The `font size` (defaults to `small`) |
| |
| |locationInfo |
| |boolean |
| |If `true`, the <<LocationInformation,source location information>> be included (defaults to `false`) |
| |
| |timezone |
| |String |
| |The time zone ID of the log event. |
| If not specified, this layout uses the https://docs.oracle.com/javase/{java-target-version}/docs/api/java/util/TimeZone.html#getDefault()[`TimeZone.getDefault()`] as the default. |
| You can use time zone IDs supported by https://docs.oracle.com/javase/{java-target-version}/docs/api/java/util/TimeZone.html#getTimeZone(java.lang.String)[`TimeZone.getTimeZone(String)`]. |
| |
| |title |
| |String |
| |The HTML page title |
| |=== |
| |
| [[JSONLayout]] |
| === JSON Layout |
| |
| `JsonLayout` encodes a log event into JSON. |
| |
| [WARNING] |
| ==== |
| JSON Layout is considered deprecated. |
| It is succeeded by <<JSONTemplateLayout>> providing more capabilities and efficiency. |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-JsonLayout[{plugin-reference-marker} Plugin reference for `JsonLayout`] |
| |
| .Click for an example output |
| [%collapsible] |
| ==== |
| [source,json] |
| ---- |
| { |
| "instant": { |
| "epochSecond": 1493121664, |
| "nanoOfSecond": 118000000 |
| }, |
| "thread": "main", |
| "level": "INFO", |
| "loggerName": "HelloWorld", |
| "marker": { |
| "name": "child", |
| "parents": [ |
| { |
| "name": "parent", |
| "parents": [ |
| { |
| "name": "grandparent" |
| } |
| ] |
| } |
| ] |
| }, |
| "message": "Hello, world!", |
| "thrown": { |
| "commonElementCount": 0, |
| "message": "error message", |
| "name": "java.lang.RuntimeException", |
| "extendedStackTrace": [ |
| { |
| "class": "logtest.Main", |
| "method": "main", |
| "file": "Main.java", |
| "line": 29, |
| "exact": true, |
| "location": "classes/", |
| "version": "?" |
| } |
| ] |
| }, |
| "contextStack": ["one", "two"], |
| "endOfBatch": false, |
| "loggerFqcn": "org.apache.logging.log4j.spi.AbstractLogger", |
| "contextMap": { |
| "bar": "BAR", |
| "foo": "FOO" |
| }, |
| "threadId": 1, |
| "threadPriority": 5, |
| "source": { |
| "class": "logtest.Main", |
| "method": "main", |
| "file": "Main.java", |
| "line": 29 |
| } |
| } |
| ---- |
| ==== |
| |
| JSON Layout is configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter Name |
| |Type |
| |Description |
| |
| |additionalFields |
| |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[KeyValuePair[\]] |
| |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[`KeyValuePair`] elements denoting additional entries. |
| Entry values can contain xref:manual/lookups.adoc[] using `${` syntax. |
| |
| |charset |
| |String |
| |The character encoding (defaults to `UTF-8`) |
| |
| |compact |
| |boolean |
| |If `true`, does not use `endOfLine` and indentation. |
| This feature is also referred to as _pretty-printing_ too. |
| It defaults to `false`. |
| |
| |complete |
| |boolean |
| | |
| If `true`, uses `header` and `footer`, and places comma between records – this leads to a well-formed JSON document given `header` and `footer` defaults to `[` and `]`, respectively. |
| It defaults to `false`. |
| |
| |endOfLine |
| |String |
| |If set, overrides the default end-of-line string. |
| For instance, set it to `\n` and use with `eventEol=true` and `compact=true` to have one record per line separated by `\n` instead of `\r\n`. |
| It is not set by default. |
| |
| |eventEol |
| |boolean |
| |If `true`, appends an `endOfLine` after each log event, even if `compact=true`. |
| It defaults to `false`. |
| Use with `eventEol=true` and `compact=true` to get one record per line. |
| |
| |footer |
| |String |
| |The footer to include when the stream is closed and `complete=true` (defaults to `]`) |
| |
| |header |
| |String |
| |The header to include when the stream is opened and `complete=true` (defaults to `[`) |
| |
| |includeNullDelimiter |
| |boolean |
| |If `true`, a NULL byte will suffix each encoded log event (defaults to `false`) |
| |
| |includeStacktrace |
| |boolean |
| |If `true`, include full stacktrace of any logged `Throwable` (defaults to `true`) |
| |
| |includeTimeMillis |
| |boolean |
| |If `true`, a `timeMillis` attribute is included in the JSON payload instead of the `instant`. |
| `timeMillis` will contain the number of milliseconds since 1970-01-01T00:00:00Z. |
| |
| |locationInfo |
| |boolean |
| |If `true`, the appender includes the <<LocationInformation,source location information>> in the generated JSON (defaults to `false`) |
| |
| |objectMessageAsJsonObject |
| |boolean |
| |If `true`, xref:manual/messages.adoc#ObjectMessage[`ObjectMessage`] is serialized as JSON object to the `message` field of the output log (defaults to `false`) |
| |
| |properties |
| |boolean |
| |If `true`, the appender includes the xref:manual/thread-context.adoc[] map in the generated JSON (defaults to `false`) |
| |
| |propertiesAsList |
| |boolean |
| |If `true`, the xref:manual/thread-context.adoc[] map is included as a list of map entry objects, where each entry is denoted as a JSON object containg `key` and `value` fields. |
| It defaults to `false`, in which case the thread context map is included as a simple map of key-value pairs. |
| |
| |stacktraceAsString |
| |boolean |
| |If `true`, the stacktrace will be formatted as `String`, and not a nested object (optional, defaults to `false`) |
| |=== |
| |
| Additional runtime dependencies are required for using JSON Layout: |
| |
| [tabs] |
| ==== |
| Maven:: |
| + |
| [source,xml,subs="+attributes"] |
| ---- |
| <dependency> |
| <groupId>com.fasterxml.jackson.core</groupId> |
| <artifactId>jackson-databind</artifactId> |
| <version>{jackson-version}</version> |
| <scope>runtime</scope> |
| </dependency> |
| ---- |
| |
| Gradle:: |
| + |
| [source,groovy,subs="+attributes"] |
| ---- |
| runtimeOnly 'com.fasterxml.jackson.core:jackson-databind:{jackson-version}' |
| ---- |
| ==== |
| |
| [#JSONTemplateLayout] |
| === JSON Template Layout |
| |
| `JsonTemplateLayout` is a customizable, efficient, and garbage-free JSON generating layout. |
| It encodes ``LogEvent``s according to the structure described by the JSON template provided. |
| |
| For instance, given the following event template stored in `MyLayout.json` in your classpath: |
| |
| [source,json] |
| ---- |
| { |
| "instant": { // <1> |
| "$resolver": "timestamp", |
| "pattern": { |
| "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", |
| "timeZone": "UTC" |
| } |
| }, |
| "someConstant": 1, // <2> |
| "message": { // <3> |
| "$resolver": "message", |
| "stringified": true |
| } |
| } |
| ---- |
| |
| <1> Using the `timestamp` event template resolver to populate the `instant` field |
| <2> Passing a constant that will be rendered as is |
| <3> Using the `message` event template resolver to populate the `message` field |
| |
| in combination with the below layout configuration: |
| |
| [tabs] |
| ==== |
| XML:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.xml[`log4j2.xml`] |
| [source,xml] |
| ---- |
| include::example$manual/json-template-layout/usage/log4j2.xml[lines=26..26,indent=0] |
| ---- |
| |
| JSON:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.json[`log4j2.json`] |
| [source,json] |
| ---- |
| include::example$manual/json-template-layout/usage/log4j2.json[lines=6..8,indent=0] |
| ---- |
| |
| YAML:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.yaml[`log4j2.yaml`] |
| [source,xml] |
| ---- |
| include::example$manual/json-template-layout/usage/log4j2.yaml[lines=22..23,indent=0] |
| ---- |
| |
| Properties:: |
| + |
| .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.properties[`log4j2.properties`] |
| [source,xml] |
| ---- |
| include::example$manual/json-template-layout/usage/log4j2.properties[lines=19..20,indent=0] |
| ---- |
| ==== |
| |
| JSON Template Layout generates JSON as follows: |
| |
| [source,json] |
| ---- |
| {"instant":"2017-05-25T19:56:23.370Z","someConstant":1,"message":"Hello, error!"} //<1> |
| ---- |
| |
| <1> JSON pretty-printing is not supported for performance reasons. |
| |
| Good news is JSON Template Layout is perfectly production-ready without any configuration! |
| It bundles several predefined event templates modeling popular JSON-based log formats. |
| |
| Read more on xref:manual/json-template-layout.adoc[]... |
| |
| [#MessageLayout] |
| === Message Layout |
| |
| `MessageLayout` is a special layout that extracts the |
| xref:manual/messages.adoc[`Message`] |
| contained in a log event. |
| It is currently only useful with the |
| xref:manual/appenders/database.adoc#JdbcAppender[JDBC Appender]. |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-MessageLayout[{plugin-reference-marker} Plugin reference for `MessageLayout`] |
| |
| [id=pattern-layout] |
| === [[PatternLayout]] Pattern Layout |
| |
| `PatternLayout` is a customizable, efficient, garbage-free, and human-readable string generating layout using a user-provided pattern. |
| It is analogous to `String#format()` with specialized directives on injecting certain properties of a `LogEvent`. |
| |
| [IMPORTANT] |
| ==== |
| Pattern Layout is not intended for _structural logging_ purposes. |
| For production environments, you are strongly advised to use xref:manual/json-template-layout.adoc[] producing JSON output ready to be delivered to log ingestion systems such as Elasticsearch or Google Cloud Logging. |
| ==== |
| |
| A conversion pattern is composed of literal text and format control expressions. |
| For instance, given the `%-5p [%t]: %m%n` pattern, following statements |
| |
| [source,java] |
| ---- |
| LOGGER.debug("Message 1"); |
| LOGGER.warn("Message 2"); |
| ---- |
| |
| will yield the output |
| |
| [source,text] |
| ---- |
| DEBUG [main]: Message 1 |
| WARN [main]: Message 2 |
| ---- |
| |
| Read more on xref:manual/pattern-layout.adoc[]... |
| |
| [#RFC5424Layout] |
| === RFC 5424 Layout |
| |
| `Rfc5424` Layout encodes log events according to https://datatracker.ietf.org/doc/html/rfc5424#section-6[the Syslog message format described in RFC 5424]. |
| |
| [NOTE] |
| ==== |
| RFC 5424 obsoletes RFC 3164, implemented by <<SyslogLayout>>. |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-Rfc5424Layout[{plugin-reference-marker} Plugin reference for `Rfc5424Layout`] |
| |
| RFC 5424 Layout is configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter |
| |Type |
| |Description |
| |
| |appName |
| |String |
| |The `APP-NAME` field as described in RFC 5424 |
| |
| |charset |
| |String |
| |The character encoding (defaults to `UTF-8`) |
| |
| |enterpriseNumber |
| |integer |
| | |
| The `enterpriseId` parameter as described in RFC 5424. |
| If missing, `32473` will be used, which is https://www.rfc-editor.org/rfc/rfc5612.html#section-2[reserved for documentation use]. |
| |
| |exceptionPattern |
| |String |
| |An xref:manual/pattern-layout.adoc#converter-exception[`exception` conversion specifier of Pattern Layout]. |
| The default is to not include the `Throwable` from the event, if any, in the output. |
| |
| |facility |
| |String |
| |The name of link:../javadoc/log4j-core/org/apache/logging/log4j/core/net/Facility.html[`Facility`] as described in RFC 5424. |
| The matching is case-insensitive. |
| It defaults to `LOCAL0`. |
| |
| |id |
| |String |
| |The default _Structured Data ID_ to use when formatting according to RFC 5424. |
| If the log event contains a xref:manual/messages.adoc#StructuredDataMessage[`StructuredDataMessage`], the ID from that message will be used instead. |
| |
| |includeMDC |
| |boolean |
| |Indicates whether data from the xref:manual/thread-context.adoc[] map will be included in the RFC 5424 Syslog record (defaults to `true`) |
| |
| |loggerFields |
| |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[KeyValuePair[\]] |
| |Allows arbitrary xref:manual/thread-context.adoc[] map entries. |
| To use, include a `LoggerFields` nested element, containing one or more `KeyValuePair` elements. |
| Each `KeyValuePair` must have `key` and `value` attributes associating them with a thread context map entry. |
| The `value` attribute can be an arbitrary xref:manual/pattern-layout.adoc[] pattern. |
| |
| |mdcExcludes |
| |String |
| |A comma-separated list of xref:manual/thread-context.adoc[] map (aka, MDC) keys that should be excluded. |
| This is mutually exclusive with `mdcIncludes`. |
| This attribute only applies to RFC 5424 Syslog records. |
| |
| |mdcIncludes |
| |String |
| |A comma-separated list of xref:manual/thread-context.adoc[] map (aka, MDC) keys that should be included. |
| Any keys in the thread context map not found in the list will be excluded. |
| This option is mutually exclusive with `mdcExcludes`. |
| This attribute only applies to RFC 5424 Syslog records. |
| |
| |mdcId |
| |String |
| |The ID to use for the xref:manual/thread-context.adoc[] map (aka, MDC) Structured Data Element. |
| It defaults to `mdc`. |
| This attribute only applies to RFC 5424 Syslog records. |
| |
| |mdcPrefix |
| |String |
| |A string to be prepended to each xref:manual/thread-context.adoc[] map (aka, MDC) key to distinguish it from event attributes. |
| It defaults to `mdc:`. |
| This attribute only applies to RFC 5424 Syslog records. |
| |
| |mdcRequired |
| |String |
| |A comma-separated list of xref:manual/thread-context.adoc[] map (aka, MDC) keys that must be present. |
| If a key is not present, a |
| link:../javadoc/log4j-api/org/apache/logging/log4j/LoggingException.html[`LoggingException`] |
| will be thrown. |
| This attribute only applies to RFC 5424 Syslog records. |
| |
| |messageId |
| |String |
| |The default value to be used in the `MSGID` field of RFC 5424 Syslog records |
| |
| |newLine |
| |boolean |
| |If `true`, a `\n` character will be appended to the end of the Syslog record (defaults to `false`) |
| |
| |newLineEscape |
| |String |
| |The string that should be used to replace newlines within the message text |
| |=== |
| |
| RFC 5424 Layout has specialized handling for xref:manual/messages.adoc#StructuredDataMessage[`StructuredDataMessage`]s. |
| By combining two, users can have complete control on how their message is encoded in a way compliant with RFC 5424, while RFC 5424 Layout will make sure the rest of the information attached to the log event is properly injected. |
| |
| [#SerializedLayout] |
| === Serialized Layout |
| |
| `SerializedLayout` encodes a log event using https://docs.oracle.com/javase/{java-target-version}/docs/platform/serialization/spec/protocol.html[Java Serialization]. |
| It accepts no configuration parameters. |
| |
| [WARNING] |
| ==== |
| This layout has been deprecated since version `2.9`. |
| Java Serialization has inherent security weaknesses. |
| *Serialized Layout users are strongly advised to migrate to another layout!* |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-SerializedLayout[{plugin-reference-marker} Plugin reference for `SerializedLayout`] |
| |
| [#SyslogLayout] |
| === Syslog Layout |
| |
| `SyslogLayout` encodes log events according to https://datatracker.ietf.org/doc/html/rfc3164#section-4.1[the syslog message format described in RFC 3164]. |
| This matches the same format used by {logging-services-url}/log4j/1.x/index.html[Log4j 1]. |
| |
| [IMPORTANT] |
| ==== |
| RFC 3164, implemented by Syslog Layout, is obsoleted by RFC 5424, implemented by <<RFC5424Layout>>. |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-SyslogLayout[{plugin-reference-marker} Plugin reference for `SyslogLayout`] |
| |
| Syslog Layout is configured with the following parameters: |
| |
| [%header,cols="1m,1m,4"] |
| |=== |
| |Parameter |
| |Type |
| |Description |
| |
| |charset |
| |String |
| |The character encoding (defaults to `UTF-8`) |
| |
| |facility |
| |String |
| |The name of link:../javadoc/log4j-core/org/apache/logging/log4j/core/net/Facility.html[`Facility`] as described in RFC 5424. |
| The matching is case-insensitive. |
| It defaults to `LOCAL0`. |
| |
| |newLine |
| |boolean |
| |If `true`, a `\n` character will be appended to the end of the Syslog record (defaults to `false`) |
| |
| |newLineEscape |
| |String |
| |The string that should be used to replace newlines within the message text |
| |=== |
| |
| [[XMLLayout]] |
| === XML Layout |
| |
| `XmlLayout` encodes a log event into XML. |
| |
| [WARNING] |
| ==== |
| *This layout is planned to be removed in the next major release!* |
| XML Layout users are strongly advised to migrate to another layout! |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-XmlLayout[{plugin-reference-marker} Plugin reference for `XmlLayout`] |
| |
| .Click for an example output |
| [%collapsible] |
| ==== |
| [source,xml] |
| ---- |
| <Event xmlns="https://logging.apache.org/log4j/2.0/events" |
| level="INFO" |
| loggerName="HelloWorld" |
| endOfBatch="false" |
| thread="main" |
| loggerFqcn="org.apache.logging.log4j.spi.AbstractLogger" |
| threadId="1" |
| threadPriority="5"> |
| <Instant epochSecond="1493121664" nanoOfSecond="118000000"/> |
| <Marker name="child"> |
| <Parents> |
| <Marker name="parent"> |
| <Parents> |
| <Marker name="grandparent"/> |
| </Parents> |
| </Marker> |
| </Parents> |
| </Marker> |
| <Message>Hello, world!</Message> |
| <ContextMap> |
| <item key="bar" value="BAR"/> |
| <item key="foo" value="FOO"/> |
| </ContextMap> |
| <ContextStack> |
| <ContextStackItem>one</ContextStackItem> |
| <ContextStackItem>two</ContextStackItem> |
| </ContextStack> |
| <Source |
| class="logtest.Main" |
| method="main" |
| file="Main.java" |
| line="29"/> |
| <Thrown commonElementCount="0" message="error message" name="java.lang.RuntimeException"> |
| <ExtendedStackTrace> |
| <ExtendedStackTraceItem |
| class="logtest.Main" |
| method="main" |
| file="Main.java" |
| line="29" |
| exact="true" |
| location="classes/" |
| version="?"/> |
| </ExtendedStackTrace> |
| </Thrown> |
| </Event> |
| ---- |
| ==== |
| |
| XML Layout configuration is identical to the one of <<JSONLayout>>, with following exceptions: |
| |
| * The `header` and `footer` parameters are discarded |
| * If `complete=true`, each log event will be encoded into a well-formed XML document, such that: |
| ** `<?xml version...` preamble will be added |
| ** The root `<event` element will be enriched with `namespace="http://logging.apache.org/log4j/2.0/events"` attribute |
| |
| Additional runtime dependencies are required for using XML Layout: |
| |
| [tabs] |
| ==== |
| Maven:: |
| + |
| [source,xml,subs="+attributes"] |
| ---- |
| <dependency> |
| <groupId>com.fasterxml.jackson.dataformat</groupId> |
| <artifactId>jackson-dataformat-xml</artifactId> |
| <version>{jackson-version}</version> |
| <scope>runtime</scope> |
| </dependency> |
| ---- |
| |
| Gradle:: |
| + |
| [source,groovy,subs="+attributes"] |
| ---- |
| runtimeOnly 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:{jackson-version}' |
| ---- |
| ==== |
| |
| [[YamlLayout]] |
| === YAML Layout |
| |
| `YamlLayout` encodes a log event into YAML. |
| |
| [WARNING] |
| ==== |
| This layout is planned to be removed in the next major release! |
| |
| YAML is a superset of JSON. |
| *We strongly advise existing YAML Layout users to migrate to <<JSONTemplateLayout>>* providing more capabilities and efficiency. |
| ==== |
| |
| xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-YamlLayout[{plugin-reference-marker} Plugin reference for `YamlLayout`] |
| |
| .Click for an example output |
| [%collapsible] |
| ==== |
| [source,yaml] |
| ---- |
| instant: |
| epochSecond: 1493121664 |
| nanoOfSecond: 118000000 |
| thread: "main" |
| level: "INFO" |
| loggerName: "HelloWorld" |
| marker: |
| name: "child" |
| parents: |
| - name: "parent" |
| parents: |
| - name: "grandparent" |
| message: "Hello, world!" |
| thrown: |
| commonElementCount: 0 |
| message: "error message" |
| name: "java.lang.RuntimeException" |
| extendedStackTrace: |
| - class: "logtest.Main" |
| method: "main" |
| file: "Main.java" |
| line: 29 |
| exact: true |
| location: "classes/" |
| version: "?" |
| contextStack: |
| - "one" |
| - "two" |
| endOfBatch: false |
| loggerFqcn: "org.apache.logging.log4j.spi.AbstractLogger" |
| contextMap: |
| bar: "BAR" |
| foo: "FOO" |
| threadId: 1 |
| threadPriority: 5 |
| source: |
| class: "logtest.Main" |
| method: "main" |
| file: "Main.java" |
| line: 29 |
| ---- |
| ==== |
| |
| YAML Layout configuration is identical to the one of <<JSONLayout>>, with following exceptions: |
| |
| * The `header` defaults to an empty string |
| * The `footer` defaults to an empty string |
| |
| Additional runtime dependencies are required for using XML Layout: |
| |
| [tabs] |
| ==== |
| Maven:: |
| + |
| [source,xml,subs="+attributes"] |
| ---- |
| <dependency> |
| <groupId>com.fasterxml.jackson.dataformat</groupId> |
| <artifactId>jackson-dataformat-yaml</artifactId> |
| <version>{jackson-version}</version> |
| <scope>runtime</scope> |
| </dependency> |
| ---- |
| |
| Gradle:: |
| + |
| [source,groovy,subs="+attributes"] |
| ---- |
| runtimeOnly 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:{jackson-version}' |
| ---- |
| ==== |
| |
| [#extending] |
| == Extending |
| |
| Layouts are xref:manual/plugins.adoc[plugins] implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html[the `Layout` interface]. |
| This section will guide you on how to create custom ones. |
| |
| [NOTE] |
| ==== |
| While <<collection,the predefined layout collection>> should address most common use cases, you might find yourself needing to implement a custom one. |
| If this is the case, we really appreciate it if you can *share your use case in a {logging-services-url}/support.html[user support channel]*. |
| ==== |
| |
| [#extending-plugins] |
| === Plugin preliminaries |
| |
| include::partial$manual/plugin-preliminaries.adoc[] |
| |
| [#extending-layouts] |
| === Extending layouts |
| |
| Layouts are xref:manual/plugins.adoc[plugins] implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html[the `Layout` interface]. |
| If your layout is a `String`-based one, we recommend you to extend your plugin class from link:../javadoc/log4j-core/org/apache/logging/log4j/core/layout/AbstractStringLayout.html[`AbstractStringLayout`], which contains convenience for some of the boilerplate code shared by `String`-based layouts. |
| While annotating your layout with `@Plugin`, you need to make sure that |
| |
| * It has a unique `name` attribute across all available `Layout` plugins |
| * The `category` attribute is set to link:../javadoc/log4j-core/org/apache/logging/log4j/core/config/Node.html#CATEGORY[`Node.CATEGORY`] |
| |
| You can check out following files for examples: |
| |
| * {project-github-url}/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java[`SyslogLayout.java`] – simple, single-file, extending from `AbstractStringLayout` |
| * {project-github-url}/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java[`JsonTemplateLayout.java`] – advanced, using plugins for composing several of its features, contains _recycler_ concept for xref:manual/garbagefree.adoc[garbage-free] operation, extends from link:../javadoc/log4j-core/org/apache/logging/log4j/core/StringLayout.html[`StringLayout`] |