springboot 日志 [log4j2 + slf4j]

SpringBoot 日志

springboot 使用Commons Logging进行所有内部日志记录,但是底层实现依旧是打开状态。为Java Util Logging,Log4J2,Logback提供了默认配置。默认情况下使用Logback进行日志记录
写这篇日志的原因:springboot默认日志导致线上系统堵塞,效率不高,所以特别抽出点时间来研究合适项目的日志系统,具体效率问题我就不赘述了,大概就是 log4j2 > log4j *10 ,也刚好细分下需要保存的日志。也希望别人不用再踩到我淌过的坑

日志级别

级别解释
FATAL指出每个严重的错误事件将会导致应用程序的退出。
ERROR指出虽然发生错误事件,但仍然不影响系统的继续运行。
WARN表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
INFO消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
DEBUG指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
TRACE追踪栈信息,粒度太细,排查具体问题时使用

日志组

能够将相关记录器分组在一起通常很有用,以便可以同时配置它们。

Spring Boot包含以下预定义的日志记录组,它们可以直接使用:

名称记录仪
网路org.springframework.core.codecorg.springframework.httporg.springframework.weborg.springframework.boot.actuate.endpoint.weborg.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.coreorg.hibernate.SQL

可以在properties文件中自定义组

定义:

logging.group.tomcat = org.apache.catalina,org.apache.coyote,org.apache.tomcat

在yml中使用:

logger:
	level:
		tomcat: trace

自定义日志配置

springboot默认日志 配置信息:

春季环境系统属性注释
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常时使用的转换字。
logging.fileLOG_FILE如果定义,它将在默认日志配置中使用。
logging.file.max-sizeLOG_FILE_MAX_SIZE最大日志文件大小(如果启用了LOG_FILE)。(仅默认的Logback设置受支持。)
logging.file.max-historyLOG_FILE_MAX_HISTORY要保留的最大归档日志文件数(如果启用了LOG_FILE)。(仅默认的Logback设置受支持。)
logging.pathLOG_PATH如果定义,它将在默认日志配置中使用。
logging.pattern.consoleCONSOLE_LOG_PATTERN控制台上使用的日志模式(stdout)。(仅默认的Logback设置受支持。)
logging.pattern.dateformatLOG_DATEFORMAT_PATTERN记录日期格式的附加模式。(仅默认的Logback设置受支持。)
logging.pattern.fileFILE_LOG_PATTERN文件中使用的日志模式(如果LOG_FILE已启用)。(仅默认的Logback设置受支持。)
logging.pattern.levelLOG_LEVEL_PATTERN呈现日志级别时使用的格式(默认%5p)。(仅默认的Logback设置受支持。)
PIDPID当前进程ID(如果可能,并且尚未将其定义为OS环境变量时,将被发现)。

使用log4J21

log4J2 默认使用配置文件名为 log4j2-spring.xml ,否则需要再 application.yml 中添加日志配置信息 建议使用xml配置

log4J2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
  <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

  <!--变量配置-->
  <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>

  <appenders>

    <console name="Console" target="SYSTEM_OUT">
      <!--输出日志的格式-->
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    </console>

    <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
    <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
      <PatternLayout pattern="${LOG_PATTERN}"/>
    </File>

    <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
    <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval属性用来指定多久滚动一次,默认是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>

    <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
    <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval属性用来指定多久滚动一次,默认是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>

    <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
    <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval属性用来指定多久滚动一次,默认是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>

  </appenders>

  <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
  <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
  <!--  简单来说 : 如果logger没有配置子节点,那么就代表过滤 -->
  <loggers>

    <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
    <logger name="org.mybatis" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </logger>
    <!--监控系统信息-->
    <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
    <Logger name="org.springframework" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>

    <root level="info">
      <appender-ref ref="Console"/>
      <appender-ref ref="Filelog"/>
      <appender-ref ref="RollingFileInfo"/>
      <appender-ref ref="RollingFileWarn"/>
      <appender-ref ref="RollingFileError"/>
    </root>
  </loggers>

</configuration>

log4J2.yml

Configuration:
  status: warn
  monitorInterval: 30
  Properties: # 定义全局变量
    Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
#    测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
    #生产:-Dlog.level.console=warn -Dlog.level.xjj=info
    - name: log.level.console
      value: info
    - name: log.path
      value: log
    - name: project.name
      value: opendoc
    - name: log.pattern
      value: "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-30.30C{1.} : %m%n"
  Appenders:
    Console:  #输出到控制台
      name: CONSOLE
      target: SYSTEM_OUT
      PatternLayout:
        pattern: ${log.pattern}
    #   启动日志
    RollingFile:
    - name: ROLLING_FILE
      fileName: ${log.path}/${project.name}.log
      filePattern: "${log.path}/historyRunLog/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
      PatternLayout:
        pattern: ${log.pattern}
      Filters:
        #        一定要先去除不接受的日志级别,然后获取需要接受的日志级别
        ThresholdFilter:
        - level: warn
          onMatch: DENY
          onMismatch: NEUTRAL
        - level: info
          onMatch: ACCEPT
          onMismatch: DENY
        - level: debug
          onMatch: ACCEPT
          onMismatch: DENY
      Policies:
        TimeBasedTriggeringPolicy:  # 按天分类
          modulate: true
          interval: 1
      DefaultRolloverStrategy:     # 文件最多100个
        max: 100
    #   平台日志
    - name: PLATFORM_ROLLING_FILE
      ignoreExceptions: false
      fileName: ${log.path}/platform/${project.name}_platform.log
      filePattern: "${log.path}/platform/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
      PatternLayout:
        pattern: ${log.pattern}
      Policies:
        TimeBasedTriggeringPolicy:  # 按天分类
          modulate: true
          interval: 1
      DefaultRolloverStrategy:     # 文件最多100个
        max: 100
    #   业务日志
    - name: BUSSINESS_ROLLING_FILE
      ignoreExceptions: false
      fileName: ${log.path}/bussiness/${project.name}_bussiness.log
      filePattern: "${log.path}/bussiness/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
      PatternLayout:
        pattern: ${log.pattern}
      Policies:
        TimeBasedTriggeringPolicy:  # 按天分类
          modulate: true
          interval: 1
      DefaultRolloverStrategy:     # 文件最多100个
        max: 100
    #   错误日志
    - name: EXCEPTION_ROLLING_FILE
      ignoreExceptions: false
      fileName: ${log.path}/exception/${project.name}_exception.log
      filePattern: "${log.path}/exception/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
      ThresholdFilter:
        level: error
        onMatch: ACCEPT
        onMismatch: DENY
      PatternLayout:
        pattern: ${log.pattern}
      Policies:
        TimeBasedTriggeringPolicy:  # 按天分类
          modulate: true
          interval: 1
      DefaultRolloverStrategy:     # 文件最多100个
        max: 100
    #   DB 日志
    - name: DB_ROLLING_FILE
      ignoreExceptions: false
      fileName: ${log.path}/db/${project.name}_db.log
      filePattern: "${log.path}/db/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
      PatternLayout:
        pattern: ${log.pattern}
      Policies:
        TimeBasedTriggeringPolicy:  # 按天分类
          modulate: true
          interval: 1
      DefaultRolloverStrategy:     # 文件最多100个
        max: 100
  Loggers:
    Root:
      level: info
      AppenderRef:
      - ref: CONSOLE
      - ref: ROLLING_FILE
      - ref: EXCEPTION_ROLLING_FILE
    Logger:
    - name: platform
      level: debug
      additivity: false
      AppenderRef:
      - ref: CONSOLE
      - ref: PLATFORM_ROLLING_FILE
    - name: bussiness
      level: debug
      additivity: false
      AppenderRef:
      - ref: BUSSINESS_ROLLING_FILE
    - name: exception
      level: debug
      additivity: true
      AppenderRef:
      - ref: EXCEPTION_ROLLING_FILE
    - name: db
      level: info
      additivity: false
      AppenderRef:
      - ref: DB_ROLLING_FILE
#    监听具体包下面的日志
#    Logger: # 为com.xjj包配置特殊的Log级别,方便调试
#      - name: com.xjj
#        additivity: false
#        level: ${sys:log.level.xjj}
#        AppenderRef:
#          - ref: CONSOLE
#          - ref: ROLLING_FILE
pom.xml需要添加的配置:
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
    <exclusions><!-- 去掉springboot默认配置 -->  
        <exclusion>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-logging</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency> 

<dependency><!-- 日志模板 -->
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.7</version>
</dependency>

<dependency> <!-- 引入log4j2依赖 -->  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-log4j2</artifactId>  
</dependency> 

 <!--加上这个才能辨认到log4j2.yml文件【如果使用xml配置则不需要此步】   -->
<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
如需打印mybatis执行的sql系统配置文件需要加入:
mybatis:
  typeAliasesPackage: com.gcs.storecommon.pojo #项目实体路径
  mapperLocations: classpath*:*/mybatis-mapper/*.xml,classpath*:mybatis-mapper/*.xml #项目实体xml路径
  #configuration 代表指定mybatis的日志打印方式  如果关闭了springboot自带日志,那么就需要加入如下参数
  configuration:
    log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl

可能遇到的问题

项目中的自定义logger日志不打印 :原因是因为jar包冲突,检查pom文件中是否有哪些依赖里有log4j,删掉就好了


  1. 日志配置方案:https://cloud.tencent.com/developer/article/1383491, XML配置详解:https://www.cnblogs.com/keeya/p/10101547.html ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值