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/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年3月9日 20:43
下一篇 2020年3月10日

相关推荐

  • 日志门面介绍和JCL使用

    日志门面概述 之前有写过Java日志框架JUL和Log4j介绍,可以对比发现它们之间的使用还是有一些区别的,比如有一些类名是不同的、日志的输出级别也不完全一致。 那么实际上是增大了…

  • HashMap源码分析

    HashMap是java中非常常见的一个数据结构,在这篇文章里,我依然以Map中的操作为导向来循序渐进研究HashMap中的源码,阅读这篇文章需要的前置知识有: 弱平衡的二叉查找树…

    Java 2020年2月12日
    0220
  • 深入理解java虚拟机第三版读书笔记02

    以下是第二章 Java内存区域与内存溢出异常的内容 运行时数据区域 程序计数器 特点 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 程序计数器是…

    2020年1月5日
    0200
  • 线程内部的run方法可以向外抛出异常吗?

    提出问题 线程的run方法向外可以抛出异常吗,或者能被主线程捕获异常吗?比如下面这段代码: public static void main(String[] args) { try…

    Java 2020年5月20日
    06520
  • 深入理解java虚拟机第三版读书笔记11

    以下是第十一章 后端编译与优化的内容 把Class文件转换成与本地基础设施(硬件指令集、操作系统)相关的二进制机器码可以视为整个编译过程的后端。 最近几年提前编译也开始兴起,我们在…

    2020年1月27日
    0290
  • CountDownLatch及CyclicBarrier源码分析

    之前写的一篇博客JUC包下的线程协作计数CountDownLatch及CyclicBarrier只是介绍了一下这两个工具类的用法,并没有深入探究源码,然而实现方法也比较简单,所以合…

    Java 2020年5月22日
    0140
  • ThreadLocal源码分析和相关理解

    总结 总结放前面防止太长不看: 每个线程都有一个threadLocals字段,是一个ThreadLocalMap的实例,所有的ThreadLocal代表的线程私有数据都存放在这里面…

    Java 2020年2月13日
    0210
  • 遗留线程安全类Vector和HashTable简要源码分析

    总结 总结放前面防止太长不看 Vector Vector就是使用synchronized限制线程安全的一个List实现。 Vector是基于数组实现的,默认初始容量是10,在构造的…

    Java 2020年2月15日
    0690
  • Java线程池详解

    线程池就是享元模式和生产者消费者模式的应用 动手实现线程池 步骤1:自定义拒绝策略接口 @FunctionalInterface // 拒绝策略 interface RejectP…

    2020年2月3日
    0310
  • Java基础查缺补漏04

    继续我的复习刷题 接口方法可以使用abstract修饰 问题: java接口的方法修饰符可以为?(忽略内部接口) A. privateB. protectedC. finalD. …

    Java 2020年5月28日
    0200

发表回复

登录后才能评论