Log4j配置文件XML方式和按包路径分开输出日志

Log4j XML配置详解
本文详细介绍了如何使用XML配置Log4j,包括控制台输出、文件输出等配置方法,并解释了logger的additivity属性及filter过滤器的作用。
使用Log4j,则推荐用XML来配置属性参数,优点是打印输出更灵活,更加易控,可以按包路径、日志级别分开输出,可以根据具体需求过滤不需要的日志信息。

详细的配置参数可以参考一下几个帖子:
[url]http://leonandjava.iteye.com/blog/293525[/url]
[url]http://blog.youkuaiyun.com/azheng270/archive/2008/03/12/2173430.aspx[/url]

[b]web.xml加载[/b]

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
<!--
<param-value>/WEB-INF/log4j.properties</param-value>
-->
</context-param>


[b]log4j.xml[/b]

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!-- 控制台输出 -->
<appender name="cmd" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="GBK" />
<param name="Threshold" value="debug" />
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n" />
</layout>
<!--
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="DEBUG" />
</filter>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="需要过滤的信息片段" />
<param name="AcceptOnMatch" value="false" />
</filter>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="需要过滤的信息片段" />
<param name="AcceptOnMatch" value="false" />
</filter>
-->
</appender>

<!-- 文件输出 -->
<appender name="file" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="../webapps/aaa/WEB-INF/logs/log.log" />
<param name="Encoding" value="UTF-8" />
<param name="Threshold" value="debug" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="500kb" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss} [%t] %p %c %x - %m%n" />
</layout>
</appender>

<!-- 针对任务处理程序的日志文件输出 -->
<appender name="taskFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="../webapps/aaa/WEB-INF/logs/task-log.log" />
<param name="Encoding" value="UTF-8" />
<param name="Threshold" value="debug" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="500kb" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss} [%t] %p %c %x - %m%n" />
</layout>
</appender>

<!-- 任务处理程序,设置输出的方式 -->
<logger name="com.ecard.task" additivity="false">
<level value="debug" />
<appender-ref ref="cmd" />
<appender-ref ref="taskFile" />
</logger>

<!-- 全局输出的方式 -->
<root>
<priority value="debug" />
<appender-ref ref="cmd" />
<appender-ref ref="file" />
<appender-ref ref="task-file" />
</root>

</log4j:configuration>



[b]logger的additivity[/b]
表示,子Logger是否继承父Logger的输出源(appender),默认为true,即子Logger会继承父Logger的appender,在父Logger的日志输出中,会出现子Logger的日志信息,设为false,则各自输出各自的。

[b]filter说明[/b]
过滤器包括:LogLevelMatchFilter、LogLevelRangeFilter、
和StringMatchFilter

对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch(true|false), 只有
当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。

LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息
的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。

对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值
与StringToMatch对应的LogLevel值与相同, 且AcceptOnMatch为true时会匹配。

附:Log4j XML DTD 说明文章
[url]http://wiki.apache.org/logging-log4j/Log4jXmlFormat[/url]
log4j.dtd文件,可以在\org\apache\log4j\xml\中找到,uri的没找到,log4j官网doc里,把这个文件的链接删了
<think>首先,用户的问题是关于如何在两个应用共用同一个log4j2.xml配置文件时,将日志文件按照固定的名字区分开。具体来说,就是让不同的应用生成不同名称的日志文件。 现在,回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 关于loggers元素的配置。 - 引用[2]: 关于使用变量自定义属性。 - 引用[3]: 关于配置文件的格式。 - 引用[4]: 关于log4j2的性能导入。 - 引用[5]: 关于滚动策略文件名格式。 用户的问题是基于两个应用共享同一个log4j2.xml文件,但需要区分日志文件名。我需要提供一个解决方案。 关键点: - 在log4j2中,可以使用属性来动态设置文件名。 - 例如,通过系统属性或环境变量来指定应用名称,然后在配置文件中引用这个变量。 解决方案步骤: 1. 在启动应用时设置一个系统属性,比如app.name。 2. 在log4j2.xml中使用这个属性来定义文件名。 3. 确保每个应用在启动时传递不同的app.name值。 例如: - 在Java启动命令中:`java -Dapp.name=app1 -jar myapp.jar` - 在log4j2.xml中,使用`${sys:app.name}`来引用这个属性。 在配置文件中: ```xml <Configuration> <Properties> <Property name="logFileName">logs/${sys:app.name}.log</Property> </Properties> <Appenders> <File name="FileAppender" fileName="${logFileName}"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/> </File> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="FileAppender"/> </Root> </Loggers> </Configuration> ``` 这样,当app.name设置为app1时,日志文件名为app1.log;当设置为app2时,为app2.log。 参考引用: - 引用[2]提到使用变量在配置中输出变量值来理解。 - 引用[3]提到配置文件的格式。 - 引用[5]提到文件名格式滚动策略。 我需要在回答中自然地添加引用标识。例如,在解释变量使用时,可以引用[2]。 回答结构: 1. **介绍问题**:解释共享配置的需求挑战。 2. **解决方案**:逐步说明如何实现。 - 步骤1: 设置系统属性。 - 步骤2: 在配置文件中定义使用属性。 - 步骤3: 确保每个应用启动时传递不同的值。 3. **示例配置**:提供完整的配置示例。 4. **注意事项**:提醒可能的问题,如属性未设置时的默认值。 5. **生成相关问题**:在最后添加相关问题。 使用中文回答。 生成相关问题: - 基于主题,生成3个相关问题。 - 例如: 1. 如何在log4j2中设置动态日志文件名? 2. 共享log4j2配置文件的最佳实践是什么? 3. 如何处理多个应用的日志滚动策略? 确保LaTeX语法:用户的问题没有数学内容,所以可能不需要数学表达式。但如果涉及,要用$...$或$$...$$。 最终回答: - 开头:直接回应问题。 - 主体:清晰步骤。 - 结尾:相关问题。</think>### 如何在多个应用中共享log4j2.xml配置文件并区分日志文件名 当多个应用共用同一个 `log4j2.xml` 配置文件时,需要将日志文件按应用名称区分开。这可以通过 **动态属性** 实现,具体步骤如下: #### 步骤1: 在启动应用时设置系统属性 为每个应用在启动命令中定义一个唯一的系统属性(如 `app.name`),用于标识应用名称。例如: - 应用1启动命令: ```bash java -Dapp.name=app1 -jar your-application.jar ``` - 应用2启动命令: ```bash java -Dapp.name=app2 -jar your-application.jar ``` 这里的 `-Dapp.name` 设置了系统属性,后续在配置文件中通过 `${sys:app.name}` 引用[^2]。 #### 步骤2: 在log4j2.xml中定义动态文件名 在配置文件中使用 `<Properties>` 定义日志文件路径,并引用系统属性。以下是完整配置示例: ```xml <Configuration> <!-- 定义动态属性 --> <Properties> <!-- 使用系统属性app.name作为文件名前缀 --> <Property name="logPath">logs/${sys:app.name}.log</Property> </Properties> <Appenders> <!-- File Appender使用动态文件名 --> <File name="FileAppender" fileName="${logPath}"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <!-- 根日志记录器 --> <Root level="info"> <AppenderRef ref="FileAppender"/> </Root> </Loggers> </Configuration> ``` - **关键点**: - `${sys:app.name}` 动态获取应用名称,生成如 `app1.log` 或 `app2.log` 的文件[^2][^3]。 - 如果属性未设置,可添加默认值:`<Property name="logPath">logs/default.log</Property>`。 #### 步骤3: 验证测试 - 启动应用后,检查日志目录: - 应用1生成 `app1.log` - 应用2生成 `app2.log` - 若文件名未生效,可在配置中添加测试输出(如 `<Property name="test">${sys:app.name}</Property>`)并检查日志内容[^2]。 #### 注意事项 - **路径权限**:确保所有应用有权限写入 `logs/` 目录。 - **滚动策略**:如需按时间或大小滚动日志,在 `<File>` 中添加策略(如 `SizeBasedTriggeringPolicy`),文件名会自动继承动态属性[^5]。 - **共享配置优化**:为避免冲突,可在 `<Loggers>` 中为不同名设置不同级别(如 `<logger name="com.app1" level="debug"/>`)[^4]。 - **性能影响**:动态属性对性能影响极小,log4j2的异步日志机制可进一步优化吞吐量[^4]。 通过以上方法,多个应用能安全共享同一配置文件,同时保持日志文件独立[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值