Java日志框架Logback介绍和使用

前置知识:

日志门面SLF4J介绍和使用

Logback概述

Logback是由log4j、slf4j创始人Ceki Gülcü设计的另一个开源日志组件,性能比log4j要好。它自然地实现了slf4j规范。

Logback主要分为三个模块:

  • logback-core:logback的核心模块,也是其它两个模块的基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4jAPI
  • logback-access: 访问模块与Servlet容器集成提供通过Http来访问日志的功能

Logback的核心组件:

  • Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
  • Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
  • Layout:负责把事件转换成字符串,格式化的日志信息的输出。在 logbackLayoutencoder中对象被封装在中。

Logback使用

maven依赖:

这里使用slf4j来管理

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

Logback配置

logback会依次读取以下类型配置文件:
+ logback.groovy
+ logback-test.xml
+ logback.xml

如果均不存在会采用默认配置

logback官方提供的log4j配置转logback配置工具:http://logback.qos.ch/translator/

基本配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
    <property name="log_dir" value="/logs"></property>

    <!-- 控制台日志输出的 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 控制输出流对象,默认System.out改为System.err-->
        <target>System.err</target>
        <!-- 日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>{pattern}</pattern>
        </encoder>
    </appender>

    <!-- 日志文件输出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!-- 日志文件保存路径 -->
        <file>{log_dir}/logback.log</file>
        <!-- 日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- root logger 配置-->
    <root level="ALL">
        <appender-ref ref="console"></appender-ref>
        <appender-ref ref="file"></appender-ref>
    </root>
</configuration>

pattern常用转换符:

  • %c/%logger:输出日志的logger名,可有一个整形参数,功能是缩短logger名,例如%logger{5}
  • %cn:输出上下文名称。
  • %d{pattern}:输出日志的打印日志,模式语法与java.text.SimpleDateFormat兼容。
  • %p/%le/%level:输出日志级别。
  • %t/%thread: 输出产生日志的线程名。
  • %n:输出平台相关的分行符“\n”或者“\r\n”。
  • %m/%msg/%message:输出应用程序提供的信息。
  • %L/%line:输出执行日志请求的行号。

使用HTML格式输出:

<!-- 日志文件输出的 appender-->
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
    <!-- 日志文件保存路径 -->
    <file>${log_dir}/logback.html</file>
    <!-- 日志消息格式配置-->
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
        </layout>
    </encoder>
</appender>

动态刷新配置

根节点configuration可以配置两个属性:

  • scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。

通过配置这两个属性,可以在系统运行时修改logback的配置而不需要重写部署,例如修改日志级别

<configuration scan="true" scanPeriod="60 seconds">
<!-- ... -->
</configuration>

日志拆分和归档压缩的appender

<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 日志文件保存路径 -->
    <file>{log_dir}/roll_logback.log</file>
    <!-- 日志消息格式配置-->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>{pattern}</pattern>
    </encoder>
    <!-- 指定拆分规则 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 按照时间和压缩格式声明拆分的文件名 -->
        <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
        <!-- 按照文件大小拆分 -->
        <maxFileSize>1MB</maxFileSize>
    </rollingPolicy>
</appender>

过滤器

写在Appender中

级别过滤器:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <!-- 日志过滤规则 -->
    <level>ERROR</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

其他的还有ThresholdFilter(临界值过滤器)、EvaluatorFilter(求值过滤器)等。

异步日志

<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 指定某个具体的appender -->
    <appender-ref ref="file"></appender-ref>
</appender>

自定义Logger

<!-- 自定义logger对象
    additivity:是否继承自rootLogger
-->
<logger name="com.rhett.consoleLogger" level="INFO" additivity="false">
    <appender-ref ref="console"></appender-ref>
</logger>

logback-access的使用

logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。我们可以使用logback-acces模块来替换tomcat的访问日志。

步骤:

  1. logback-access.jarlogback-core.jar复制到$TOMCAT_HOME/lib/目录下
  2. $TOMCAT_HOME/conf/server.xml中的Host元素中添加:
<Value className="ch.qos.logback.access.tomcat.LogbackValue" />
  1. logback默认会在$TOMCAT_HOME/conf下查找文件logback-access.xml

示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- always a good activate OnConsoleStatusListener-->
    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>

    <property name="LOG_DIR" value="{catalina.base}/logs"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>{LOG_DIR}/access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>access.%d{yyyy-MM-dd).log.zip</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <pattern>combined</pattern>
        </encoder>
    </appender>

    <appender-ref ref="FILE"/>
</configuration>

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/java%e6%97%a5%e5%bf%97%e6%a1%86%e6%9e%b6logback%e4%bb%8b%e7%bb%8d%e5%92%8c%e4%bd%bf%e7%94%a8/

发表评论

电子邮件地址不会被公开。