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.FileAppende r | 文件 |
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、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 |
- 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后缀是表示内存的 之前…...

homebrew,gem,cocoapod 换源,以及安装依赖
安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 再按照成功提示配置环境变量 ruby 更新ruby到最新 brew install ruby 如果安装了会自动升级 安装完成后根据提示配置环境变量 再执行命令使其生效 s…...

Java字符串的|分隔符转List实现方案
字符串处理 问题背景代码实现代码优化原因分析实现方案 注意事项异常处理Maven未识别异常 问题背景 在项目组对账流程中,接收对方系统的对账文件,数据以|为分隔符,读取文件内容,分条入库。 代码实现 Java中将字符串转给list&am…...

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)
数据的存储是基于 主题(Topic) 和 分区(Partition) 的 Kafka是一个高可靠性的分布式消息系统,广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群,开发人员和运维人员经常需要使用可视化工具…...
DeepWalk 原理详解
概述: DeepWalk 是一种流行的图嵌入方法,用于学习图结构数据中节点的低维表示。它通过将图的节点视作序列数据,利用自然语言处理中的技术(类似于word2vec算法)来捕捉节点间的关系,可以帮助我们理解和利用图…...

GitLab安装|备份数据|迁移数据及使用教程
作者: 宋发元 最后更新时间:2024-12-24 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gi…...

嵌入式linux驱动框架 I2C系统驱动程序模型分析
引言:在嵌入式 Linux 系统中,I2C(Inter-Integrated Circuit)是一种常用的通信协议,用于连接低速设备(如传感器、显示器、存储器等)与主控制器。I2C 系统驱动程序模型通过层次化的设计࿰…...

深度学习实验十七 优化算法比较
目录 一、优化算法的实验设定 1.1 2D可视化实验(被优化函数为) 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …...

一个双非选手的秋招总结
个人bg介绍 25届双非本硕(非杭电深大,垫底双非),两段实习经历,本科没学过Java,有c语言和408基础;2023年10月份中途转语言,Java速成选手。 战绩总结:实习秋招面试总论次…...

如何提高永磁电动机的节电效果
在现代工业和家庭应用中,永磁电动机因其优越的性能和节能特性,逐渐成为主流选择。随着能源日益紧缺和环境问题的日益严重,寻求高效的电动机节能方案显得尤为重要。 一、永磁电动机的基本原理 永磁电动机的核心是永磁体,这些永磁…...

在一个服务器上抓取 Docker 镜像并在另一个服务器上运行
要在一个服务器上抓取 Docker 镜像并在另一个服务器上运行,您可以按照以下步骤进行操作: 1. 保存 Docker 镜像 在源服务器上,您可以使用 docker save 命令将 Docker 镜像保存为一个 tar 文件。例如,如果您的镜像名称是 face_det…...