Logback日志框架(二):日志的级别与输出

FFish 2021年03月15日 158次浏览

五个级别

logback支持标准的五级日志,从低到高为:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

用<logger>来按包配置日志级别

假设有程序的包结构如下:

net
  ffish
    demo // WARN级别
     packageA
       packageAA
     packageB // INFO级别
       packageBB
     packageC
       packageCC // DEBUG级别
  • 全局默认日志级别为WARN
  • net.ffish.demo.packageB包下为INFO级别
  • net.ffish.demo.packageC.packageCC为DEBUG级别

那你应当这样配置

<configuration>
    ...
    <logger name="net.ffish.demo.packageB" level="INFO" />
    <logger name="net.ffish.demo.packageC.packageCC" level="DEBUG" />
    <root level="WARN">
    </root>
</configuration>

很好理解:

  • <root>为先祖配置
  • <logger>name属性定义包层级
  • 某一层级如果有对应logger明确设定日志级别,则采用设定级别
  • 某一层级如果没有对应logger设定日志级别,则采用最近的祖先设定

下表是可能把你看懵了的官方解释

Example 1

Logger名字设置的level生效level
rootDEBUGDEBUG
XnoneDEBUG
X.YnoneDEBUG
X.Y.ZnoneDEBUG

Example 2

Logger名字设置的level生效level
rootERRORERROR
XINFOINFO
X.YDEBUGDEBUG
X.Y.ZWARNWARN

Example 3

Logger名字设置的level生效level
rootDEBUGDEBUG
XINFOINFO
X.YnoneINFO
X.Y.ZERRORERROR

Example 4

Logger名字设置的level生效level
rootDEBUGDEBUG
XINFOINFO
X.YnoneINFO
X.Y.ZnoneINFO

认识<appender>标签

<appender>标签含有两个必填属性nameclass

name设定<appender>的名字,用于<appender-ref>(参考上一篇的“为不同的<appender>配置日志级别)”。

class指定打印工作类,logback提供了两种Appender

  • ch.qos.logback.core.ConsoleAppender:输出到控制台
  • ch.qos.logback.core.FileAppender:输出到文件

日志既输出到控制台,又写到文件

下面两个appender同时被加在<root>标签上,所有的日志,既会输出到控制台,又会输出到“net.ffish.log”文件中去。

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>net.ffish.log</file>

    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="FILE" />
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>

所有日志都输出到控制台,部分日志输出到文件

下面的配置,所有的日志都会输出到控制台,net.ffish.demo.packageA到日志同时会输出到文件。

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>net.ffish.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <logger name="net.ffish.demo.packageA">
    <appender-ref ref="FILE" />
  </logger>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

如果想net.ffish.demo.packageA到日志只输出到文件,不进控制台,那么需要打破<logger>的继承机制,办法是为<logger>增加如下属性设置:

  <logger name="net.ffish.demo.packageA" additivity="false">
    <appender-ref ref="FILE" />
  </logger>

使用变量

简单的变量使用如下

<configuration scan="true" scanPeriod="60 seconds" debug="true">
    <property name="LOG_LOCATION" value="/var/log" />

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_LOCATION}/mylog.log</file>
        ....
    </appender>
</configuration>

其中<property>标签定义了变量LOG_LOCATION,使用它的方式是${LOG_LOCATION}

这里也可以引用系统变量,或其他配置文件中的变量,变量也有它的作用域,详细参考官网“Variable substitution