slf4j和log4j2使用


1. slf4j和log4j2

  slf4j是一个日志接口,不能直接使用,需要结合具体的日志实现框架使用(log4j、logback、log4j2等)。

1.1 为什么不直接使用具体的实现,而需要使用日志接口

  接口定义了一种日志规范,可以有不同的日志实现,使用时只需面对接口(使用的也都是slf4j的包,没有直接使用某个具体日志实现的包),因此在应用中可以随意的更改的日志的实现框架,而不需要更改代码中日志的相关代码。简而言之:就是只需更改日志实现的jar包即可,对用户来说无直接影响,若业务代码中直接使用具体的日志实现,当更改日志实现时,需要更改业务中日志相关的调用。

 

2 log4j2的配置文件

  主要包含Configuration、Appenders、Loggers、properties几个属性

2.1 Configuration属性

  主要有status和monitorInterval等多个属性。

  status: 用于控制log4j2框架本身的日志级别,例如可配置为:“trace”, “debug”, “info”, “warn”。

  monitorInterval: 每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置。类似于热部署

2.2 Appenders属性

  输出源,定义日志输出的地方。

  Console:将日志输出至控制台

  File:将日志输出至指定文件,需要配置文件路径

  RollingRandomAccessFile:也是输出至文件,不过支持当文件达到一定大小时,另起一个新文件写入日志。   

    fileName 指定当前日志文件的位置和文件名称
    filePattern 指定当发生Rolling时,文件的转移和重命名规则
    SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
    DefaultRolloverStrategy 指定最多保存的文件个数
    TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟
    TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件

  Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)

2.3 Loggers属性

  name可以输入包名,可以按照不同的包路径输出到不同文件中

  level:什么级别的日志可以输出

  additivity: 是否继承,若为true,父类的logger对应的输出文件也会输出一遍日志,一般设置为false

<Logger name="rollingRandomAccessFileLogger" level="trace" additivity="true">  
    <AppenderRef ref="RollingRandomAccessFile" />  
</Logger>

2.4 properties属性

  使用来定义常量,以便在其他配置的时候引用,该配置是可选的

 

3 log4j2 案例

<?xml version="1.0" encoding="utf-8"?>
<!-- 根路径 --> <configuration status="WARN" packages="org.apache.logging.log4j.core.pattern"> <properties> <!-- 定义文件输出格式,后面可以直接引用,避免重复书写格式 --> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property> </properties>
  <!-- 定义输出的路径 --> <appenders> <Console name="CONSOLE" target="system_out"> <PatternLayout pattern="${PATTERN}" /> </Console> <RollingFile name="TraceLog" fileName="logs/TraceLog.log" filePattern="logs/TraceLog-$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%msg%n" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB" /> </Policies> </RollingFile> <Async name="AsyncTraceLog"> <AppenderRef ref="TraceLog" /> </Async> <Async name="AsyncCONSOLE"> <AppenderRef ref="CONSOLE" /> </Async> </appenders>   
  
  <!-- 按照不同的包路径和日志文件路径关联在一起 --> <loggers> <AsyncLogger name="com.log.broker" level="info" additivity="false"> <AppenderRef ref="AsyncCONSOLE" /> </AsyncLogger> <Logger name="com.log.trace" level="info" additivity="false"> <AppenderRef ref="AsyncTraceLog" /> </Logger> <root level="info"> <AppenderRef ref="AsyncCONSOLE" /> </root> </loggers> </configuration>

  文件路径一些常用的占位符:

  %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
  %t 输出当前线程名称
  %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0%msg 日志文本
  %n 换行

  其他常用的占位符有:
  %F 输出所在的类文件名,如Log4j2Test.java
  %L 输出行号
  %M 输出所在方法名
  %l 输出语句所在的行数, 包括类名、方法名、文件名、行数

 

本文源于:https://blog.csdn.net/vbirdbest/article/details/71751835


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM