logback或log4j的配置文件

377 阅读3分钟

简述

appender标签用来配置日志规则,rootlogger标签通过引用规则进行日志输出。

  • filter进行筛选,如筛选出对应的日志级别
  • file日志文件生成路径
  • encoder日志打印字段格式

配置文件格式

常用版本

<configuration>
  <springProfile name="dev">
    <!-- 开发环境时激活 -->
  </springProfile>

  <springProfile name="dev,test">
    <!-- 开发,测试的时候激活-->
  </springProfile>

  <springProfile name="!prod">
    <!-- 当 "生产" 环境时,该配置不激活-->
  </springProfile>

  <!-- 读取spring.application.name中的属性来生成日志文件名 -->
  <springProperty scope="context" name="LOG_HOME" source="logPath"/>
  <springProperty scope="context" name="EXCEPTION_LOCATION" source="exception-location"/>


  <!-- 默认的控制台日志输出,一般生产环境都是后台启动,这个没太大作用 -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
    </encoder>
  </appender>

  <appender name="GAMER-LOGGERONE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>${logging.level}</level>
    </filter>
    <file>
      ${logging.path}/gamer-spring-boot/gamer-loggerone.log
    </file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${logging.path}/gamer-spring-boot/gamer-loggerone.log.%d{yyyy-MM-dd}</FileNamePattern>
      <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
      <charset>UTF-8</charset>
    </encoder>
  </appender>
  
  <!-- 达到有效级别INFO后开始使用配置的打印规则-->
  <logger name="com.gamer.spring.boot.controller" level="INFO"
    additivity="false">
    <appender-ref ref="GAMER-LOGGERONE" />
  </logger>

	<!-- 达到有效级别INFO后开始使用配置的打印规则-->
  <root level="info">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

configuration

配置文件的根结点标签

appender

日志打印组件,用来定义日志的输出规则。 种类:

  • ConsoleAppender: 把日志添加到控制台
  • FileAppender: 把日志添加到文件
  • RollingFIleAppender: 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其它文件。它是FileAppender的子类
  • AsyncAppender:异步打印日志,它仅充当事件分派器,因此必须引用另一个appender才能执行任何有用的操作

子标签:

  1. filter: 可以为appender添加一个或多个过滤器,可以用任意条件对日志进行过滤。appender有多个过滤器时,按照配置顺序执行。
  • ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
</filter>
  • LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMatch和onMissmatch接收或拒绝日志。
<filter class="ch.qos.logback.classic.filter.LevelFilter">   
  <level>INFO</level>   
  <onMatch>ACCEPT</onMatch>   
  <onMismatch>DENY</onMismatch>   
</filter> 

file子标签:用于指定被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

<file>
    ${logging.path}/gamer-spring-boot/glmapper-loggerone.log
</file>

rollingPolicy子标签: 用来描述滚动策略。这个只有appender的class是RollingFileAppender时才需要配置。这个也涉及文件的移动和重命名。 TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。

  • FileNamePattern: 日志输出的文件名
  • maxHistory: 日志文件保留天数
<rollingPolicy 
    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!--日志文件输出的文件名:按天回滚 daily -->
    <FileNamePattern>
        ${logging.path}/gamer-spring-boot/gamer-loggerone.log.%d{yyyy-MM-dd}
    </FileNamePattern>
    <!--日志文件保留天数-->
    <MaxHistory>30</MaxHistory>
</rollingPolicy>

FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。 encoder子标签: 格式化输出的日志。

logger

用来为特定目录或类引用日志打印规则

additivity属性

默认为true,如果为true会存在重复输出的日志。

它是子Logger是否继承父Logger的输出源(appender)的标志位,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。把additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。

举个例子

    <logger name="com.example.logbackdemo" level="debug" additivity="false">
				<!--把info级别的日志输出至文件-->
        <appender-ref ref="info"/>
    </logger>

    <root level="info">
				<!--把info级别的日志打印至控制台-->
        <appender-ref ref="console"/>
    </root>

如果additivity属性是true,那么root配置的规则对com.example.logbackdemo下的日志也生效:

  • 导致控制台打印了一次路径包下info日志,文件中也输出了路径包下info日志

如果additivity属性是false,那么root配置的规则对com.example.logbackdemo下的日志无效:

  • 结果为控制台不会输出路径包下的任何级别日志,文件中输出了路径包下的info日志
  • 如果想再打印warn级别的日志需要在logger下添加配置日志规则(appender),在root下配置warn级别的appender不会作用于路径包下。

root

root是是特殊的logger(顶层logger),root中不能有name和additivity属性,只有一个level(有效级别)

注意事项

Java开发规范(黄山版)

【强制】日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。对于当天日志,以 “应用名.log”来保存,保存在/{统一目录}/{应用名}/logs/目录下,过往日志格式为: {logname}.log.{保存日期},日期格式:yyyy-MM-dd

【强制】根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不 少于六个月,并且进行网络多机备份。

【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式: appName_logType_logName.log。logType:日志类型,如 stats / monitor / access 等; logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什 么目的,也有利于归类查找。

【强制】避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置 additivity=false

参考博客经验

【推荐】日志输出格式避免打印行数%line,影响系统性能。

实操案例

既然已经了解了配置文件的各个属性和规则,那么进行一些常用配置的实操。

  1. 首先我们需要定义好各种输出规则(appender)
  2. 然后我们需要再root和logger下面引用这些提前订好的规则
  3. 贴近实际我们需要不同环境显示不同的日志,以及定义好常用的变量,直接取值

1. 通过控制台输出日志

2. 控制台不打印,直接输出到日志文件

3. 根据日志等级进行日志文件隔离,及通过OFF等级来关闭某些日志

4. 根据包进行日志文件隔离

5. 根据类进行日志文件隔离

6. 根据自定义logger的name进行日志文件隔离