[Log4j/日志系统] Log4j2.xml 配置详解

news/2025/2/23 12:16:19/文章来源:https://www.cnblogs.com/johnnyzen/p/18731975

Configuration

定义整个配置文件的根元素,整个配置信息都在这个标签内。

Demo

demo

<?xml version="1.0" encoding="UTF-8" ?>
<!--monitorInterval属性值(秒数)为一个非零值来让Log4j每隔指定的秒数来重新读取配置文件,可以用来动态应用Log4j配置-->
<Configuration status="debug" monitorInterval="30"><!--用来自定义一些变量--><Properties><!--变量定义--><Property name="myPattern" value="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><Property name="dir_url">d:/logs</Property></Properties><!--使用Appenders元素可以将日志事件数据写到各种目标位置--><Appenders><!-- 默认打印到控制台 --><Console name="ConsoleAppend" target="SYSTEM_OUT"><!-- 默认打印格式 --><PatternLayout pattern="${myPattern}"/></Console><!-- 打印到日志文件上 --><File name="FileAppend" fileName="${dir_url}/fileLog.log" bufferedIO="true" immediateFlush="true"><PatternLayout><pattern>${myPattern}</pattern></PatternLayout></File></Appenders><!--定义logger,只有定义了logger并引入的appender,appender才会生效--><Loggers><!-- 默认打印日志级别为 error --><Root level="INFO"><AppenderRef ref="ConsoleAppend"/><AppenderRef ref="FileAppend"/></Root></Loggers>
</Configuration>

参数解释

  • status:

应该打印到控制台的内部 Log4j 日志事件的级别,可设置的值有 trace、debug、info、warn、error 和 fatal,Log4j 将会打印出内部初始化等事件的详细信息(在发现配置文件之后)。设置该属性为 trace 是查找 Log4j 故障的第一手工具。
也可以通过设置 log4j2.debug 系统属性来输出 Log4j 内部日志,包括配置文件加载前的内部日志(从 log4j 2.9 开始)

  • advertiser:

可选的Advertiser插件名,用来通知个别FileAppender或SocketAppender的配置。目前唯一可用Advertiser名为"multicastdns"

  • dest:

err(将输出到stderr上)或一个文件路径或一个URL;

  • monitorInterval:

检查配置文件是否有更新的间隔秒数;

  • name:

配置的名称;

  • packages:

逗号分隔的用于搜索插件的包名列表。插件只会被每个类加载器加载一次,所以仅重新配置该项不会生效;

  • schema:

为类加载器定位XML Schema位置以验证配置。仅当strict属性设置为true时该属性才有效,如果不设置该属性,则不会验证Schema

  • shutdownHook:

设置当 JVM 关闭时 log4j 是否也自动关闭。默认是启用的,也可以设置该属性为 + disable 来禁用该关闭钩子;

  • shutdownTimeout:

设置当 JVM 关闭后 Appender 和后台任务超时多少毫秒才关闭。默认为0,表示每个Appender使用其默认的超时,不等待后台任务。
这仅是个提示,而不能保证关闭进程不会花费更长的时间。将该值设置过小可能增加日志事件在还未输出到最终位置之前就丢失的风险。
如果 shutdownHook 属性未设置,那么将不会使用该属性;

  • strict:

使用严格的 XML 格式, JSON 格式的配置文件不支持该属性

  • verbose:

加载插件时是否显示诊断信息

Properties

  • 通常用来定义一些变量,做到尽量复用,在 xml 配置文件的后续内容中可能会重复用到某些属性信息。

Appenders

  • 定义日志输出器的集合,在这个标签内部,我们可以通过指定 Appender 进而重定向日志到指定位置.

如输出到 控制台、文件、网络传输、数据库、syslog、kafka等

  • 每个 Appender 可以设置自己的输出方式与格式。

Appender 标签

  • 根据输出目标位置的不同,有不同的 Appender。

以下是目前 log4j2 支持的目标位置:

这里主要学习下我们常用的输出到控制台,文件,以及涉及到日志滚动的文件输出。

ConsoleAppender

https://logging.apache.org/log4j/2.x/manual/appenders.html#ConsoleAppender

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

FileAppender

https://logging.apache.org/log4j/2.x/manual/appenders.html#FileAppender


RollingFileAppender

https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info"><Appenders><RollingFile name="RollingFile" fileName="/path/to/logs/myapp.log"filePattern="/path/to/logs/myapp-%d{yyyy-MM-dd}-%i.log.gz"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="10"/></RollingFile></Appenders><Loggers><Root level="info"><AppenderRef ref="RollingFile"/></Root></Loggers>
</Configuration>
  • 常用的滚动策略是基于时间和日志大小,上面的日志滚动策略:
  • 基于时间的策略,结合filePattern的最小单位,本例中的单位是yyyy-MM-dd,所以最小单位是,即按照 day 作为滚动的时间单位,因为 interval=1,即每天滚动一次,结合 modulate 参数为 true 时,指明以 interval 为参数滚动
  • 基于日志大小的额滚动策略,设定的大小为 100MB,即如果单个日志达到 100MB,也会触发滚动策略
  • 在元素 DefaultRolloverStrategy 中设置为10,即最大保留10个文件。

  • 关于 RollingFile 策略设置:Log4j2中RollingFile的文件滚动更新机制

Logger

定义 Logger 对象,可以有自己的日志级别Appenders过滤器等属性,内部通过子元素 AppenderRef 引用一个或多个 Appender,将他们附加到 Logger 上。

RootLogger

  • 定义 Root Logger 对象,也是所有 Logger 的父级 Logger,级别通常设置为最低级别,从而将所有日志消息传递到其他 Logger 或 Appender,Root元素通过子元素 AppenderRef 来引若干个 Appenders,将它们附加到 Root Logger 上。

Filter

  • 定义一个或多个过滤器,用于控制哪些日志消息被记录和输出。过滤器可以根据下面几个方面进行过滤:
  • 日志级别
  • 消息内容
  • 时间戳等条件

Policies

Layouts

https://logging.apache.org/log4j/2.x/manual/layouts.html

JsonLayout

PatternLayout

Demo

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO"><Appenders><Console name="console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} pid:%pid tid:%tid %r %-5p [%t] %C{2} (%F:%L) - %m%n"/></Console><File name="file" fileName="logs/app.log"><PatternLayout pattern="%d %-5p %r [%t] %C{2} (%F:%L) - %m%n"/></File></Appenders><Loggers><Root level="debug"><AppenderRef ref="console"/><AppenderRef ref="file"/></Root></Loggers>
</Configuration>

MyHelloWorld.java

package org.example;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class MyHelloWorld {private static Logger logger = LogManager.getLogger(MyHelloWorld.class);public static void main(String[] args) {logger.debug("这是 DEBUG 日志");logger.info("这是 INFO 日志");logger.error("这是 ERROR 日志");logger.fatal("这是 FATAL 日志");}
}

日志

2023-11-17 10:25:49.519 pid:19608 tid:1 595 DEBUG [main] example.MyHelloWorld (MyHelloWorld.java:10) - 这是 DEBUG 日志
2023-11-17 10:25:49.522 pid:19608 tid:1 598 INFO  [main] example.MyHelloWorld (MyHelloWorld.java:11) - 这是 INFO 日志
2023-11-17 10:25:49.523 pid:19608 tid:1 599 ERROR [main] example.MyHelloWorld (MyHelloWorld.java:12) - 这是 ERROR 日志
2023-11-17 10:25:49.523 pid:19608 tid:1 599 FATAL [main] example.MyHelloWorld (MyHelloWorld.java:13) - 这是 FATAL 日志

案例分析

这里说下 console 中的 patternLayout:

// pattern
"%d{yyyy-MM-dd HH:mm:ss.SSS} pid:%pid tid:%tid %r %-5p [%t] %C{2} (%F:%L) - %m%n"
  • %d{yyyy-MM-dd HH:mm:ss.SSS},日期时间,形如 2023-11-17 10:25:49.519
  • %pid,打印进程id
  • %tid,打印线程id
  • %r,输出从JVM启动到创建日志事件所经过的毫秒数
  • %-5p,“-” 表示左对齐,5 表示占位空间,p 表示日志级别
  • %t,当前线程
  • %C{2},日志记录器,显示到2级,如果后面没有限定数值,表示全输出
  • %F,当前文件名
  • %L,日志打印所在行号
  • %m,打印输入的message
  • %n,日志结束换行

举个通用的例子,我们在项目中通常比较重要的打印日志应该包含下面几个方面:

  • 时间
  • 日志级别
  • 进程、线程号
  • 当前源码所在文件
  • 记录行所在方法
  • 日志打印行号
  • 记录的message

其他信息根据项目需要灵活添加删减。

下面是来自官网的一些格式内容摘要,如有进一步需求,请点击下方的链接获取。

c{precision}/logger{precision}

该项属性主要输出项目的层级结构,看看官网的case就清楚了:

Conversion Pattern : %c参数(class信息)

Conversion Pattern Logger Name Result
%c{1} org.apache.commons.Foo Foo
%c{2} org.apache.commons.Foo commons.Foo
%c{10} org.apache.commons.Foo org.apache.commons.Foo
%c{-1} org.apache.commons.Foo apache.commons.Foo
%c{-2} org.apache.commons.Foo commons.Foo
%c{-10} org.apache.commons.Foo org.apache.commons.Foo
%c{1.} org.apache.commons.Foo o.a.c.Foo
%c{1.1.~} org.apache.commons.test.Foo o.a.~.~.Foo
%c{.} org.apache.commons.test.Foo ....Foo
%c{1.1.1.*} org.apache.commons.test.Foo o.a.c.test.Foo
%c{1.2.*} org.apache.commons.test.Foo o.a.c.test.Foo
%c{1.3.*} org.apache.commons.test.Foo o.a.commons.test.Foo
%c{1.8.*} org.apache.commons.test.Foo org.apache.commons.test.Foo
C{precision}/class{precision}

输出发出日志记录请求的调用方的完全限定类名,参考上一个的配置。

Pttern : %d 参数(日期)

d{pattern}/date{pattern}

输出日志事件的时间信息,根据pattern输出对应的格式,常用pattern:

Pattern Example
%d{DEFAULT} 2012-11-02 14:34:02,123
%d{DEFAULT_MICROS} 2012-11-02 14:34:02,123456
%d{DEFAULT_NANOS} 2012-11-02 14:34:02,123456789
%d{ISO8601} 2012-11-02T14:34:02,781
%d{ISO8601_BASIC} 20121102T143402,781
%d{ISO8601_OFFSET_DATE_TIME_HH} 2012-11-02T14:34:02,781-07
%d{ISO8601_OFFSET_DATE_TIME_HHMM} 2012-11-02T14:34:02,781-0700
%d{ISO8601_OFFSET_DATE_TIME_HHCMM} 2012-11-02T14:34:02,781-07:00
%d{ABSOLUTE} 14:34:02,781
%d{ABSOLUTE_MICROS} 14:34:02,123456
%d{ABSOLUTE_NANOS} 14:34:02,123456789
%d{DATE} 02 Nov 2012 14:34:02,781
%d{COMPACT} 20121102143402781
%d{UNIX} 1351866842
%d{UNIX_MILLIS} 1351866842781

也可以使用定制的日期格式:

F/file

输出打印日志的文件名信息。

highlight{pattern}{style}

根据当前事件的日志记录级别将ANSI颜色添加到所包含模式的结果中。

L/line

输出打印日志的行号。

m{ansi}/msg{ansi}/message{ansi}

根据给定的message输出到应用日志。

M/method

输出打印日志对应的方法信息。

n

日志结束符号。

pid{[defaultValue]}/processId{[defaultValue]}

输出当前进程的 pid。

T/tid/threadId

输出当前线程的线程 thread ID。

t/tn/thread/threadName

输出当前线程的线程名。

p|level{level=label,...}/p|level{length=n}/p|level{lowerCase=true|false}

输出日志级别,默认输出如:DEBUG/INFO/WARN等,也可以根据 level和label定制输出,如 DEBUG=Debug,一般默认就可以。

r/relative

输出时间信息,从 JVM 启动到日志事件创建这段时间的时间跨度,毫秒级别。

%

该部分主要从占位数及左右对齐,数字代表占位字符数,默认右对齐,左对齐需要加“-”,如果字符数超过限定,会出现截断,如:

  • %20m,对于输出的message信息,右对齐,最大长度为20个字符
  • %-20m,左对齐,最多20个字符长度
  • %20.30m,右对齐,字符数在20-30内
  • %.30m,右对齐,字符数在0-30内

根据情况输出字符数,对齐情况。

Y 推荐文献

  • Apache Log4j 2.x
  • log4j2
  • patternlayout

X 参考文献

  • Apache Log4j2 详解 (一) - 掘金
  • Spring Boot日志框架:Log4j2 快速入门与参数详解 - 掘金
  • 整合日志框架log4j2 - 掘金
  • Log4j2.xml 配置文件详解 - 掘金
  • log4j2 的使用【超详细图文】 - CSDN
  • Log4j2常用标签及使用 - CSDN

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi 漂亮的开关按钮 与 web ui 一样漂亮的开关按钮 djToggleSwitchButton

效果图 在 delphi 界 找个漂亮的开关按钮,不容易,ddj 为您提供了漂亮的开关按钮,以下是 效果图说明判断开关 双击这个 开关按钮,在 onClick事件里 写逻辑代码就可,如: procedure TFormMain.djToggleSwitch1Click(Sender: TObject); beginif djToggleSwitch1.StateOn then…

ollama本地大模型的安装与使用

ollama本地大模型的安装与使用1、定义 Ollama:‌是一个开源的大型语言模型(LLM)服务工具,旨在简化在本地运行大语言模型的过程,降低使用大语言模型的门槛‌。 2、安装 https://ollama.com/download 根据自己的电脑系统来选择安装不同的版本,默认安装就可以解决。3、安装成功…

易语言 —— 第一篇

易语言第一课 - 界面熟悉与“你好世界!” 1. 安装易语言集成开发环境并新建一个应用程序 在安装好易语言集成开发环境后,首先需要新建一个应用程序。具体步骤如下:打开易语言集成开发环境。 点击菜单栏中的“文件” -> “新建” -> “应用程序”。2. 界面的简单介绍 易…

MyBatis-Plus 的自动填充 —— 值为null

MyBatis-Plus 的自动填充 MyBatis-Plus 提供的字段自动填充功能是一种非常实用的特性,它能够在插入或更新数据库记录时自动填充一些公共字段,如创建时间(createTime)、更新时间(updateTime)、创建人(createBy)、更新人(updateBy)等。这一功能极大地简化了开发过程,减…

[Jaav SE/程序生命周期] 优雅的Java应用程序的启停钩子框架

序了解 spring 生态及框架的 java er 都知道,spring 应用的生命周期管理及配套接口较为优雅、可扩展。但脱离 spring 的 java 应用程序,如何优雅地启停、管理程序的生命周期呢?(以便应用程序在我们需要的运行阶段中进行相应的动作)概述:Java普通应用程序的启停钩子框架 前…

迈金C416码表体验

之前一直在用黑鸟单车和小米健康记录骑行数据, 后来又发现strava和keep的骑行分享功能做的比较好. 于是使用的运动app就越来越多, 骑行时带着手机的同时还要开好几个app太麻烦了, 同时也想给车上加一个速度显示器, 由此考虑入一个码表.对功能要求不高, 最主要的需求是gps和速度…

ASP.NET Core Swagger 汉化

在wwwroot文件夹添加汉化的JS文件const translations = {"Failed to load API definition": "API定义加载失败","Errors": "错误信息","Hide": "隐藏","Fetch error": "获取错误","Inte…

Svelte 最新中文文档教程(17)—— 生命周期钩子

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

[Java SE] FunctionInterface 注解: 函数式接口(JDK8+)

概述:FunctionInterface/函数式接口 简介函数式接口是指只包含一个抽象方法的接口,可以使用 Lambda 表达式来创建该接口的实例。@FunctionalInterface 注解是 Java Lang 包中的一个注解,用于标识一个接口是函数式接口。@FunctionalInterface 注解的作用:编译时检查:@Funct…

去中心化 AI:赋权还是混乱?

DeepSeek 如何在 AI 去中心化方面迈出了巨大的一步,以及为什么这比你想象的更重要Nadia Piet + AIxDESIGN & Archival Images of AI / Better Images of AI / AI Am Over It / CC-BY 4.02025 年 1 月 27 日星期一,DeepSeek —— 一家几乎凭空冒出来的中国初创公司 —— 发…

SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现

SmolLM2 采用创新的四阶段训练策略,在仅使用 1.7B 参数的情况下,成功挑战了大型语言模型的性能边界:在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点 数学推理能力(GSM8K、MATH)优于 Llama3.2-1B 在代码生成和文本重写任务中展现出色表现 支持 8K tokens 的长文本处…