Java日志框架:log4j、log4j2、logback
文章目录
- 配置文件相关
- 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中书写<、>可能会报错,导致冲突。可以用特殊字符代替。
| 字符 | 说明 |
|---|---|
< | 小于 < |
> | 大于 > |
& | 和 and |
' | 单引号 ’ |
" | 引号 " |
- 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的一些优秀设计,并且修复了一些问题,带来一些重大提升。主要有:
- 异常处理。在logback中,Appender中的异常不会被应用感知。但是在log4j2中提供了一些异常处理机制。
- 性能提升。log4j2相较于log4j和logback都具有很明显的性能提升。
- 自动重载配置。参考了logback设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。
- 无垃圾机制。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 使用
- 导入POM依赖
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
- 创建配置文件
日志配置文件: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
- 测试
package com.example.log;import org.apache.log4j.Logger;
import org.junit.Test;public class TestLog {// 获取日志记录器,此纪录器将负责控制日志信息。Name一般是当前类的名字Logger logger = Logger.getLogger(TestLog.class);@Testpublic 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.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;后缀可以是KB,MB或者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配置文件解析
- 根节点Configuration有两个属性:
status和monitorinteval,有两个子节点Appenders和Loggers(可以定义多个Appender和Logger)stataus:指定log4j本身的打印日志的级别monitorinterval:为log4j 2.x 新特性,自动重载配置,指定自动重载配置的间隔时间,单位是s,最小是5s。
Appenders节点,常见的有三种子节点:Console、File、RollingFileConsole节点:定义输出到控制台的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 |
- Loggers节点
常见的Loggers节点有两种:Root和Logger
- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
- Logger节点用来单独指定日志的形式,比如要为指定报下的class指定不同的日志级别等。
2.2 使用
测试是新建的SpringBoot项目
- 导入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>
-
创建配置文件
2.1 如果配置文件名是log4j2-spring.xml,则不用再另外配置,会自动检测到该配置文件
2.2 如果配置文件名是自定义的,需要在application.yml中另外配置logging:config: log4j2.xmllevel:cn.jay.repository: trace
-
配置文件内容如下:
<?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>
- 测试
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会依次读取以下类型配置文件
- logback.grovy
- logback-test.xml
- logback.xml
3.4 使用
spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 Logback+SLF4J。而 spring-boot-starter-web 包含了spring-boot-starte,所以只需要引入web组件即可。
- 引入POM依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 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(调试信息)、TRACE、 ALL(所有信息)--><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>

- 测试
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");}
}


相关文章:
Java日志框架:log4j、log4j2、logback
文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…...
鸿蒙-expandSafeArea使用
应用未使用setWindowLayoutFullScreen()接口设置窗口全屏布局时,默认使能组件安全区布局。可以使用expandSafeArea属性扩展安全区域属性进行调整 扩展安全区域属性原理 布局阶段按照安全区范围大小进行UI元素布局。布局完成后查看设置了expandSafeArea的组件边界&…...
【es6复习笔记】Spread 扩展运算符(8)
在现代前端开发中,JavaScript 的扩展运算符(Spread Operator)是一个非常有用的特性,它允许你将数组或对象展开,以便在函数调用、数组拼接、对象复制等场景中更方便地处理数据。扩展运算符(spread࿰…...
第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目
#知识点 1、信息收集-Web应用-开发框架-识别安全 2、信息收集-Web应用-安全组件-特征分析 一、ICO图标: 1、某个应用系统的标示,如若依系统有自己特点的图标;一旦该系统出问题,使用该系统的网站都会受到影响; 2、某个公…...
后端-redis
Redis RedisString类型String类型的常用命令 Hash类型Hash类型的常用命令 List类型List类型的常用命令 Set类型Set类型的常用命令 SortedSet类型SortedSet类型的常用命令 Redis序列化缓存更新策略缓存穿透缓存雪崩缓存击穿 Redis Redis是一个key-value的数据库,key…...
开发场景中Java 集合的最佳选择
在 Java 开发中,集合类是处理数据的核心工具。合理选择集合,不仅可以提高代码效率,还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点,帮助你在实际开发中找到最佳解决方案。 一、List:有序存…...
golangci-lint安装与Goland集成
golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址:golangci-lint 特性: 快…...
金仓数据库安装-Kingbase v9-centos
在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…...
条款6:auto推导若非己愿,使用显式类型初始化惯用法
一、代理类 所谓的代理类就是以模仿和增强一些类型的行为为目的存在的类 class MyArray { public:class MyArraySize{public:MyArraySize(int size) : theSize(size) {}int size() const { return theSize; }operator int() const { return theSize; }private:int theSize;};…...
蓝桥杯物联网开发板硬件组成
第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产,该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计,芯片提供了25…...
视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展࿰…...
(aaai2025) FD2-Net: Frequency-Driven Feature Decomposition Network
论文:FD2-Net: Frequency-Driven Feature Decomposition Network for Infrared-Visible Object Detection 代码:https://github.com/like413/FD2-Net 这个论文核心思想认为:多源融合目标检测方法忽略了频率上的互补特征,如可见光图…...
深度学习之目标检测——RCNN
Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法:穷举法,在原始图片上进行不同尺度不同大小的滑窗,获取每个可能的位置 弊端:计算量大,且尺度不能兼顾 Selective …...
2014年IMO第3题
在凸四边形 A B C D ABCD ABCD 中, ∠ A B C = ∠ A D C = π 2 \angle ABC=\angle ADC=\frac{\pi}{2} ∠ABC=∠ADC=2π, H H H 为 A A A 在 B D BD BD 上的投影, 在边 A B AB AB 上有一点 S S S, ∠ C H S − ∠ C S B = π 2 \angle CHS-\angle CSB=\frac{\pi}{2} …...
国高材服务 | 高分子结晶动力学表征——高低温热台偏光显微镜
众所周知,聚合物制品的实际使用性能(如光学透明性、硬度、模量等)与材料内部的结晶形态、晶粒大小及完善程度有着密切的联系,因此,对聚合物结晶形态等的研究具有重要的理论和实际意义。 随着结晶条件的不用,…...
跨站请求伪造之基本介绍
一.基本概念 1.定义 跨站请求伪造(Cross - Site Request Forgery,缩写为 CSRF)漏洞是一种网络安全漏洞。它是指攻击者通过诱导用户访问一个恶意网站,利用用户在被信任网站(如银行网站、社交网站等)的登录状…...
Hadoop集群(HDFS集群、YARN集群、MapReduce计算框架)
一、 简介 Hadoop主要在分布式环境下集群机器,获取海量数据的处理能力,实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…...
单元测试(UT,C++版)经验总结(gtest+gmock)
最近做了一段测试工作,其中包括单元测试,编程语言是C。这里提供一些基本知识总结,方便入门单元测试。 1.单元测试介绍 单元测试(Unit Testing, 简称UT)是软件测试的一种方法,目的是通过对单个软件组件&am…...
Mysql高级部分总结(二)
MySQL的内部日志 binlog记载的是update/delete/insert这样的SQL语句,而redo log记载的是物理修改的内容(xxxx页修改了xxx)。 binlog无论MySQL用什么引擎,都会有,而redo log是MySQL的InnoDB引擎所产生的。 redo log事务开始的时候,就开始记录每次的变更信息,而binlog是在…...
纠正一下网络管理
先找到那个hrStorageType 这里我的值是 后面的值.1.3.6.1.2.1.25.2.1.4代表磁盘 我只有2个盘 C盘和D盘 所以这里只有2个 你们有E盘F盘的话 这里会多 .1.3.6.1.2.1.25.2.1.2 代表内存 .1.3.6.1.2.1.25.2.1.2 前面是 hrStorageType.4 所以 这里面.4后缀是表示内存的 之前…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
