深入理解并详解Logback配置
最编程
2024-02-23 22:49:21
...
1、Java日志体系(目前常用)
- slf4j:由log4j的作者开发,本身不替供日志具体实现,只对外提供接口或门面。
- logback:slf4j的作者开发的的slf4j的实现,优于log4j。
- log4j2:由Apache开发,参考了logback,并做了一些优化。
- jdk自带的JUL(java.util.logging)和Apache的JCL(Jakarta Commons Logging)好像不太常用了。
2、slf4j和常用日志实现组件的适配
- slf4j + logback:slf4j-api.jar + logback-classic.jar + logback-core.jar
- slf4j + log4j:slf4j-api.jar + slf4j-log4j12.jar + log4j.jar
3、logback的模块
- logback-core:其它两个模块的基础模块。
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j api。
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。
4、logback的详细配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
debug 是否打印logback自身运行时的信息,通常是不需要的,所以要设置为false。
scan 配置文件发生改变是否自动加载。
scanPeriod 检测配置文件的时间间隔,默认为1 minute,默认单位为second。
xsd备份地址:http://static.harmonytqs.top/source/logback.xsd,防止别人的被墙了无法加载。
-->
<configuration
xmlns="http://ch.qos.logback/xml/ns/logback"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd"
debug="false"
scan="true"
scanPeriod="2 minute">
<!--定义日志输出位置-->
<property name="log.filepath" value="D:\\My Projects\\IDEA\\JavaSE\\log\\src\\main\\resources\\log"/>
<!--定义日志展示格式
%d{yyyy-MM-dd HH-mm-ss} 日期时间
[%thread] 线程名称
%-5level 格式化占位5个,打印日志级别,因为要保持缩进。
%logger{100} 打印是在哪个类(全类名)里面记录的日志,{100}表示打印类名的长度最大为100
%msg 日志信息
%n 换行-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH-mm-ss} [%thread] %-5level %logger{100} %msg%n"/>
<!--控制台日志-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--日志输出格式-->
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--不同级别的日志的输出媒介
级别:trace < debug < info < warn < error
一般只需记录debug、info、error三个级别的日志,且需放在不同的文件中。-->
<!--debug日志
RollingFileAppender:滚动日志,可以按天、按月生成日志文件-->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/debug.log</file>
<!--定义滚动策略
TimeBasedRollingPolicy:基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置每分钟生成文件,{yyyy-MM-dd_HH-mm}写到哪一级就按哪一级精确生成日志文件。
例如:每天生成一个日志文件就应该写成 {yyyy-MM-dd}
如果文件名以.gz结尾,logback为自动压缩日志文件,不需要压缩的话不写即可。-->
<fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd_HH-mm}.log.gz</fileNamePattern>
<!--设置保存日志文件的最大数量-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<!--日志格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<!--过滤器:过滤指定级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<!--如果是debug级别的日志,记录-->
<onMatch>ACCEPT</onMatch>
<!--如果不是debug级别的日志,忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--info日志-->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.filepath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd_HH-mm}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--error日志-->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.filepath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd_HH-mm}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--根日志记录器,所有包下面的日志都会别记录-->
<root level="INFO">
<appender-ref ref="consoleAppender"/>
</root>
<!--配置记录日志的包,只有该包下面的类的日志才会别记录。
level="DEBUG"指定日志记录的级别,不指定将自动继承根日志记录器。-->
<logger name="top.harmonytqs" level="DEBUG">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
</configuration>
5、注意事项
- 可以在日志记录器中配置filter,用于拒绝根记录器抛出的低级别的日志
<!--控制台日志-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--日志输出格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!--根日志记录器,所有包下面的日志都会别记录-->
<root level="INFO">
<appender-ref ref="consoleAppender"/>
</root>
此时控制台只会打印ERROR级别的日志
Q.E.D.
推荐阅读
-
从理解到深入虚拟 DOM 并实施差异算法
-
[yolov3 详解] 一文让您阅读并理解 yolov3 目标检测原理
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
深入理解并剖析高性能 Golang 网络库 evio 的源代码
-
理解并实际运用三坐标测量中的公共基准——共面基准详解(第一部分)
-
玩转Kotlin性能测试:JMH入门指南一 - 测试基础" "深入理解JMH在Kotlin中的应用:基准测试实战解析" "轻松实践Kotlin基准测试:JMH工具详解与实例总结
-
理解并操作MySQL事务:详解与实践指南
-
深入理解与剖析SQL Server事务:特性、详解与优缺点探讨
-
深入理解MySQL(关系型数据库):高级篇-事务详解
-
深入理解 MySQL 事务操作详解