log4j2配置文件详解(springboot+slf4j+log4j2+yaml+lombok)

log4j2配置文件学习笔记:
说明1:本文主要针对yml配置,其他xml配置或者json配置。
说明2:下面是大致介绍了结构,什么作用,当然还有其他分类,比如:logger,AsyncLogger | appenders fileAppenders | rollingFile,rollingRandomAccessFile这些不同的分类和里面具体的参数设置。见官网,官网写的非常好: log4j2官网

yaml格式可以参考:YAML语法入门
大致配置(比较长,看有注释的就可以,没注释的大致都相同):

Configuration:
  status: warn
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  properties: #自定义一些常量,之后使用${变量名}引用
    property:
      # 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符
      # %d{HH:mm:ss.SSS}——日志输出时间
      # %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
      # %-5level——日志级别,并且使用5个字符靠左对齐
      # %logger- ——日志输出者的名字
      # %msg——日志消息
      # %n——平台的换行符
      - name: LOG_FILE_SIZE #名字
        value: 500MB #值
      - name: FILE_PATH
        value: ${sys:logPath} 
  #appenders:定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]。appenders有哪些分类,见下图
  appenders: 
    #console :控制台输出的配置
    Console: 
      name: CONSOLE
      target: SYSTEM_OUT
      #PatternLayout :输出日志的格式,LOG4J2定义了输出代码,详见第二部分
      PatternLayout:
        charset: UTF-8
        Pattern: '[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n'
      #过滤器,后面详细介绍几类过滤器
      ThresholdFilter:
        level: info  #过滤器等级
        onMatch: ACCEPT  #匹配  ACCEPT:接收,DENY:直接拒绝,NEUTRAL:中立,放过,有后面过滤器处理
        onMismatch: DENY  #不匹配
    SMTP: #邮件发送日志
      name: Mail
      subject: "ERROR等级日志" #邮件标题
      to: [email protected] #发给1,发给2,发给3,....
      cc: [email protected] #抄送给谁,多个就逗号分开
      from: [email protected] #发送的邮件
      smtpHost: smtp.qq.com #发送邮箱服务器
      smtpHost: 25 #邮箱端口
      smtpProtocol: smtp #协议
      smtpUsername: zhanbei #发送名称
      smtpPassword: 123456 #发送者的密码,开启SMTP时候的那一串密码
      smtpDebug: false #是否开启发送邮箱调试模式
      bufferSize: 1024 #缓存区大小
      filter:  #过滤器,稍后详解
    RollingRandomAccessFile: #也有RollingFile,日志滚动策略配置,RollingRandomAccessFile标识有缓存的日志滚动。
      -
        name: ROLLING_FILE_INFO #策略名称
        fileName: ${FILE_PATH}info.log  # 日志文件
        filePattern: ${FILE_PATH}info-%d{yyyy-MM-dd}_%i.log.gz  #指定当发生Rolling时,文件的转移和重命名规则
        PatternLayout: #配置日志打印格式化内容
          charset: UTF-8 #编码
          Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n}{INFO=bright white}'
          #格式,具体%logger,%level表示的是啥,有啥,见官方文档
        ThresholdFilter: #配置过滤器,过滤器类型见后面
          level: info #等级
          onMatch: ACCEPT #匹配后,决定
          onMismatch: DENY #不匹配后策略
        Policies:  #Policies :日志滚动策略
          TimeBasedTriggeringPolicy: #时间滚动策略
            interval: 1 #时间间隔,1s
          SizeBasedTriggeringPolicy: #文件大小滚动策略
            size: ${LOG_FILE_SIZE} #文件大小滚动
        DefaultRolloverStrategy:  #默认滚动策略,同个文件夹中允许最多日志文件
          max: 30  # DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置30个
      -
        name: ROLLING_FILE_ERROR
        fileName: ${FILE_PATH}error.log
        filePattern: ${FILE_PATH}error-%d{yyyy-MM-dd}_%i.log.gz
        PatternLayout:
          charset: UTF-8
          Pattern: '%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%rEx%n}{INFO=bright white}'
        ThresholdFilter:
          level: error
          onMatch: ACCEPT
          onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            interval: 1
          SizeBasedTriggeringPolicy:
            size: ${LOG_FILE_SIZE}
        DefaultRolloverStrategy:
          max: 30
      -
        name: ROLLING_P_FILE
        fileName: ${FILE_PATH}p.log
        filePattern: ${FILE_PATH}pay-%d{yyyy-MM-dd}_%i.log.gz
        PatternLayout:
          charset: UTF-8
          Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n}{INFO=bright white}'
        ThresholdFilter:
          level: info
          onMatch: ACCEPT
          onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            interval: 1
          SizeBasedTriggeringPolicy:
            size: ${LOG_FILE_SIZE}
        DefaultRolloverStrategy:
          max: 30
      -  #用户登录日志
        name: ROLLING_ACCESS_LOG_FILE
        fileName: ${FILE_PATH}access.log
        filePattern: ${FILE_PATH}access-%d{yyyy-MM-dd}_%i.log.gz
        PatternLayout:
          charset: UTF-8
          Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{10} %class{36} %L %M - %msg%n}{INFO=bright white}'
        ThresholdFilter:
          level: info
          onMatch: ACCEPT
          onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            interval: 1
          SizeBasedTriggeringPolicy:
            size: ${LOG_FILE_SIZE}
        DefaultRolloverStrategy:
          max: 30
      -  #第三方调用日志
        name: ROLLING_THIRDPART_LOG_FILE
        fileName: ${FILE_PATH}thirdpart.log
        filePattern: ${FILE_PATH}thirdpart-%d{yyyy-MM-dd}_%i.log.gz
        PatternLayout:
          charset: UTF-8
          Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{10} %class{36} %L %M - %msg%n}{INFO=bright white}'
        ThresholdFilter:
          level: info
          onMatch: ACCEPT
          onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            interval: 1
          SizeBasedTriggeringPolicy:
            size: ${LOG_FILE_SIZE}
        DefaultRolloverStrategy:
          max: 30

  #    
  #    
  #    
  Loggers:  #定义logger
    AsyncLogger:  #定义异步logger,Logger:是同步的。异步会提高代码性能,单独建立一个进程,进行日志打印和管理。这个线程由disruptor管理。disruptor要单独pom引入
      - name: org.apache.kafka #名称,可以使报名,类路径,直接可以作用在该类上或者某一包下所有的类。如果自定义名称如:name:wangdacui,在springboot中@slf4h(topic="wangdacui"),就可以用了。
        additivity: false  
        #是否重复,默认true,设置false,这表示在root定义日志记录器,不再重复打印。
        #所有自定义的logger都是集成root里面的,所以默认会在root打印后再在自定义的logger中打印,
        #additivity:false 标识和root日志记录器断绝关系。
        level: ERROR #定义日志记录器记录日志等级
        #Logger节点用来单独指定日志的形式,name为包路径,比如要为org.springframework包下所有日志指定为INFO级别等
      - name: cn.itsource
        additivity: false
      - name: AccessLog
        level: info
        additivity: false
        AppenderRef:
          ref: ROLLING_ACCESS_LOG_FILE
      - name: ThirdPartLog
        level: info
        additivity: false
        AppenderRef:
          ref: ROLLING_THIRDPART_LOG_FILE
    Root: #设置根节点日志记录器,和自定义日志记录器模式一样
      level: info
      AppenderRef:
        - ref: ROLLING_FILE_INFO
        - ref: ROLLING_FILE_ERROR

appenders类型:

  1. FileAppender    普通地输出到本地文件
  2. FlumeAppender   将几个不同源的日志汇集、集中到一处
  3. RewriteAppender   对日志事件进行掩码或注入信息
  4. RollingFileAppender  对日志文件进行封存
  5. RoutingAppender  在输出地之间进行筛选路由
  6. SMTPAppender  将LogEvent发送到指定邮件列表
  7. SocketAppender  将LogEvent以普通格式发送到远程主机
  8. SyslogAppender  将LogEvent以RFC 5424格式发送到远程主机
  9. AsynchAppender   将一个LogEvent异步地写入多个不同输出地
  10. ConsoleAppender  将LogEvent输出到控制台
  11. FailoverAppender  维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止。

Filter类型:

过滤器名称 说明 是否常用
StringMatchFilter 如果格式化后(即:最终)的日志信息中包含${指定的字符串},则onMatch,否则onMismatch即: msg.contains(this.text) ? onMatch : onMismatch;
LevelRangeFilter 若${maxLevel} <= 日志级别 <= ${minLevel}, 则onMatch,否则onMismatch如: 即为只记录日志info及warn级别的日志。
RegexFilter 如果日志信息匹配${指定的正则表达式},则onMatch,否则onMismatch 注:可通过useRawMsg属性来控制这个日志信息是格式化处理后(即:最终)的日志信息,还是格式化处理前(即:代码中输入)的日志信息
ThresholdFilter 若日志级别 >= ${指定的日志级别}, 则onMatch,否则onMismatch
LevelMatchFilter 如果日志级别等于${指定的日志级别},则onMatch,否则onMismatch
ThreadContextMapFilter 通过context(可以理解为一个Map)中对应的key-value值进行过滤注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。
DynamicThresholdFilter 若上下文中包含指定的key,则触发DynamicThresholdFilter生效;若该key对应的value值等于任意一个我们指定的值,那么针对本条日志,可记录日志级别的约束下限调整为指定的级别

注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。

示例说明:配置,

有以下情况:

情况一:存在键loginRole,假设从上下文(可以理解为一个Map)中取出来的对应的值为user,那么此时,对于日志级别大于等于warn的日志,会走onMatch;其它的日志级别走onMismatch。

情况二:存在键loginRole,假设从context(可以理解为一个Map)中取出来的对应的值为admin,那么此时,对于日志级别大于等于debug的日志,会走onMatch;其它的日志级别走onMismatch。

情况三:【上下文(可以理解为一个Map)中,不存在键loginRole】或【存在键loginRole,但从日志上下文中取出来的值(假设)为abc, 没有对应的KeyValuePair配置】,那么此时等价于
CompositeFilter 组合过滤器,即:按照xml配置中的配置,一个过滤器一个过滤器的走,如果在这过程中,任意一个过滤器ACCEPT或DENY了,那么就不会往后走了,直接返回对应的结果。
TimeFilter 如果记录日志时的当前时间落在每天指定的时间范围[start, end]内,则onMatch,否则onMismatch
如:
ScriptFilter 是否匹配取决于指定的脚本返回值是否为true
DenyAllFilter This filter causes all logging events to be dropped
BurstFilter 对低于或等于${指定日志级别}的日志,进行限流控制
NoMarkerFilter 如果从对应事件对象获取(LogEvent#getMarker)到的marker为null, 则onMatch,否则onMismatch
MarkerFilter 如果从对应事件对象获取(LogEvent#getMarker)到的marker的name值为等于${指定的值}, 则onMatch,否则onMismatch
MapFilter The MapFilter allows filtering against data elements that are in a MapMessage.

注:需要使用org.apache.logging.log4j.Loggerj进行记录,且记录org.apache.logging.log4j.message.MapMessage日志,才会生效。

注:因为暂时不兼容Slf4j这里不多作说明
StructuredDataFilter The StructuredDataFilter is a MapFilter that also allows filtering on the event id, type and message.
注:需要使用org.apache.logging.log4j.Loggerj进行记录,且记录org.apache.logging.log4j.core.filter.StructuredDataFilter日志,才会生效。

注:因为暂时不兼容Slf4j这里不多作说明
...... ..... ......

备注:关于各种filter的配置参数见:官网filter介绍

springboot+slf4j+log4j2+yaml中使用:主要是@slf4j(topic="自定义的logger name")。
其实@slf4j注解就是实现:

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
//或者
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("自定义logger 的名称");

你可能感兴趣的:(log4j2配置文件详解(springboot+slf4j+log4j2+yaml+lombok))