首页 > 其他分享 >logback.xml详解

logback.xml详解

时间:2022-10-16 13:55:23浏览次数:74  
标签:xml logger log additivity 详解 日志 logback appender

介绍

之前博文有专门介绍过基于Log4j Appender 实现大数据平台组件日志的采集, 本篇主要对java项目中经常会接触到的logback.xml文件的配置做一个介绍和总结.

logback.xml 配置

下面是一个logback配置demo, 常用的配置都有, 一一介绍下每个配置的作用.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<property name="LOG_HOME" value="d:/opt/module/logs" />
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
		    <pattern>%msg%n</pattern>
		</encoder>
	</appender>
	<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${LOG_HOME}/app.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		     <fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
		    <pattern>%msg%n</pattern>
		</encoder>
	</appender>
	<!-- 将某一个包下日志单独打印日志 -->
	<logger name="com.bigdata.logger.LoggerExample"
	level="INFO" additivity="false">
		<appender-ref ref="rollingFile" />
		<appender-ref ref="console" />
	</logger>
	<root level="error" additivity="false">
	    <appender-ref ref="console" />
	</root>
</configuration>

配置说明:

  • property
    定义属性,类似全局变量, 比如上面我们定义的LOG_HOME 日志写入路径文件路径, 下面的appender 可以直接引用

  • appender
    追加器,描述如何写入到文件中(写在哪,格式,文件的切分)
    ConsoleAppender--追加到控制台
    RollingFileAppender--滚动追加到文件
    encoder: 对日志进行格式化。
    rollingPolicy:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名.TimeBasedRollingPolicy 是根据时间制定滚动策略,
    fileNamePattern:文件输出格式

  • logger
    控制器,描述如何选择追加器
    注意:要是单独为某个类指定的时候,要修改类的全限定名
    appender-ref: 引用前面定义的appender
    level="error": 定义输出的日志级别, 低于此日志级别的日志不会输出
    additivity="false": 这个稍微不太好理解, 下面我写个代码, 实操下.

  • 日志级别
    TRACE->DEBUG ->INFO -> WARN -> ERROR -> FATAL
    从左到右, 由到高

  • root
    根级别日志

实战code

项目结构:

image

maven 配置:

 <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.6</version>
        </dependency>

        <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.6</version>
        </dependency>
    </dependencies>

测试代码:

public class LoggerExample {
    private static final Logger logger = LoggerFactory.getLogger(LoggerExample.class);
    public static void main(String[] args) {
        logger.info("Example log from {}", LoggerExample.class.getSimpleName());
        logger.error("Error log");
    }
}

直接运行的结果:

image
console和app.log文件的结果一样

修改 additivity="true

<logger name="com.bigdata.logger.LoggerExample" level="INFO" additivity="true">

再次运行结果:
image

image

可以看出app.log正常, 但是cosole 上打印了重复的日志, 说明命中了console appender两次, log和root 各一次, 但是奇怪的是, 第一条info日志为什么会重复, 因为root level="ERROR", 理论上info 日志级别比ERROR级别要低, 不应该在console里出现才对.

我们看下logback相关的源码是如何处理的.

https://github.dev/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java#L256


    /**
     * Invoke all the appenders of this logger.
     * 
     * @param event The event to log
     */
    public void callAppenders(ILoggingEvent event) {
        int writes = 0;
        for (Logger l = this; l != null; l = l.parent) {
            writes += l.appendLoopOnAppenders(event);
            if (!l.additive) {
                break;
            }
        }
        // No appenders in hierarchy
        if (writes == 0) {
            loggerContext.noAppenderDefinedWarning(this);
        }
    }

从代码我们可以看出, logback 的整个输出是从logger子节点开始往上遍历, 如果additive = false, 就直接break 循环直接结束, 如果break = true, 会继续往上寻找父节点,直到最终 l == null. 同时会记录writes, writes == 0,认为没有定义appender输出源

代码没有关于日志级别的控制. 所以以后如果只希望打印日志到子节点的appeder, 父节点的appender忽略, 就设置additivity = false, 默认值为true, 这样日志就不会重复了.

总结

主要对logback.xml 常用配置的作用介绍, 通过logback 的相关源码对additivity参数有了更深的认识. additivity 默认值为true, 如果不希望在某些场景下打印重复的日志, 可以设置为false, additivity 配置不受level配置的影响.

标签:xml,logger,log,additivity,详解,日志,logback,appender
From: https://www.cnblogs.com/bigdata1024/p/16795806.html

相关文章

  • 接口测试工具-Postman使用详解
    前公司有个说法叫做狗粮环境,什么叫做狗粮环境,就是搭建环境自己测试自己的代码,算法很多时候写好后是通过restful接口对外使用,接口测试就要引出一个利器-Postman.1、安装postm......
  • Matplotlib基础图 图形详解
    Matplotlib图形详解一,全局的设置importmatplotlibasmpl#设置中文字体的显示问题mpl.rcParams['font.family']='SimHei'#文本在图上的任意位置显示plt.text(13,......
  • 详解降维-主成分分析-概率角度(Probabilistic PCA)【白板推导系列笔记】
    教科书对PCA的推导一般是基于最小化重建误差或者最大化可分性的,或者说是通过提取数据集的结构信息来建模一个约束最优化问题来推导的。事实上,PCA还有一种概率形式的推导,那......
  • 详解支持向量机-硬间隔SVM-模型定义【白板推导系列笔记】
    支撑向量机(SVM)算法在分类问题中有着重要地位,其主要思想是最大化两类之间的间隔。按照数据集的特点:1. 线性可分问题,如之前的感知机算法处理的问题2. 线性可分,只有一点......
  • XML格式文件转JSON
    XML格式转json格式,需要用到xmltodict库。安装:pipinstallxmltodictimportxmltodictimportjsonxmlStr="""<?xmlversion="1.0"encoding="UTF-8"?><student......
  • RAID5 IO处理之重构代码详解
    1作用当阵列降级时,可以添加一块新盘进行重构,以恢复阵列的冗余。2发起重构可以通过以下命令md并发起重构:mdadm-C/dev/md0--force--run-l5-n3-c128K/dev/sd......
  • RAID5 IO处理之replace代码详解
    1作用从字面意思理解,replacement即是替换。我们知道硬盘都有一定的使用寿命,可以在硬盘失效之前通过该功能将就盘的数据迁移至新盘。因为replacement的流程是从旧盘中读出......
  • RAID5 IO处理之写请求代码详解
    我们知道RAID5一个条带上的数据是由N个数据块和1个校验块组成,其校验块由N个数据块通过异或运算得出,这样才能在任意一个成员磁盘失效时通过其他N个成员磁盘恢复出用户写入的......
  • RAID5 IO处理之条带读代码详解
    除了对齐读流程中读失败通过条带重试的场景会进入到条带读,当IO覆盖范围超过一个chunk时也会进入条带读(如向chunk为4K的RAID下发起始位置为1K大小为4K的IO),接下来我们就这部......
  • SpringBoot Logback统一日志处理
    一、日志 1、配置日志级别日志记录器(Logger)的行为是分等级的。如下表所示:分为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL默认情况下,springboot从控制台打印出来的......