在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索。绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?
新的Log4j 2.0版本有了大幅的性能提升、新的插件系统,以及配置设置方面的很多改善。Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback ——官方测试结果。
代码pom.xml添加相应的依赖
<!–配置Log4j2日志 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
增加日志格式配置文件log4j2.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!–Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。 –>
<!– monitorInterval 自动监控配置文件是否发生改变的时间间隔,如果检测到改变会进行热加载–>
<Configuration status=”INFO” monitorInterval=”1800″>
<!– 全局属性 –>
<properties>
<!–日志文件储存的目录 –>
<!– <property name=”LOG_HOME”>${sys:catalina.home}/logs/om_error</property> –>
<property name=”LOG_HOME”>/data/logs</property>
<property name=”ERROR_FILE_NAME”>JWordpres-web</property>
<!–设定日志输出的具体格式 –>
<!–%-5p(日志级别) | %d(日期) | JWordpres-v1.0 | [%t(线程名称)-%T(线程号)] (%c{1.}(简化全类名):%L(行号)) | %m(日志信息)%n(换行) –>
<property name=”PATTERN”>%-5p | %d | JWordpres-v2.0 | [%t-%T] (%c{1.}:%L) | %m%n</property>
<!– <property name=”PATTERN”>%d %-5p [%t-%T] (%c{1.}:%L) – %m%n</property> –>
</properties>
<!–定义日志的输出路径 –>
<Appenders>
<!–输出日志到控制台 –>
<Console name=”Console” target=”SYSTEM_OUT”>
<PatternLayout pattern=”${PATTERN}” />
</Console>
<!– 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档–>
<RollingFile name=”ErrorLog” fileName=”${LOG_HOME}/${ERROR_FILE_NAME}.log”
filePattern=”${LOG_HOME}/${ERROR_FILE_NAME}_%d{yyyy-MM-dd}_%i.log”
bufferedIO=”false” immediateFlush=”true” >
<!–设置日志输出的格式 –>
<PatternLayout pattern=”${PATTERN}”/>
<!–设置当前日志只输出ERROR级别的日志 –>
<!–控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)–>
<!– <Filters>
<ThresholdFilter level=”ERROR” onMatch=”ACCEPT” onMismatch=”DENY”/>
</Filters> –>
<Policies>
<SizeBasedTriggeringPolicy size=”50 MB” />
<!–设置触发时间策略的时间间隔,一天产生一个新文件 –>
<TimeBasedTriggeringPolicy interval=”2000″ modulate=”true”/>
<!–设置每个日志文件的最大大小,单位可以为 B KB MB GB –>
<!– <SizeBasedTriggeringPolicy size=”1KB”/> –>
</Policies>
<!– DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20000 –>
<DefaultRolloverStrategy max=”20000″/>
</RollingFile>
</Appenders>
<!–然后定义logger,只有定义了logger并引入的appender,appender才会生效–>
<Loggers>
<!– 3rdparty Loggers –>
<!– 下面配置一些第三方包的日志过滤级别,用于避免刷屏 测试–>
<logger name=”org.hibernate” level=”INFO” />
<logger name=”org.springframework” level=”INFO” />
<logger name=”org.apache” level=”INFO” />
<logger name=”org.mybatis” level=”INFO” />
<logger name=”com.alibaba” level=”INFO” />
<logger name=”druid.sql” level=”INFO” />
<logger name=”cn.liuhaihua.web.mapper” level=”DEBUG” />
<logger name=”cn.liuhaihua.web.service.impl” level=”INFO” />
<!–com.gomefinance包下的日志异步输出 includeLocation:包含本地信息;additivity:不继承父类的日志输出–>
<AsyncLogger name=”cn.liuhaihua.web” level=”INFO” includeLocation=”true” additivity=”false”>
<appender-ref ref=”ErrorLog”/>
<appender-ref ref=”Console”/>
</AsyncLogger>
<!–建立一个默认的root的logger –>
<root level=”INFO” includeLocation=”true”>
<appender-ref ref=”ErrorLog”/>
<appender-ref ref=”Console”/>
</root>
</Loggers>
</Configuration>
效果启动应用,查看日志格式如下图所示