Java_日志_log4j2

Dear 丶 2021-10-06 04:22 566阅读 0赞

Java_日志_log4j2

  • 简介
  • 配置加载
  • 配置文档
    • Appender实现类
    • Filter实现类
    • Pattern 输出格式
  • SpringBoot
  • 示例

简介

(1)日志接口(slf4j)
slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)

(2)日志实现(log4j、logback、log4j2)
log4j是apache实现的一个开源日志组件

logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现

log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

log4j2日志级别:
从大到小依次是: error, warn, info, debug, trace
log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等

性能比较:Log4J2 和 Logback 都优于 log4j(不推荐使用)
配置方式:Logback最简洁,spring boot默认,推荐使用

配置加载

配置文档

  1. Appenders
  2. Appender 一个通道,定义日志文件的内容格式和保存的位置
  3. Filter 过滤
  4. Layout 输出格式
  5. Policies 何时进行输出
  6. Strategy 如何进行输出
  7. Loggers
  8. Logger 一个路由器,指定类、包中的日志信息流向哪个管道,以及控制他们的流量(日志级别)
  9. Root 必须配置

Appender实现类

ConsoleAppender(Console) 控制台输出
FileAppender(File) 日志输出到文件
RandomAccessFileAppender(RandomAccessFile) 日志输出到文件,性能比上一个高
RollingFileAppender(RollingFile) 日志按规则分类输出到文件
RollingRandomAccessFileAppender(RollingRandomAccessFile) 日志按规则分类输出到文件

(1)Console 控制台输出

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration name="testConf" status="warn" monitorInterval="30">
  3. <Appenders>
  4. <!-- target: SYSTEM_OUT/SYSTEM_ERR -->
  5. <Console name="Console" target="SYSTEM_OUT">
  6. <!-- 格式化日志 -->
  7. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
  8. </Console>
  9. </Appenders>
  10. <Loggers>
  11. <!-- level默认为error -->
  12. <Root level="info">
  13. <!-- 这里引用了Appenders标签中的name值 -->
  14. <AppenderRef ref="Console"/>
  15. </Root>
  16. </Loggers>
  17. </Configuration>

(2)RandomAccessFile 日志输出到文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration name="testConf" status="warn" monitorInterval="30">
  3. <Appenders>
  4. <!-- fileName:文件输出位置 immediateFlush: 默认true 是否每次写入刷新硬盘-->
  5. <RandomAccessFile name="File" fileName="logs/app.log" immediateFlush="false">
  6. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
  7. </RandomAccessFile>
  8. </Appenders>
  9. <Loggers>
  10. <Root level="info">
  11. <AppenderRef ref="File"/>
  12. </Root>
  13. </Loggers>
  14. </Configuration>

(3)RollingRandomAccessFile 日志按规则分类输出到文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration name="testConf" status="warn" monitorInterval="30">
  3. <Appenders>
  4. <!-- filePattern:%i 滚动参数值,从1递增 -->
  5. <RollingRandomAccessFile name="File" fileName="logs/app.log"
  6. filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" >
  7. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
  8. <Policies>
  9. <!-- 每 5s 翻滚一次 -->
  10. <CronTriggeringPolicy schedule="0/5 * * * * ?" />
  11. <!-- 一般使用上面表达式形式,比较灵活 modulate属性为true(默认) 可通过interval指定秒数5,从启动时间开始算5秒 -->
  12. <TimeBasedTriggeringPolicy interval="5" modulate="true"/>
  13. <!-- 单文件大小超过10兆 翻滚一次,单位:KB,MB,GB -->
  14. <SizeBasedTriggeringPolicy size="10 MB"/>
  15. </Policies>
  16. <!-- %i超过10,删除旧日志 -->
  17. <DefaultRolloverStrategy max="10" />
  18. </RollingRandomAccessFile>
  19. </Appenders>
  20. <Loggers>
  21. <Root level="info">
  22. <AppenderRef ref="File"/>
  23. </Root>
  24. </Loggers>
  25. </Configuration>

Filter实现类

LevelRangeFilter 指定日志级别过滤
TimeFilter 指定时间进行过滤
ThresholdFilter

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration name="testConf" status="warn" monitorInterval="30">
  3. <Appenders>
  4. <Console name="Console">
  5. <!--
  6. 设置 onMismatch="NEUTRAL" 可以让日志经过后续的过滤器
  7. 最后一个过滤器建议设置 onMismatch="DENY", 不然日志就输出了。
  8. -->
  9. <Filters>
  10. <!-- 从大到小:error, warn, info, debug, trace 该配置会输出代码中设置error,warn,info 级别的日志内容-->
  11. <LevelRangeFilter minLevel="error" maxLevel="info" onMatch="ACCEPT" onMismatch="NEUTRAL" />
  12. <!-- 只允许在每天的 8点半~11点半 之间输出日志 -->
  13. <TimeFilter start="08:30:00" end="11:30:00" onMatch="ACCEPT" onMismatch="DENY" />
  14. </Filters>
  15. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
  16. </Console>
  17. </Appenders>
  18. <Loggers>
  19. <Root level="info">
  20. <AppenderRef ref="Console"/>
  21. </Root>
  22. </Loggers>
  23. </Configuration>

Pattern 输出格式

%c{x} %class{x} 打印传递给logger的类的名称及路径。在{}中可以填入数字,比如:类的路径为”org.apache.commons.Foo”,则%c{1}输出”Foo”,%c{2}输出”commons.Foo”。可以不要{},则默认打印全路径。官方文档指出,打印类路径是一项昂贵的操作,可能影响性能,谨慎使用。

%d{x} %date{x} 打印时间。{}可以填写某种格式形式的字符串以表示不用格式的日期,官方提供的有:DEFAULT, ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。通常使用DEFAULT,输出形式为:2012-11-02 14:34:02,781。也可以自己指定格式,比如:yyyy-MM-dd HH:mm:ss,则输出:2017-12-31 15:43:41。

%n 换行。如果不指定,则日志输出默认是不换行的。通常放在输出格式的最后。

%highlight 高亮。用于指定不同级别的日志打印出不用的颜色。详细信息可参考官方文档。想要在eclipse的控制中做到这种效果,需要ANSI Escape in console插件的支持,参考log4j日志在eclipse控制台显示颜色的配置

%M 打印调用的方法名。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。

%l 打印类的全路径和调用处的行号,同时附加一个链接,指向该日志的调用位置,在eclipse控制台中,点击链接,可以跳转到此日志的调用位置。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。经过本人测试,想要打印出类的全路径以及调用的方法名,%l与%c.%M性能相差无几,但是%l多一个链接的功能,可以优先选择%l输出。

%m 打印传递给logger方法的用户日志信息。

%N 打印当前时间的毫微秒。如同调用:System.nanotime()

%pid 打印应用的进程ID。

%r 打印自虚拟机启动以来到此日志打印经过的毫秒数。

%sn 打印日志调用的次数。内部为一个自增长的序列,值从0开始,为整个应用的静态全局变量,

%T 打印调用此日志的线程ID。

SpringBoot

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <!-- 使用log4j2 -->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-log4j2</artifactId>
  15. </dependency>

spring boot 默认加载classpath添加log4j2.xml或者log4j2-spring.xml。

示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="WARN">
  3. <properties>
  4. <property name="LOG_HOME">D:/logs</property>
  5. <property name="FILE_NAME">mylog</property>
  6. <property name="log.sql.level">info</property>
  7. </properties>
  8. <Appenders>
  9. <Console name="Console" target="SYSTEM_OUT">
  10. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />
  11. </Console>
  12. <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
  13. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
  14. <Policies>
  15. <TimeBasedTriggeringPolicy interval="1"/>
  16. <SizeBasedTriggeringPolicy size="10 MB"/>
  17. </Policies>
  18. <DefaultRolloverStrategy max="20"/>
  19. </RollingRandomAccessFile>
  20. </Appenders>
  21. <Loggers>
  22. <Root level="info">
  23. <AppenderRef ref="Console" />
  24. <AppenderRef ref="RollingRandomAccessFile" />
  25. </Root>
  26. <Logger name="com.mengdee.dao" level="${log.sql.level}" additivity="false">
  27. <AppenderRef ref="Console" />
  28. </Logger>
  29. </Loggers>
  30. </Configuration>

发表评论

表情:
评论列表 (有 0 条评论,566人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java日志 - log4j

    一、Log4j学习 1、Log4J Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控 制台、文件、甚至

    相关 Log4jLog4j2日志记录详解

    > 一个完整的项目里,日志是必不可少的,也是很重要的一部分。程序从开发、测试、维护、运行等环节,都需要想控制台等输出大量的信息,如果程序出了问题,那么这些信息能快速的反映出问题

    相关 log4j2日志配置

     log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量、可配置的审计型日志、基于插件架构的各