Java日志
1. Log4j2
1.1 Log4j2安全版本
log4j2目前安全版本是2.17.1以上,可以在全局pom.xml中添加log4j2.version配置,使log4j-api与log4j-core等升级到安全版本。生效原理是覆盖spring-boot-dependencies(spring-boot-starter-parent的父级)中的配置
spring-boot-dependencies.xml:
<property>
<log4j2.version>2.13.3</log4j2.version>
<property>
...
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>${log4j2.version}</version>
</dependency>
1.2 包冲突解决
- log4j-slf4j-impl与log4j-to-slf4j冲突,解决方式是删除log4j-to-slf4j依赖,一般在pom.xml中exclusion掉spring-boot-starter-logging
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
1.3 log4j2引入
- 修改pom.xml配置
<properties>
<log4j2.version>2.17.1</log4j2.version>
<properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
- 在resource目录下添加log4j2.xml
这是一个适用docker容器的简单配置,日志都打印在输出中
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<properties>
<property name="LOG_HOME">/data/log/</property>
<property name="LOG_LEVEL">${sys:LOG4J2-LEVEL:-info}</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="${LOG_LEVEL}">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
一个传统项目的配置,X-B3-TraceId是traceId,需要引入sleuth
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
log4j2.xml:
<configuration monitorInterval="120">
<Properties>
<Property name="logLevel" value="${sys:LOG4J2-LEVEL:-info}" />
<Property name="logFilePath" value="/home/app/appName" />
<Property name="logFileName">appName</Property>
<Property name="bySecond" value="%d{yyyyMMdd}" />
<Property name="fileSize" value="750MB" />
<Property name="scheduleCron" value="0 0 0/3 * * ?" />
<Property name="keepDay" value="30d" />
<Property name="pattern" value="%-23d{yyyy-MM-dd HH:mm:ss.S} %-5level [%X{X-B3-TraceId}] [%-30.30c{1.}](%M.%L) : %msg%xEx%n" />
</Properties>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%-23d{yyyy-MM-dd HH:mm:ss.S} %-5level [%X{X-B3-TraceId}] [%-30.30c{1.}](%M.%L) : %msg%xEx%n"/>
</Console>
<RollingFile name="RollingFileBusiness" fileName="${logFilePath}/${logFileName}.log"
append="true"
filePattern="${logFilePath}/${bySecond}/${logFileName}-%d{HH}.%i.log.gz">
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout>
<Pattern>${pattern}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<CronTriggeringPolicy schedule="${scheduleCron}"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${logFilePath}" maxDepth="2">
<IfFileName glob="*/${logFileName}-*.log.gz" />
<IfLastModified age="${keepDay}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${logFilePath}/error.log"
append="true"
filePattern="${logFilePath}/${bySecond}/error-%d{HH}.%i.log.gz">
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout>
<Pattern>${pattern}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<CronTriggeringPolicy schedule="${scheduleCron}"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${logFilePath}" maxDepth="2">
<IfFileName glob="*/${logFileName}-*.log.gz" />
<IfLastModified age="${keepDay}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<logger name="baidu.xxx" level="${logLevel}" includeLocation="true">
<appender-ref ref="RollingFileBusiness"/>
<appender-ref ref="RollingFileError"/>
</logger>
<Root level="${logLevel}" includeLocation="true">
<AppenderRef ref="CONSOLE" />
</Root>
</Loggers>
</configuration>