Java日志框架:log4j、log4j2、logback

news2025/2/26 3:04:10

文章目录

    • 配置文件相关
      • 1. properties
        • 测试
      • 2. XMl
        • 使用Dom4j解析XML
    • Log4j与Log4j2
      • 日志门面
    • 一、Log4j
      • 1.1 Logges
      • 1.2 Appenders
      • 1.3 Layouts
      • 1.4 使用
      • 1.5 配置文件详解
        • 1.5.1 配置根目录
        • 1.5.2 配置日志信息输出目的地Appender
        • 1.5.3 输出格式设置
    • 二、Log4j2
      • 2.1 XML配置文件解析
      • 2.2 使用
    • 三、LogBack
      • 3.1 logback模块
      • 3.2 logback组件
      • 3.3 logback配置
      • 3.4 使用

配置文件相关

1. properties

用来代表属性文件,通过Properties可以读写配置文件的内容。

  • 构造方法
    public Properties():用于构建Properties集合对象(空容器)
  • 常用方法
方法说明
public void load(InputStream is);通过字节输入流,读取配置文件里的键值对数据
public void load(Reader reader);通过字符输入流,读取属性文件里的键值对数据
public String getProperties(String key);根据键获取值
public Set<String> stringPropertyNames();获取全部键的集合
public Object setProperty(String key, String value);保存键值对数据到Properties对象中
public void store(OutputStream os, String comments);把键值对数据,通过字节输出流写出到属性文件里去
public void store(Writer w, String comments);把键值对数据,通过字符输出流写出到属性文件里去
测试

在这里插入图片描述

@Log4j2
public class TestProperties {

    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileReader("src\\main\\resources\\user.properties"));
        properties.setProperty("like", "跳舞");
        properties.forEach((k,v)->{
            System.out.println(k + "--》" + v);
        });
    }
}

在这里插入图片描述

2. XMl

Extensible Markup Language,可扩展标记语言。
本质是一种数据格式,可以用来存储复杂的数据结构和数据关系。

特点:

  • XML中的标签名称为一个标签或者一个元素,一般成对出现。
  • XML中的标签名可以自己定义,但是需要正确的嵌套。
  • XML中只能有一个根标签。
  • XML中的标签可以有属性。
  • 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml

语法规则:

  • XML文件的后缀名为:.xml,文档声明必须是第一行。
  • XML中可以定义注释信息:<!-- 注释内容 -->
  • XML中书写<、>可能会报错,导致冲突。可以用特殊字符代替。
字符说明
&lt;小于 <
&gt;大于 >
&amp;和 and
&apos;单引号 ’
&quot;引号 "
  • XML中可以书写CDATA数据区,里面内容不受格式限制。
    <![CDATA[ ...内容]]>
使用Dom4j解析XML
  • SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架。
构造器说明
public SAXReader();构建Dom4j的解析器对象
public Document read(String url);把XML文件读取成Document对象
public Document read(InputStream is);通过字节输入流读取XML文件
方法说明
public getRootElement();获取根元素对象
public String getName();得到元素名字
public List<Element> elements();得到当前元素下所有子元素
public List<Element> elements(String name);得到当前元素下指定名字的子元素返回集合
public Element element(String name);得到当前元素下指定名字的子元素,如果有多个名字相同的返回第一个
public String attributeValue(String name);通过属性名直接得到属性值
public String elementTest(子元素名);得到指定名称的子元素的文本
public String getText();得到文本

Log4j与Log4j2

log4j2是log4j 1.x的升级版。2015年5月,apache宣布log4j 1.x停止更新。最新版本为1.2.17。

日志框架出现的历史顺序:log4j->JUL->JCL->slf4j->logback->log4j2

log4j2参考logback的一些优秀设计,并且修复了一些问题,带来一些重大提升。主要有:

  1. 异常处理。在logback中,Appender中的异常不会被应用感知。但是在log4j2中提供了一些异常处理机制。
  2. 性能提升。log4j2相较于log4j和logback都具有很明显的性能提升。
  3. 自动重载配置。参考了logback设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。
  4. 无垃圾机制。log4j2在大部分情况下,可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jmv gc。
    补充:
    Java虚拟机(JVM)的垃圾回收(GC)是Java语言的一个重要特性,它允许开发者编写代码时不需要手动管理内存的分配和回收。垃圾回收器(Garbage Collector,简称GC)会自动找出不再使用的对象,并将它们占用的内存回收,以供新的对象使用

日志门面

用户可以使用日志门面,根据需求,动态选择具体的日志实现框架。可以实现所有日志实现框架有统一的规范。

  • 面向接口开发,不再依赖具体的实现类,减少代码的耦合
  • 项目通过导入不同的日志实现类,可以灵活的切换日志框架
  • 统一API,方便开发者学习和使用
  • 统一配置,便于项目日志管理

在这里插入图片描述

一、Log4j

三大主要组件/对象:Loggers(记录器)、Appenders(输出源)、Layouts(布局)
每条日志语句都要设置一个等级:DEBUG、INFO、WARN、ERROR、FATAL

优先级从高到低依次为:OFF(关闭)、FATAL(严重错误信息)、ERROR(错误信息)、WARN(警告信息)、INFO(一般信息)、DEBUG(调试信息)、TRACE、 ALL(所有信息)。

1.1 Logges

在设置日志输出位置的时候,会给位置设置一个级别。只有大于此级别的日志才会打印输出到指定位置。
例如:给日志等级设置为INFO,则INFO、WARN、ERROR、FATAL级别的日志才会打印,DEBUG日志则不会打印。

1.2 Appenders

禁用和使用日志请求是log4j的基本功能,log4j允许把日志输出到不同的地方。例如:控制台(Console)、文件(Files)等。还可以根据天数或者文件大小产生新的文件,可以以流的形式将日志发送到其他地方。

常用类:

说明
org.apache.log4j.ConsoleAppender控制台
org.apache.log4j.FileAppender文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.WriterAppender将日志信息以流格式发送到任意指定的地方

1.3 Layouts

用户可以根据自己的喜好格式化输出自己的日志文件。
Layouts提供四种日志输出样式:根据HTML样式、自由指定样式、包含日志级别与信息的样式、包含日志时间、线程、类别等信息的样式。

常用类:

说明
org.apache.log4j.HTMLLayout以HTML表格形式布局
org.apache.log4j.PatternLayout灵活指定布局模式
org.apache.log4j.SimpleLayout包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout包含日志产生的时间、线程、类别等信息

1.4 使用

  1. 导入POM依赖
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
  1. 创建配置文件
    日志配置文件:log4j.properties文件或者logback.xml
### 日志的输出级别是debug,输出位置名字叫做stdout,D
log4j.rootLogger = debug,stdout,D

#### 输出DEBUG级别以上的日志到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
# 指定日志级别
log4j.appender.stdout.Threshold = DEBUG
# 是否即时生效
log4j.appender.stdout.ImmediateFlush = true
# 日志编码格式
log4j.appender.stdout.Encoding = UTF-8
# 以特定格式输出日志
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 设置日志格式,%d,%m是输出代码中指定的消息的占位符
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p:%F:%L ]  %m%n

#### 输出WARNING级别以上的日志到文件
log4j.appender.D=org.apache.log4j.FileAppender
# 日志路径
log4j.appender.D.File =D:/logtest/error.log
# 日志以追加方式输入
log4j.appender.D.Append = true
# 指定日志级别
log4j.appender.D.Threshold = WARN
# 是否即时生效
log4j.appender.D.ImmediateFlush = true
# 日志编码格式
log4j.appender.D.Encoding = UTF-8
# 以特定格式输出日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
# 设置日志格式,%d,%m是输出代码中指定的消息的占位符
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p:%F:%L ]  %m%n

  1. 测试
package com.example.log;

import org.apache.log4j.Logger;
import org.junit.Test;

public class TestLog {

    // 获取日志记录器,此纪录器将负责控制日志信息。Name一般是当前类的名字
    Logger logger = Logger.getLogger(TestLog.class);

    @Test
    public void testLog() {
        logger.debug("这是一条debug信息");
        logger.info("这是一条info信息");
        logger.warn("这是一条warn信息");
        logger.error("这是一条error信息");
        logger.fatal("这是一条fatal信息");

        try {
            int i = 12 / 0;
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }
}

  1. 效果
    在这里插入图片描述
    在这里插入图片描述

1.5 配置文件详解

1.5.1 配置根目录
log4j.rootLogger = [level],appenderName,appenderName...
  • level:是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或自定义的级别。
    log4j建议只使用4个级别,优先级从高到低分别是:EOOR、WARN、INFO、DEBUG。通过级别定义,可以控制到应用程序中相应级别日志信息的开关。例如定义了INFO级别,则应用程序中所有DEBUG日志信息将不会被打印出来。
  • appenderName:指定日志信息输出到什么地方,可以同时指定多个输出目的地。
1.5.2 配置日志信息输出目的地Appender

log4j提供的appender有以下几种:

说明
org.apache.log4j.ConsoleAppender控制台
org.apache.log4j.FileAppender文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.WriterAppender将日志信息以流格式发送到任意指定的地方
  • ConsoleAppender选项:
    Threshold=WARN;指定日志消息输出的最低层次。
    ImmediateFlush=true;默认是true,所有消息是否立即输出。
    Target=System.err;默认情况下是System.out,指定输出到控制台。
    
  • FileAppender选项:
    Threshold=WARN;指定日志消息输出的最低层次。
    ImmediateFlush=true;默认是true,所有消息是否立即输出。
    File=mylog.txt;指定消息输出到mylog.txt文件。
    Append=false;默认是true,即消息追加到指定文件中,false指将消息覆盖指定的文件内容。
    
  • DailyRollingFileAppender选项:
    Threshold=WARN;指定日志消息输出的最低层次。
    ImmediateFlush=true;默认是true,所有消息是否立即输出。
    File=mylog.txt;指定消息输出到mylog.txt文件。
    Append=false;默认是true,即消息追加到指定文件中,false指将消息覆盖指定的文件内容。
    DatePattern='.'yyyy-ww 每周滚动一次文件,即每周产生一个新的文件。
    	1)'.'yyyy-MM:每月
    	2)'.'yyyy-ww:每周
    	3)'.'yyyy-MM-dd:每天
    	4)'.'yyyy-MM-dd-a:每天两次
    	5)'.'yyyy-MM-dd-HH:每小时
    	6)'.'yyyy-MM-dd-HH-mm:每分钟
    
  • RollingFileAppender选项:
    Threshold=WARN;指定日志消息输出的最低层次。
    ImmediateFlush=true;默认是true,所有消息是否立即输出。
    File=mylog.txt;指定消息输出到mylog.txt文件。
    Append=false;默认是true,即消息追加到指定文件中,false指将消息覆盖指定的文件内容。
    MaxFileSize=100KB;后缀可以是KBMB或者GB。在文件日志到达该大小时,将会自动滚动,即将原来的内容移动到mylog.log.1文件。
    MaxBackupIndex=2;指定可以产生的滚动文件的最大数
    
1.5.3 输出格式设置

在配置文件中通过log4j.appender.A1.layout.ConversionPattern设置日志的输出格式。

参数说明
%p输出日志信息优先级,即DEBUG、INFO、WARN、ERROR、FATAL
%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似 2024年1月1日 12:00:00,921
%r输出自应用启动到输出该log信息耗费的毫秒数
%c输出日志信息所属的类目,通常就是所在类的全名
%t输出产生该日志事件的线程名
%l输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数
%x输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到相Java Servlets这样的多客户多线程的应用中
%%输出一个’%'字符
%F输出日志消息产生时所在的文件名称
%L输出代码中的行号
%m输出代码中指定的消息,产生的日志具体信息
%n输出一个回车换行符,windows平台为’/r/n’,unix平台为‘\n’输出信息换行

二、Log4j2

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式。2.x版本常用.xml后缀的文件进行配置,除此之外还包含.json和.jsn配置文件。

  • log4j2虽然采用xml风格进行配置,依然包含三大组件。Logger(记录器)Appender(输出目的地)Layout(日志布局)
  • 配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件。

2.1 XML配置文件解析

  1. 根节点Configuration有两个属性:statusmonitorinteval,有两个子节点AppendersLoggers(可以定义多个AppenderLogger
    • stataus:指定log4j本身的打印日志的级别
    • monitorinterval:为log4j 2.x 新特性,自动重载配置,指定自动重载配置的间隔时间,单位是s,最小是5s。
  2. Appenders节点,常见的有三种子节点:Console、File、RollingFile
    • Console节点:定义输出到控制台的Appender。
    • File节点:定义输出到指定位置的文件的Appender。
    • RollingFile节点: 定义超过指定大小自动删除旧的创建新的Appender。

通过在子节点加入<patternLayout pattern=”自定义信息格式“/> 进行日志布局。

占位符解释
%c输出logger名称
%C输出类名
%d{HH:mm:ss.SSS}表示输出到毫秒的时间
%t输出当前线程的名称
%-5level输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger输出logger名称
%msg日志文件
%n换行

其他常用占位符有:

占位符解释
%F输出所在的类文件名,如Log4j2Test.java
%L输出行号
%M%method输出所在方法名
%l输出完整的错误位置,包括类名、方法名、文件名、行数
%p该条日志的优先级
%replace{pattern}{regex}{substitution}将pattern的输出结果pattern按照正则表达式regex替换为substitution
  1. Loggers节点

常见的Loggers节点有两种:Root和Logger

  • Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
  • Logger节点用来单独指定日志的形式,比如要为指定报下的class指定不同的日志级别等。

2.2 使用

测试是新建的SpringBoot项目

  1. 导入POM依赖
<!-- 排除 Spring-boot-starter 默认的日志配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
  1. 创建配置文件
    2.1 如果配置文件名是log4j2-spring.xml,则不用再另外配置,会自动检测到该配置文件
    2.2 如果配置文件名是自定义的,需要在application.yml中另外配置

    logging:
    	config: log4j2.xml
    	level:
    		cn.jay.repository: trace
    

    在这里插入图片描述

  2. 配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--变量配置-->
    <Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [第%L行] - %msg%n" />
        <!-- 定义日志存储的路径 -->
        <property name="FILE_PATH" value="D:\logtest" />
        <property name="FILE_NAME" value="testlog" />
    </Properties>

    <appenders>

        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="FileLog" fileName="${FILE_PATH}/test.log" append="false">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

    </appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="FileLog"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

  1. 测试
package com.example.log;

import lombok.extern.log4j.Log4j2;

@Log4j2
public class TestLog {

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            log.trace("这是一个trace日志");
            log.debug("这是一个debug日志");
            log.info("这是一个info日志");
            log.warn("这是一个warn日志");
            log.error("这是一个error日志");
            log.fatal("这是一个严重错误日志");
        }
    }
}

在这里插入图片描述

三、LogBack

官网网站

3.1 logback模块

  • logback-core:其他两个模块的基础模块
  • logback-class:log4j的改良版本,完整实现了Slf4j API
  • logback-access:访问模块于servlet容器集成提供通过Http来访问日志的功能

3.2 logback组件

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

3.3 logback配置

logback会依次读取以下类型配置文件

  1. logback.grovy
  2. logback-test.xml
  3. logback.xml

3.4 使用

spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 Logback+SLF4J。而 spring-boot-starter-web 包含了spring-boot-starte,所以只需要引入web组件即可。

  1. 引入POM依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. resources下新建logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="./logs" />
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{26} - [%method,%line] - %msg%n" />

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 优先级从高到低依次为:OFF(关闭)、FATAL(严重错误信息)、ERROR(错误信息)、WARN(警告信息)、INFO(一般信息)、DEBUG(调试信息)、TRACEALL(所有信息)-->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60-->
            <maxHistory>60</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="trace">
        <appender-ref ref="console" />
    </root>

    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>

    <!-- 系统模块日志级别控制  -->
    <logger name="com.example.demo" level="trace" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
</configuration>

在这里插入图片描述

  1. 测试
public class TestLog {

    private static final Logger log = LoggerFactory.getLogger(TestLog.class);

    public static void main(String[] args) {
        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warn");
        log.error("error");
    }
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言(一)——初识C语言

目录 简单认识一段代码 数据类型 变量和常量 变量的作用域和变量的生命周期 常量 字符串 转义字符 注释 函数 数组 操作符 关键字 结构体 结构的声明 结构成员的类型 结构体变量的初始化 结构体传参 简单认识一段代码 main()函数是程序的入口&#xff0c;所以…

创新领先+效率领先,助力中国九牧加速品牌全球化

2024年&#xff0c;在全球市场经济和国家政策的双重驱动下&#xff0c;中国企业正在加速出海。 从早期粗放式的贴牌代工&#xff0c;到凝聚技术、产品、营销力的自主品牌出海&#xff0c;中国企业在国内市场对国际品牌上演过的追赶-超越戏码&#xff0c;如今正在海外市场上演。…

基于单片机的噪音检测系统(论文+源码)

1整体方案设计 2.2.1功能设计 本课题为噪音分贝仪&#xff0c;在功能上设计如下&#xff1a; 1.可以准确的识别周围环境的噪声大小。 2.检测的噪声大小可以通过液晶进行显示&#xff0c;并直观的给出当前噪声的程度大小&#xff1b; 3.可以通过按键设定报警阈值&#xff0…

十四、从0开始卷出一个新项目之瑞萨RZN2L之栈回溯(Default_Handler/hartfault)

目录 一、概述 二、参考资料 三、代码 四、日志 五、定位函数调用 六、README和工具 一、概述 软件开发中常见的比较棘手的问题就是hartfault/Default_Handler/dump&#xff0c;俗称跑飞了。 参考cmbacktrace&#xff0c;在瑞萨RZN2L/T2M实现栈回溯&#xff0c;串口打印…

OpenAI推出“深思熟虑对齐(Deliberative Alignment)”:为大语言模型建立更可靠的安全与伦理框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler

Launch Profiler概述 DevEco Studio内置Profiler分析调优工具。其中Launch主要用于分析应用或服务的启动耗时&#xff0c;分析启动周期各阶段的耗时情况、核心线程的运行情况等&#xff0c;协助开发者识别启动缓慢的原因。此外&#xff0c;Launch任务窗口还集成了Time、CPU、F…

微博用户消费趋势报告,多个领域增速明显,年轻一代成消费主力军

文 | 魏力 发布 | 大力财经 站在岁末回首这一年&#xff0c;在信息浪潮的汹涌翻涌之下&#xff0c;社交媒体平台犹如社会经济的晴雨表&#xff0c;精准地折射出大众生活与消费的万千景象。近日&#xff0c;大力财经看到一份报告&#xff0c;微博发布了《2024微博用户消费趋势…

智能公文写作一体机,开箱即用快速部署超便捷

在繁忙的政企事业单位中&#xff0c;时间就是生产力。公文撰写作为各类组织日常工作的核心环节&#xff0c;却常常因为传统的公文处理流程繁琐耗时而成为效率的瓶颈。如何打破这一瓶颈&#xff0c;实现高效的公文撰写&#xff0c;成为了众多单位关注的焦点。 一款即开即用的公文…

重温设计模式--中介者模式

中介者模式介绍 定义&#xff1a;中介者模式是一种行为设计模式&#xff0c;它通过引入一个中介者对象来封装一系列对象之间的交互。中介者使得各个对象之间不需要显式地相互引用&#xff0c;从而降低了它们之间的耦合度&#xff0c;并且可以更方便地对它们的交互进行管理和协调…

无人机双目视觉鲁棒定位方法!

无人机双目视觉鲁棒定位方法是一种先进的定位技术&#xff0c;它利用两个摄像头&#xff08;即双目相机&#xff09;模拟人的视觉系统&#xff0c;通过视差来确定物体的位置。这种方法在无人机定位领域具有广泛的应用前景&#xff0c;特别是在GPS信号拒止或弱纹理环境中&#x…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…

无人设备遥控器之定向天线篇

一、定义与功能 定向天线&#xff0c;顾名思义&#xff0c;是通过改变天线的辐射方向&#xff0c;实现信号发射、接收和增强的天线。它可以让信号以更高的功率、更远的距离传输到指定区域&#xff0c;同时也能够降低与周围天线之间的干扰。在无人设备遥控器中&#xff0c;定向天…

什么是Redis缓存击穿?如何解决

1.缓存击穿介绍 Redis的缓存击穿指的是在高并发场景下&#xff0c;当一个被大量请求访问的热点key&#xff08;即非常热门的数据项&#xff09;在Redis中过期时&#xff0c;所有请求几乎同时发现缓存失效并尝试直接从后端数据库读取数据&#xff0c;这可能会导致瞬间大量的数据…

Qt父窗口处理子窗口大小变化消息installEventFilter

1.需求描述 父窗口从上到下时标题栏&#xff0c;播放窗口和工具栏&#xff0c;希望监测中间播放窗口的大小变化&#xff0c;来根据分辨率自动调整播放画面的宽高&#xff1b;因为工具栏和标题栏可以隐藏&#xff0c;所以父窗口大小不变&#xff0c;中间的播放窗口也会随着工具…

HiQA: A Hierarchical Contextual Augmentation RAG for Multi-Documents QA---附录

附录 建议的问答系统 在建议的框架中&#xff0c;问答过程是单步的。首先&#xff0c;根据查询使用 RAG 从文档库中检索相关知识。随后&#xff0c;将此上下文与问题一起输入到语言模型中以生成响应。返回答案的第一个字符所需的时间在 1 到 3 秒之间。图 5 显示了 QA 流程的…

MoGe---最新单目3D几何估计方法

目录 一、概述 二、相关工作 1、单目深度估计 2、单目几何估计 3、相机内参估计 4、单目几何的大规模数据训练 三、前置知识 1、仿射不变和尺度不变指标 2、FOV和shift 3、ROE对齐求解器 四、MoGe 1、为什么设计仿射不变&#xff1f; 2、恢复相机焦距和移位 3、…

Jenkins安全部署规范及安全基线

Jenkins安全部署规范及安全基线 进入安全设置界面启用安全Disable remember me访问控制——安全域&#xff08;Security Realm&#xff09;servlet容器代理&#xff08;Delegate to servlet container&#xff09;Jenkins专有用户数据库&#xff08;Jenkins’ own user databas…

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…