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 使…...
tcp 的重传,流量控制,拥塞控制
tcp 的重传解决了什么问题tcp的几种重传机制分别解决什么问题?方案 1: 超时重传方案2: 快速重传选择性确认(sack)d-sack(重复接收) 滑动窗口:累计应答 流量控制解决什么问题?如何做的?问题1: 那如果第一次发送的数据都大于缓冲区的大小怎么办?问题2: 如果剩余大小为0会发生…...
【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】
1 主要内容 之前分享了很多配电网重构的程序,每个程序针对场景限定性比较大,程序初学者修改起来难度较大,本次分享一个基础程序,针对含sop的配电网重构模型,含风电和光伏,优化了33节点网络电压合理性&…...
angular管道传多个参数
比如有个时间管道 time.pipe.ts import { Pipe, PipeTransform } from angular/core;Pipe({ name: time }) export class TimePipe implements PipeTransform {transform(value: any,type: any,isTime: boolean,): string {// 具体逻辑不写了} }使用的时候对时间字段的处理只需…...
STM32高级 以太网通讯案例1:网络搭建(register代码)
需求描述 驱动W5500芯片,设置好IP,测试网络是否连通。 思考: 驱动W5500芯片是通过spi协议,所以和spi相关的有四个引脚,MOSI(主出从入)MISO(主入从出)SCK(时…...
strncpy函数和使用案例
strncpy 是 C 语言标准库函数之一,用于字符串操作。它的功能是将源字符串(source)中的字符复制到目标字符串(destination)中,但最多复制 n 个字符。如果源字符串的长度小于 n,则目标字符串剩余的…...
Python调用Elasticsearch更新数据库
文章目录 Elasticsearch介绍Python调用Elasticsearch更新数据库 Elasticsearch介绍 Elasticsearch是一个基于Lucene的搜索引擎,它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。Elasticsearch是用Java开发的&#x…...
阿里云-将旧服务器数据与配置完全迁移至新服务器
文章目录 一:创建镜像二:将创建好的镜像复制到新服务器所在的目标地域(如果新服务器与镜像在同一地域就不用进行这一操作)三:将镜像配置到新服务器上四:导出安全组(如果新服务器与旧服务器使用同…...
redis cluster实验详解
华子目录 实验环境准备部署redis cluster添加节点删除节点redis cluster集群维护 实验 环境准备 再开3台主机 先把之前3台源码编译的redis删除 [rootredis-node1 ~]# cd /usr/local/redis/ [rootredis-node1 redis]# make uninstall[rootredis-node2 ~]# cd /usr/local/redi…...
网络技术-QoS策略以及如何定义 流分类,流行为,流策略
一:QoS策略简介 QoS策略由如下部分组成: 类,定义了对报文进行识别的规则。 流行为,定义了一组针对类识别后的报文所做的QoS动作。 通过将类和流行为关联起来,QoS策略可对符合分类规则的报文执行流行为中定义的…...
【小程序】自定义组件的data、methods、properties
目录 自定义组件 - 数据、方法和属性 1. data 数据 2. methods 方法 3. properties 属性 4. data 和 properties 的区别 5. 使用 setData 修改 properties 的值 自定义组件 - 数据、方法和属性 1. data 数据 在小程序组件中,用于组件模板渲染的私有数据&…...
实验五 时序逻辑电路部件实验
一、实验目的 熟悉常用的时序逻辑电路功能部件,掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…...
时序论文34|AdaWaveNet:用于时间序列分析的自适应小波网络
论文标题:AdaWaveNet: Adaptive Wavelet Network for Time Series Analysis 论文链接:https://arxiv.org/abs/2405.11124 论文代码:https://github.com/comp-well-org/AdaWaveNet/ 前言 这篇文章面向非平稳时间序列进行分析与建模&#x…...
Maven怎么会出现一个dependency-reduced-pom.xml的文件
问题 今天打包时突然发现,多出了一个名为dependency-reduced-pom.xml的文件 解决方法 由于使用了maven-shade-plugin插件导致的,在 <plugin> 标签下添加 <configuration><createDependencyReducedPom>false</createDependencyR…...
Vue.js组件(6):echarts组件
1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网:Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性:chartId,指定图表挂载div的id,注意不…...
在低版本 CUDA 环境下安装高 CUDA 版本的 PyTorch 及 DGL
项目中,代码环境需要 PyTorch 1.12.0 以上版本,但服务器上的 CUDA 版本仅为 10.1,官方支持的 PyTorch 最高版本为 1.7.0。导致无法直接使用所需的 PyTorch 版本。而且,DGL 也需要 0.9.1 版本,而 CUDA 10.1 不支持该版本…...
【SpringMVC】REST 风格
REST(Representational State Transfer,表现形式状态转换)是一种访问网络资源的格式。传统的资源描述方式通常如下: http://localhost/user/getById?id1http://localhost/user/saveUser 而 REST 风格的描述则更简洁:…...
windows C#-使用对象初始值设定项初始化对象
可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数。 以下示例演示如何将对象初始值设定项用于命名对象。 编译器通过首先访问无参数实例构造函数,然后处理成员初始化来处理对象初始值设定项。 因此,如果无参…...
【Sentinel】流控效果与热点参数限流
目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中,还有一个流控效果选项: 流控效果是指请求达到流控阈值时应该采取的措施,包括三种&…...
安装与配置
《PHP Libxml》是一个在PHP中处理XML和HTML文档的重要库。它提供了丰富的API,支持DOM、SimpleXML和XMLReader等多种解析方式,广泛应用于各种编程语言和项目中。 安装与配置 安装: 在PHP中,libxml扩展通常是默认启用的。如果你需要手动安装&…...
optuna和 lightgbm
文章目录 optuna使用1.导入相关包2.定义模型可选参数3.定义训练代码和评估代码4.定义目标函数5.运行程序6.可视化7.超参数的重要性8.查看相关信息9.可视化的一个完整示例10.lightgbm实验 optuna使用 1.导入相关包 import torch import torch.nn as nn import torch.nn.functi…...
SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持
可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码...
ONLYOFFICE 协作空间 3.0 新功能详解
ONLYOFFICE 协作空间 3.0 新功能详解 书接上文: ONLYOFFICE 协作空间 3.0 发布: 新增虚拟数据房间、用户类型、OAuth 2.0 等更新 简单的介绍了一下 ONLYOFFICE 协作空间 3.0 的新功能,今天我们详细介绍一下这些新功能。 关于 ONLYOFFICE 协作空间 O…...
湖南引力:低代码助力实现智慧养老管理系统
“低代码开发宛如一座神奇的桥梁,它以简洁高效的方式连接起创意与应用,降低了开发门槛,为企业和开发者带来前所未有的便捷与可能,开启了快速实现软件梦想的新征程。” ——王港,湖南引力科技有限公司 湖南引力科技有…...
React里使用lodash工具库
安装 使用命令 npm install lodash 页面引入 常见的引入方式 引入整个lodash对象: import _ from lodash按名称引入特定的函数: import { orderBy } from "lodash"; tips: 这两种引入方式都会引入整个lodash库, 体积大&#x…...
机器人C++开源库The Robotics Library (RL)使用手册(二)
由于RL库采用跨平台CMake源码,可以轻松在win、ubantu等平台部署、编译,win通常用VS编译器,为了便于使用、阅读,需要将CMake编译成VS工程。 1、准备三个工具:CMake、VS、QT 为了在Windows上编译RL和依赖项,您需要安装一个编译器(例如。,Visual Studio 2017)和跨平台构…...
Excel无法插入新单元格怎么办?有解决方法吗?
在使用Excel时,有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的,比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案,帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…...
2024年-全球使用Delphi统计
Delphi是一款集成开发环境(IDE),旨在支持开发者高效地构建桌面、移动、Web 以及控制台应用程序,特别适合追求速度与效率的快速应用开发(RAD)流程。 根据 theirstack.com 网站的数据,我们大致描…...
行为树详解(5)——事件驱动
【分析】 如果行为树的节点很多,那么会存在要经过很多节点才会走到动作节点的情况。显然,性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点,而实际上很多条件节点在数帧内不会有变化,这是造成性能问题的重要原…...
为什么深度学习和神经网络要使用 GPU?
为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…...
Kinova在开源家庭服务机器人TidyBot++研究里大展身手
在科技日新月异的今天,机器人技术在家庭场景中的应用逐渐成为现实,改变着我们的生活方式。今天,我们将深入探讨一篇关于家用机器人研究的论文,剖析其中的创新成果, 论文引用链接:http://tidybot2.github.i…...
Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…...
Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign
目录 1.导入单体架构项目 1.1 安装mysql 1.2 后端 1.3 前端 2.微服务 2.1 单体架构 2.2 微服务 2.3 SpringCloud 3.微服务拆分 3.1 服务拆分原则 3.1.1 什么时候拆 3.1.2 怎么拆 3.2 拆分购物车、商品服务 3.2.1 商品服务 3.2.2 购物车服务 3.3 服务调用 3.3.1 RestTemplate 3.…...
shell编程7
声明 学习视频来自B站UP主 泷羽sec for循环与while循环 for 循环 例子 代码如下: for i in seq 1 100 do echo $i done或者 for i in $(seq 1 100) do echo $i done 反引号的作用 在 shell 脚本中,反引号用于命令替换。它会将反引号中的命令执行,…...
Spring Boot中幂等性的应用
在 Spring Boot 中,幂等性是实现分布式系统设计和接口调用的一个重要概念,尤其在高并发、分布式环境下,确保接口重复调用不会引发系统数据异常至关重要。 幂等性概念 幂等性(Idempotence)是指一次请求和重复多次请求…...
深度学习笔记(9)——神经网络和反向传播
神经网络和反向传播 神经网络架构: 更多的神经元,更大的模型容量,使用更强的正则化进行约束。 神经网络的分层计算 f W 2 m a x ( 0 , W 1 x b 1 ) b 2 fW_2max(0,W_1xb_1)b_2 fW2max(0,W1xb1)b2,其中max函数体现了非线性,如果想要加深网络的层次,必须…...
Oracle Database 23ai 中的DBMS_HCHECK
在 Oracle 23ai 中,DBMS_HCHECK 包允许我们检查数据库中已知的数据字典问题。 几年前,Oracle 发布了 hcheck.sql 脚本(文档 ID 136697.1)来检查数据库中已知的数据字典问题。 DBMS_HCHECK 包意味着我们不再需要下载 hcheck.sql…...
Docker部署neo4j
查询镜像版本 docker search neo4j 以上代码运行会报异常:Error response from daemon: Get https://index.docker.io/v1/search?qneo4j&n25: read tcp 192.168.xxx.xxx:41734->xx.xxx.xx.xxx:443: read: connection reset by peer 这个提示无法访问&…...
大数据技术-Hadoop(二)HDFS的介绍与使用
目录 1、HDFS简介 1.1 什么是HDFS 1.2 HDFS的优点 1.3、HDFS的架构 1.3.1、 NameNode 1.3.2、 NameNode的职责 1.3.3、DataNode 1.3.4、 DataNode的职责 1.3.5、Secondary NameNode 1.3.6、Secondary NameNode的职责 2、HDFS的工作原理 2.1、文件存储 2.2 、数据写…...
datax与sqoop的优缺点?
DataX 的优缺点 优点 多种数据源支持:DataX 是一个开源的数据同步工具,它支持多种数据源之间的数据传输,包括关系型数据库(如 MySQL、Oracle、SQL Server 等)、非关系型数据库(如 HBase、Hive、Elasticsear…...
如何学习、使用Ai,才能跟上时代的步伐?
目录 1. 打好基础:理解AI的核心概念 2. 学习AI的核心领域 3. 实践:动手做项目,积累经验 4. 利用AI工具提升工作效率 5. 培养AI思维与批判性思维 6. 关注AI领域的最新研究与趋势 7. 培养跨学科能力 总结: 在AI时代…...
强化特种作业管理,筑牢安全生产防线
在各类生产经营活动中,特种作业由于其操作的特殊性和高风险性,一直是安全生产管理的重点领域。有效的特种作业管理体系涵盖多个关键方面,从作业人员的资质把控到安全设施的配备维护,再到特种设备的精细管理以及作业流程的严格规范…...
nuxt3中使用element-plus(集成element-plus)
一、安装依赖 pnpm i element-plus --savepnpm i element-plus/icons-vuepnpm i element-plus/nuxt -D二、配置nuxt.config.ts export default defineNuxtConfig({ssr: true,devtools: { enabled: true },typescript: {shim: false,},modules: [element-plus/nuxt],css: [ele…...
HTML 元素:网页构建的基础
HTML 元素:网页构建的基础 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基石。它定义了网页的结构和内容,而HTML元素则是构成HTML文档的基石。在本篇文章中,我们将深入探讨HTML元素的概念、类型、用法,以及如何在网页设计中有效地使用它们。 什么是HT…...
代码解析:安卓VHAL的AIDL参考实现
以下内容基于安卓14的VHAL代码。 总体架构 参考实现采用双层架构。上层是 DefaultVehicleHal,实现了 VHAL AIDL 接口,并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware,实现了 IVehicleHardware 接口。此类可模拟与实…...
SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
一、RESTful (一)RESTful概述 RESTful是一种软件架构风格,用于设计网络应用程序。REST是“Representational State Transfer”的缩写,中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作,以及使用HTTP请求来处理数据。RES…...
ShenNiusModularity项目源码学习(6:访问控制)
ShenNius.Admin.API项目中的控制器类的函数如果需要访问控制,主要是调用ShenNius.Infrastructure项目下的AuthorityAttribute特性类实现的。AuthorityAttribute继承自ActionFilterAttribute抽象类,后者用于在调用控制器操作函数前后自定义处理逻辑&#…...
前端工程化概述(初版)
阅前悉知 本文为《前端工程化》系列的首篇。由于本系列仍在撰写中,故其余文章暂不发布。您可以通过此链接查看其余已经完成文章:前端工程化专栏 (完善中) | Jay 的博客 需要注意的是,尽管部分文章可以查看,…...
人工智能与物联网:从智慧家居到智能城市的未来蓝图
引言:未来已来,智能化的世界 想象一下,一个早晨,智能闹钟根据你的睡眠状态自动调整叫醒时间,咖啡机早已备好热腾腾的咖啡,窗帘缓缓拉开,迎接清晨的阳光。这不是科幻小说中的场景,而是…...
【达梦数据库】达梦数据库windows安装
目录 1.选择语言与时区 2.安装向导 3.许可证协议 4.验证 Key 文件 5.选择安装组件 6.选择安装目录 7.目录确认 8.开始安装 9.安装过程 10.安装完成 11.创建数据库实例 12.创建数据库模板 13.数据库目录 14.数据库标识 15.数据库文件 16.初始化参数 17.口令管理…...