log4j2学习笔记

pom.xml依赖

		<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.2</version>
        </dependency>
        <!--解决web项目log4j可能出现警告的jar包-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>2.11.2</version>
        </dependency>
        <!--log4j2的异步日志功能包,使用AsyncLogger需要-->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

        <!--使用slf4j作为日志门面-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <!--slf4j对应log4j2日志框架的驱动包,用于slf4j与log4j2保持桥接-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.12.1</version>
        </dependency>

web.xml配置

		<context-param>
		    <param-name>log4jContextName</param-name>
		    <param-value>star</param-value>
		</context-param>
		<context-param>
		    <param-name>log4jConfiguration</param-name>
		    <param-value>classpath:conf/log4j2.xml</param-value>
		</context-param>
		
		<listener>
		    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
		</listener>

log4j2配置文件

  • xml
    • appender:
      • Console
          <Appenders>
         		<!--输出方式:SYSTEM_OUT 或 SYSTEM_ERR -->
              <Console name="Console" target="SYSTEM_OUT">
                  <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
              </Console>
          </Appenders>
      
      • File, RandomAccessFile
        前者使用FileOutputStream, 后者使用RandomAccessFile,在bufferedIO=true(默认)情况下后者性能高
       <!--默认输出位置为${sys:catalina.home}/bin-->
      <!--immediateFlush为false时不会立即刷新到文件-->
      <RandomAccessFile name="random_access_file" fileName="logs/random_access_file.log" immediateFlush="false" append="true">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      </RandomAccessFile>
      
      • RollingFile, RollingRandomAccessFile
        触发机制:CompositeTriggeringPolicy, OnStartupTriggeringPolicy, SizeBasedTriggeringPolicyTimeBasedTriggeringPolicy,要注意按时间TimeBasedRollingPolicy和按大小生成SizeBasedTriggeringPolicy冲突问题
      <!--immediateFlush:立即将日志刷到磁盘,默认为true-->
      <!--fileName:日志存储路径-->
      <!--filePattern:历史日志封存路径,自动识别zip等后缀,进行压缩-->
      <!--使用SizeBasedTriggeringPolicy时,filePattern后面要加%i,否则会与TimeBasedTriggeringPolicy冲突-->
      <RollingRandomAccessFile name="common_rolling_file" fileName="logs/common_rolling_file.log"
                               immediateFlush="true"
                               filePattern="logs/common-%d{yyyy-MM-dd-HH-mm-ss-SSS}-%i.zip" append="true">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
          <Policies>
         		<!--日志文件大小-->
              <SizeBasedTriggeringPolicy size="100kB"/>
              <!--最多保留文件数-->
              <DefaultRolloverStrategy max="20"/>
          </Policies>
      </RollingRandomAccessFile>
      
    • filter
      	<Filters>
              <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
              <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
          </Filters>
      
    • Loggers
    • PatternLayout
      • 设置内容长度:在%和内容之间添加数字,空格补齐,.表示最大宽度,负数表示左对齐,例如 %-5level, %20.30class
      • %level{参数1}{参数2}{参数3}-日志级别
      • %n-换行
      • %t%thread-创建logger的线程名
      • %m%msg%message-日志信息
      • %d{参数}-时间
      • %c{参数}%logger{参数}-日志名称

异步日志

  • 优点:更高的峰值吞吐量,同步日志的6 - 68倍;更低的响应延迟
  • 异步日志使用单独的线程执行IO操作,提高系统性能
  • 可选择全局异步或者混合异步,全局异步获取最佳性能,混合异步更具灵活性
  • 异步Loggers使用LMAX Disruptor技术,比队列吞吐量更高,延迟更低
  • 异步Appenders使用jdk自带的ArrayBlockingQueue,无需导入disruptor
  • 全局异步:将系统属性log4j2.contextSelector设置为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector,当使用AsyncLoggerContextSelector设置为全局异步时,配置文件中只能使用<root><logger>这种常规标签,没必要再用<asyncRoot><asyncLogger>标签
  1. 可以在系统初始化时,增加全局参数设置:
System.setProperty("log4j2.contextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
  1. 加载在jvm启动参数里
java -Dog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
  1. 对于web应用,可以在web.xml中配置自定义ContextLoaderListener,contextInitialized方法中执行1
  • 混合异步:
    使用<asyncRoot><asyncLogger>标签,配置文件中只能有<asynRoot><asyncLogger>两者之一,
  • 如果Filter或者PatternLayout配置了与location(定位)相关的属性,例如 HTML locationInfo或者%C or %class, %F or %file, %l or %location, %L or %line, %M or %method属性之一,log4j会对栈拍快照,然后查找这些属性的值,非常耗时,不建议使用。默认情况下,异步Logger不会将location信息传递给IO线程,需要在相应的logger中设置"includeLocation=true",包括Root
<Loggers>
    <Root level="info" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
</Loggers>

参考

http://logging.apache.org/log4j/2.x/manual/async.html
http://logging.apache.org/log4j/2.x/manual/configuration.html
https://blog.csdn.net/henry115/article/details/78483457
https://www.jianshu.com/p/9f0c67facbe2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值