log4j2配置文件
log4j2配置文件使用
日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
以下是配置文件的解释
-
Appenders
日志输出方向集合Appenders子标签
-
Console
输出到屏幕Console 属性
name:自定义ConsoleAdapter名,此值用于AppenderRef的ref属性引用
target:SYSTEM_OUT或SYSTEM_ERR,一般只设置默认:SYSTEM_OUT
Console 子标签
-
PatternLayout
输出格式pattern
:自定义日志输出格式 -
ThresholdFilter
阈值过滤器(控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch))ThresholdFilter 属性
level:控制台仅输出自选的日志级别的日志信息
onMatch:ACCEPT/DENY
onMismatch:ACCEPT/DENY
-
-
File
日志输出至文件File 属性
name:自定义FileAdapter名,此值用于AppenderRef的ref属性引用
fileName:日志输出文件名,如:"logs/app.log"
File 子标签
PatternLayout
日志输出格式pattern
:自定义日志输出格式
-
RollingFile
日志滚动输出至文件RollingFile 属性
name:自定义RollingFileAdapter名,此值用于AppenderRef的ref属性引用
fileName:日志文件全路径
filePattern:当日志文件滚动【即因为文件大小、时间等条件触发的新日志文件创建)时,归档日志文件的命名规则和位置】此格式将标识日志滚动按天,小时,分钟滚动,比如
# 日志按小时滚动 logs/app-%d{yyyy-MM-dd-HH}.log.gz # 日志按天滚动 logs/app-%d{yyyy-MM-dd}.log.gz
bufferedIO:日志在写入时是否使用缓冲;使用缓冲I/O可以提高日志写入的性能,尤其是在写入大量小消息时。然而,这也意味着在应用程序崩溃或关闭时,可能会有一些日志消息仍然留在缓冲区中未写入磁盘,这可能会导致数据丢失。
RollingFile 子标签
-
PatternLayout
日志输出格式pattern
:自定义日志输出格式 -
Policies
策略子标签
-
SizeBasedTriggeringPolicy
基于大小触发的策略(根据文件大小自动切割日志)SizeBasedTriggeringPolicy属性
size:文件大小,日志超过size规定后自动切割
-
TimeBasedTriggeringPolicy
基于时间触发的策略(根据时间自动切割日志)TimeBasedTriggeringPolicy属性
interval:滚动文件的频率。它可以是任意正整数,通常表示的是天数(它也可以被解释为小时、分钟等,但通常用于表示天)
modulate:设置为true时,滚动将在每天的指定时间进行,而不是从日志事件的最后一次写入时间开始计算。这有助于确保滚动发生在每天的固定时间
-
-
DefaultRolloverStrategy
默认滚动策略(默认保留最近多少份日志)DefaultRolloverStrategy属性
max:自定义保留的最近的日志数量
DefaultRolloverStrategy 子标签
-
delete
定期删除日志文件的策略delete属性
basePath:日志文件所在的基础路径
maxDepth:搜索子目录层级
delete 子标签
-
IfFileName
文件名匹配IfFileName属性
glob:正则表达式
-
IfLastModified
最后一次更新日期匹配IfLastModified 属性
age:距今时长
-
-
-
-
Async
异步日志;提高日志记录的性能,特别是在高并发和高日志生成率的场景下Async属性
bufferSize:日志事件的内部缓冲区大小
blocking:因日志事件的生产速度超过消费速度,导致日志队列满时,blocking性决定了AsyncAppender的行为,当blocking设置为true时,如果日志队列已满AsyncAppender将阻塞生产线程,直到有空间可用或达到超时时间。这可以确保所有志事件都被处理,但可能会降低应用程序的性能。
当blocking设置为false时,如果日志队列已满,AsyncAppender将丢弃新的日志件或采用其他策略来处理这些事件(这取决于errorRef和discardThreshold等置)。这可以避免生产线程被阻塞,但可能会导致一些日志数据丢失。Async子标签
-
AppenderRef
AppenderRef属性
ref:引用<Appenders>标签下的子标签的name值
-
-
-
Loggers
-
logger
Logger节点用来单独指定日志的形式,比如为指定包下的class指定不同的日志级别等logger 属性
name:包名/全类名
level:日志输出级别
additivity:是否加入到日志中,false:排除,true:加入
logger 子标签
-
AppenderRef
输出方向AppenderRef属性
ref:引用<Appenders>标签下的子标签的name值
-
-
Root
根日志Root属性
level:日志输出级别
Root子标签
-
AppenderRef
输出方向AppenderRef属性
ref:引用<Appenders>标签下的子标签的name值
-
-
RollingFile(RollingFileAppender) 和 File(FileAppender) 的区别
FileAppender:将日志事件写入到一个指定的文件中。当文件达到一定大小或达到某个时间点时,FileAppender不会自动创建新的文件或删除旧的文件。因此,如果日志文件持续增长,可能会导致磁盘空间不足的问题。
RollingFileAppender:当日志文件达到指定的大小、时间或其他条件时,RollingFileAppender会创建新的日志文件并继续写入。同时,它还可以配置删除旧的日志文件,以保持磁盘空间的合理使用。(生产环境使用RollingFileAppender)
log4j2 日志输出格式定义
- 日期 %d{yyyy-MM-dd HH:mm:ss} 括号里的日期定义根据需求来,比如只用精确到天:%d
- 线程名 %t
- 记录器类名 %c 或 %c{n} n指代从这个类往前数n层输出,举个例子,类
com.pz.connect.socket.consumer.GetMes
,定义%c{3}仅在日志输出socket.consumer.GetMes
,而不会输出全类名什么是记录器?比如这个TDemo类,日志中打印warn say,TDemo就是记录器
public class TDemo { private Logger logger = LoggerFactory.getLogger(TDemo.class); public void say(){ logger.warn("warn say"); } }
- 日志级别:%p 或 %level(建议参考格式对齐使用 %5leven 或 %5p)
- 日志信息:%m 或 % msg
- 换行:%n
- 输出所在方法名:%M
- 输出所在行号:%L
格式对齐
以上的输出格式%m,%msg,%p等都可以用类比C语言printf的输出格式对齐方式输出:"%m.ns":输出m位,取字符串(左起)n位,左补空格
概念
Appenders 日志的输出形式
- ConsoleAppender 控制台输出
- FileAppender 文件形式输出
- RollingFileAppender 滚动文件形式输出
- AsyncAppender 异步输出
Loggers:控制日志输出,控制哪些appender可以被输出,哪些不被输出
PatternLayout:日志输出格式
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18224851
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现