168 lines
6.2 KiB
Markdown
168 lines
6.2 KiB
Markdown
* Dependency the toolkit, such as using maven or gradle
|
|
```xml
|
|
<dependency>
|
|
<groupId>org.apache.skywalking</groupId>
|
|
<artifactId>apm-toolkit-log4j-2.x</artifactId>
|
|
<version>{project.release.version}</version>
|
|
</dependency>
|
|
```
|
|
|
|
# Print trace ID in your logs
|
|
|
|
* Config the `[%traceId]` pattern in your log4j2.xml
|
|
```xml
|
|
<Appenders>
|
|
<Console name="Console" target="SYSTEM_OUT">
|
|
<PatternLayout pattern="%d [%traceId] %-5p %c{1}:%L - %m%n"/>
|
|
</Console>
|
|
</Appenders>
|
|
```
|
|
|
|
* Support log4j2 AsyncRoot , No additional configuration is required. Refer to the demo of log4j2.xml below. For details: [Log4j2 Async Loggers](https://logging.apache.org/log4j/2.x/manual/async.html)
|
|
```xml
|
|
<Configuration>
|
|
<Appenders>
|
|
<Console name="Console" target="SYSTEM_OUT">
|
|
<PatternLayout pattern="%d [%traceId] %-5p %c{1}:%L - %m%n"/>
|
|
</Console>
|
|
</Appenders>
|
|
<Loggers>
|
|
<AsyncRoot level="INFO">
|
|
<AppenderRef ref="Console"/>
|
|
</AsyncRoot>
|
|
</Loggers>
|
|
</Configuration>
|
|
```
|
|
* Support log4j2 AsyncAppender , No additional configuration is required. Refer to the demo of log4j2.xml below.
|
|
|
|
For details: [All Loggers Async](https://logging.apache.org/log4j/2.x/manual/async.html#AllAsync)
|
|
|
|
Log4j-2.9 and higher require disruptor-3.3.4.jar or higher on the classpath. Prior to Log4j-2.9, disruptor-3.0.0.jar or higher was required.
|
|
This is simplest to configure and gives the best performance. To make all loggers asynchronous, add the disruptor jar to the classpath and
|
|
set the system property `log4j2.contextSelector` to `org.apache.logging.log4j.core.async.AsyncLoggerContextSelector`.
|
|
```xml
|
|
<Configuration status="WARN">
|
|
<Appenders>
|
|
<!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
|
|
<RandomAccessFile name="RandomAccessFile" fileName="async.log" immediateFlush="false" append="false">
|
|
<PatternLayout>
|
|
<Pattern>%d %p %c{1.} [%t] [%traceId] %m %ex%n</Pattern>
|
|
</PatternLayout>
|
|
</RandomAccessFile>
|
|
</Appenders>
|
|
<Loggers>
|
|
<Root level="info" includeLocation="false">
|
|
<AppenderRef ref="RandomAccessFile"/>
|
|
</Root>
|
|
</Loggers>
|
|
</Configuration>
|
|
```
|
|
For details: [Mixed Sync & Async](https://logging.apache.org/log4j/2.x/manual/async.html#MixedSync-Async)
|
|
|
|
Log4j-2.9 and higher require disruptor-3.3.4.jar or higher on the classpath. Prior to Log4j-2.9, disruptor-3.0.0.jar or higher was required.
|
|
There is no need to set system property `Log4jContextSelector` to any value.
|
|
|
|
```xml
|
|
<Configuration status="WARN">
|
|
<Appenders>
|
|
<!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
|
|
<RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"
|
|
immediateFlush="false" append="false">
|
|
<PatternLayout>
|
|
<Pattern>%d %p %class{1.} [%t] [%traceId] %location %m %ex%n</Pattern>
|
|
</PatternLayout>
|
|
</RandomAccessFile>
|
|
</Appenders>
|
|
<Loggers>
|
|
<!-- pattern layout actually uses location, so we need to include it -->
|
|
<AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
|
|
<AppenderRef ref="RandomAccessFile"/>
|
|
</AsyncLogger>
|
|
<Root level="info" includeLocation="true">
|
|
<AppenderRef ref="RandomAccessFile"/>
|
|
</Root>
|
|
</Loggers>
|
|
</Configuration>
|
|
```
|
|
* Support log4j2 AsyncAppender, For details: [Log4j2 AsyncAppender](https://logging.apache.org/log4j/2.x/manual/appenders.html)
|
|
```xml
|
|
<Configuration>
|
|
<Appenders>
|
|
<Console name="Console" target="SYSTEM_OUT">
|
|
<PatternLayout pattern="%d [%traceId] %-5p %c{1}:%L - %m%n"/>
|
|
</Console>
|
|
<Async name="Async">
|
|
<AppenderRef ref="Console"/>
|
|
</Async>
|
|
</Appenders>
|
|
<Loggers>
|
|
<Root level="INFO">
|
|
<AppenderRef ref="Async"/>
|
|
</Root>
|
|
</Loggers>
|
|
</Configuration>
|
|
```
|
|
* When you use `-javaagent` to active the SkyWalking tracer, log4j2 will output **traceId**, if it existed. If the tracer is inactive, the output will be `TID: N/A`.
|
|
|
|
# Print SkyWalking context in your logs
|
|
|
|
* Your only need to replace pattern `%traceId` with `%sw_ctx`.
|
|
|
|
* When you use `-javaagent` to active the SkyWalking tracer, log4j2 will output `SW_CTX: [$serviceName,$instanceName,$traceId,$traceSegmentId,$spanId]`, if it existed. If the tracer is inactive, the output will be `SW_CTX: N/A`.
|
|
|
|
# gRPC reporter
|
|
|
|
The gRPC report could forward the collected logs to SkyWalking OAP server, or [SkyWalking Satellite sidecar](https://github.com/apache/skywalking-satellite). Trace id, segment id, and span id will attach to logs automatically. You don't need to change the layout.
|
|
|
|
* Add `GRPCLogClientAppender` in log4j2.xml
|
|
|
|
```xml
|
|
<GRPCLogClientAppender name="grpc-log">
|
|
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
|
|
</GRPCLogClientAppender>
|
|
```
|
|
|
|
* Add config of the plugin or use default
|
|
|
|
```properties
|
|
log.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
|
|
```
|
|
|
|
* Support `-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector` in gRPC log report.
|
|
|
|
## Transmitting un-formatted messages
|
|
|
|
The log4j 2.x gRPC reporter supports transmitting logs as formatted or un-formatted. Transmitting formatted data is the default but can be disabled by adding the following to the agent config:
|
|
|
|
```
|
|
plugin.toolkit.log.transmit_formatted=false
|
|
```
|
|
|
|
The above will result in the `content` field being used for the log pattern with additional log tags of `argument.0`, `argument.1`, and so on representing each logged argument as well as an additional `exception` tag which is only present if a throwable is also logged.
|
|
|
|
For example, the following code:
|
|
```java
|
|
log.info("{} {} {}", 1, 2, 3);
|
|
```
|
|
|
|
Will result in:
|
|
```json
|
|
{
|
|
"content": "{} {} {}",
|
|
"tags": [
|
|
{
|
|
"key": "argument.0",
|
|
"value": "1"
|
|
},
|
|
{
|
|
"key": "argument.1",
|
|
"value": "2"
|
|
},
|
|
{
|
|
"key": "argument.2",
|
|
"value": "3"
|
|
}
|
|
]
|
|
}
|
|
```
|