背景

随着业务服务(Server App)逐渐增加,我们的业务系统中的日志输出面临的问题越来越多,高并发下对磁盘io这块消耗的越来越大,因此,急需要一个高性能且最好能够支持异步输出日志的日志框架,而且能兼容市面上目前主流的日志组件(log4j1.x,logback等)

简介

log4j2也是一款日志组件,log4j1.x升级版本,并且log4j2和log4j是同一个作者,但是log4j2是重新架构的。在我的理解中,尽管log4j2相较于log4j有很多优点,但是我采用它放弃log4j最大的理由是:它支持异步输出,性能秒杀一切的日志组件。

XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	日志级别优先级排序:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL 
	ALL    最低等级的,用于打开所有日志记录;
    TRACE  很低的日志级别,一般不会使用;
	DEBUG  指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息;
	INFO   消息在粗粒度级别上突出强调应用程序的运行过程;
	WARN   表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示;
	ERROR  指出虽然发生错误事件,但仍然不影响系统的继续运行;打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别;
	FATAL  指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了;
	OFF 最高等级的,用于关闭所有日志记录;

	级别越高,日志越少;
	设置的级别和比设置的级别优先级高的log能打印出来;
-->
<!-- configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:log4j2可以自动检测修改配置文件和重新配置本身,设置间隔秒数-->
<configuration status="ERROR" monitorInterval="30">
     <!--变量配置-->
  	<Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        <!-- 定义日志存储的路径 -->
        <property name="FILE_PATH" value="更换为你的日志路径" />
        <property name="FILE_NAME" value="更换为你的项目名" />
  	</Properties>
  
    <!-- 先定义所有的appender -->
	<appenders>
        <!-- 输出控制台的配置 -->
        <console name="Console" target="SYSTEM_OUT">
        	<!-- 输出日志的格式 -->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
    
        <!-- 日志大于50M时,自动备份存档,生成新的文件 -->
        <RollingFile name="logfile" fileName="${FILE_PATH}/system.log" filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
          <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
          <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
          <Policies>
            <!--interval属性用来指定多久滚动一次,默认是1 hour-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
          </Policies>
          <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
          <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </appenders>
  
    <!-- 然后定义logger,只有定义了logger并引入appender,appender才会生效 -->
    <loggers>
        <!-- 过滤掉spring、apache和druid的一些无用的DEBUG信息 
			就是设置日志级别
		-->
    	<logger name="org.springframework" level="ERROR"></logger>
        <logger name="com.alibaba.druid" level="ERROR"></logger>
        <logger name="org.apache" level="ERROR"></logger>
    
        <root level="INFO">
        	<appender-ref ref="Console"/>
            <appender-ref ref="logfile"/>
        </root>
    </loggers>
</configuration>