【Java 知识】LogBack 节点详解

LogBack

摘要:本篇文章主要是对LogBack的基础介绍,首先介绍了如何在SpringBoot应用集成Logstash,接着对一些常用的节点进行详细的描述,最后对Logback的五个日志级别和log4j8个级别的log进行介绍。其中最关键的是对Logback的相关节点的理解和使用。

应用集成

如果需要在SpringBoot应用集成Logstash,则需要在pom.xml中添加logstash-logback-encoder依赖:

<properties>
  <logstash-logback.version>5.3</logstash-logback.version>
</properties>   
<!--集成logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>${logstash-logback.version}</version>
</dependency>

添加配置文件logback-spring.xmllogback的日志输出到logstash

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.xx.xxx:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

常用节点

常用节点:

  • 根节点<configuration>
  • 子节点<property>,用来设置相关变量,通过key-value的方式配置,然后在后面的配置文件中通过 ${key}来访问。
  • 子节点<appender>,日志输出组件,主要负责日志的输出以及格式化日志。常用的属性有nameclass
  • 子节点<logger>root节点和logger节点其实都是表示Logger组件。
  • 子节点<root>root是最顶层的logger
  • 子节点<contextName>,设置日志上下文名称,后面输出格式中可以通过定义 %contextName 来打印日志上下文名称。
  • 子节点<timestamp>,获取时间戳字符串。

configuration

使用示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration> 
  • scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
  • scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scantrue时,此属性生效。默认的时间间隔为1分钟。
  • debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

contextName

contextName用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录,一旦设置,不能修改。

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
     <contextName>appName</contextName> 
    <!--其他配置省略-->
</configuration>    

property

property节点用来定义变量值,它有两个属性namevalue,通过<property>定义的值会被插入到logger上下文中,可以使${}来使用变量。 

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
     <property name="log.path" value="./logs/admin.log"/>
     <property name="AppName" value="myAppValue" /> 
   <contextName>${AppName}</contextName> 
   <!--其他配置省略--> 
</configuration>

logger

子节点<logger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>
<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。

示例:

<!-- project default level -->
<logger name="com.xxxx.xxx" level="INFO"/>
<logger name="org.apache.ibatis" level="INFO"/>
<logger name="java.sql" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<logger name="com.xxxx.xxx.mapper" level="ERROR"/>
<!--log4jdbc -->
<logger name="jdbc.sqltiming" level="INFO"/>
  • name: 用来指定受此loger约束的某一个包或者具体的某一个类。
  • level :用来设置打印级别,与大小写无关:TRACE, DEBUG, INFO, WARN,ERROR,ALLOFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity: 是否向上级logger传递打印信息。默认是true。可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger

root

子节点<root>:它也是<logger>元素,但是它是根loger,是所有<loger>的上级。只有一个level属性,因为name已经被命名为root,且已经是最上级了。

<logger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger

示例:

<root level="INFO">
    <appender-ref ref="console"/>
    <appender-ref ref="rollingFile"/>
</root>

timestamp

两个属性:

  • key: 标识此<timestamp>的名字;
  • datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

示例:将解析配置文件的时间作为上下文名称

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>   
      <contextName>${bySecond}</contextName>  
      <!-- 其他配置省略-->  
</configuration>

appender

appender意思是输出目的地,负责写日志的组件,它有两个必要属性nameclassname指定appender名称,class指定appender的全限定名。

示例:

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> 

ConsoleAppender

ConsoleAppender 把日志输出到控制台,有以下子节点:

  • <encoder>:对日志进行格式化。
  • <target>:字符串System.out(默认)或者System.err

示例:

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
                    <!-- 1格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_LOG_ID}] %-5level %logger{36} --%mdc{client} - %msg%n
            </pattern>
        </encoder>
</appender>

<pattern>示例说明:

xxxx-xx-xx 16:49:09.390 [http-nio-8081-exec-1] [c4f0f235-bb60-436c-b723-23c369981800] INFO  c.xxxx.xxx.common.log.WebLogAspect -- - {""method":"GET"".....}

FileAppender

FileAppender把日志添加到文件,有以下节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是true,即使其他的FileAppender也在向此文件做写入操作,日志会被安全的写入文件,效率低,默认是false

示例:将DEBUG级别及以上的日志都输出到./logs/admin.log

<configuration>
    <property name="log.path" value="./logs/admin.log"/>
    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <append>true</append>
        <prudent>false</prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>
                ${log.path}.%d{yyyy-MM-dd}.log
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_LOG_ID}] %-5level %logger{36} --%mdc{client} -
                %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="DEBUG"> 
        <appender-ref ref="FILE"/>
    </root>
</configuration>

RollingFileAppender

RollingFileAppender滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
  • <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略。TimeBasedRollingPolicy为最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。SizeBasedTriggeringPolicy根据文件大小触发当前文件滚动。FixedWindowRollingPolicy根据固定窗口算法重命名文件的滚动策略。
  • <encoder>:对记录事件进行格式化。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/export/home/tomcat/domains/search.xxxx.com/server/logs/search-api.log
        </file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>
                /export/home/tomcat/domains/search.xxxx.com/server/logs/search-api.log.%d{yyyy-MM-dd}.log
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="rollingFile"/>
    </root>
</configuration>

日志级别

logback

Logback分为五个日志级别,级别顺序由低到高分为:

优先级由高到低依次为:ERROR > WARN > INFO > DEBUG > TRACE

  • TRACE 级别最小,打印信息最为详细,一般不使用。
  • DEBUG,需要在调试过程中输出的信息,但发布后是不需要的。
  • INFO,需要持续输出的信息(无论调试还是发布状态)。
  • WARN,警告级别的信息(不严重)。
  • ERROR, 错误信息(较严重)。

log4j

log4j定义了8个级别的log(除去OFFALL分为6个级别):

优先级从高到低依次为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

  • ALL ,最低等级,用于打开所有日志记录。
  • TRACE , 很低的日志级别, 一般不会使用。
  • DEBUG ,指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
  • INFO ,消息在粗粒度级别上突出强调应用程序的运行过程打印一些重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志
  • WARN ,表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
  • ERROR ,指出虽然发生错误事件,但仍然不影响系统的继续运行,打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
  • FATAL ,指出每个严重的错误事件将会导致应用程序的退出,这个级别比较高,重大错误,这种级别可以直接停止程序了。
  • OFF , 最高等级的,用于关闭所有日志记录。

如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如:

如果设置优先级为WARN, 那么OFFFATALERRORWARN 4个级别的log能正常输出而INFODEBUGTRACEALL级别的log则会被忽略。

相关推荐

微信扫一扫,分享到朋友圈

【Java 知识】LogBack 节点详解
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close