The*_*NVB 6 java logging log4j2
对于log4j2,是否可以针对不同的日志级别使用不同的模式布局并输出到SYSTEM_OUT?
这是我的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="debugMsg" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %l - %msg%n"/>
</Console>
<Console name="infoMsg" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace" additivity="false">
<AppenderRef ref="infoMsg" level="info"/>
<AppenderRef ref="debugMsg" level="debug"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
但是,INFO级别消息以"infoMsg"和"debugMsg"模式显示.
2015-12-24 10:51:56.176 Log4j is ready.
[INFO ] 2015-12-24 10:51:56.176 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:65) - Log4j is ready.
2015-12-24 10:51:56.176 Configuration file is loaded
[INFO ] 2015-12-24 10:51:56.176 com.myftpserver.Configuration.load(Configuration.java:74) - Configuration file is loaded
[DEBUG] 2015-12-24 10:51:56.176 com.myftpserver.Configuration.load(Configuration.java:82) - supportPassiveMode=true
2015-12-24 10:51:56.301 User Manager class is loaded.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.Configuration.load(Configuration.java:119) - User Manager class is loaded.
2015-12-24 10:51:56.301 File Manager class is loaded.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.Configuration.load(Configuration.java:121) - File Manager class is loaded.
2015-12-24 10:51:56.301 Server Initialization completed.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:69) - Server Initialization completed.
2015-12-24 10:51:56.301 Available passive port:[1232, 1233, 1234]
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:75) - Available passive port:[1232, 1233, 1234]
Run Code Online (Sandbox Code Playgroud)
那么,是否可以删除重复项?
非常感谢你和Merry X'mas
最新版本的Log4j2允许使用模式选择器而不仅仅是单个模式.Log4j提供基于标记的选择器,但不提供基于级别的选择器.创建一个Jira问题,我将添加它.但是,Log4j允许您使用脚本来选择模式.编写一个基于级别选择的文件会很简单.
在上面的配置中,调试appender也将输出信息级事件,这就是你看到重复项的原因.
我没有测试过,但我相信下面的配置应该做你想要的:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<ScriptPatternSelector defaultPattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %l - %msg%n">
<Script name="LevelSelector" language="bsh"><![CDATA[
if (logEvent.getLevel() == org.apache.logging.log4j.Level.INFO) {
return "INFO";
}
return null;
]]>
</Script>
<PatternMatch key="INFO" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
</ScriptPatternSelector>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
是的。从 log4j 2.13 开始,就有了 LevelPatternSelector。你可以这样使用它。
我使用错误/致命情况作为默认模式。您也可以明确指定它。
<Console name="stdout" target="SYSTEM_OUT">
<PatternLayout>
<LevelPatternSelector defaultPattern="%highlight{[%p] %d{HH:mm:ss} %c:%L %m}{bright,red}%n">
<PatternMatch key="WARN" pattern="%highlight{[%p] %d{HH:mm:ss} %c:%L %m}{bright,yellow}%n" />
<PatternMatch key="INFO" pattern="[%style{%p}{blue}] %d{HH:mm:ss} %c:%L %m%n" />
<PatternMatch key="DEBUG" pattern="[%p] %d{HH:mm:ss} %c:%L %m%n" />
<PatternMatch key="TRACE" pattern="[%p] %d{HH:mm:ss} %c:%L %m%n" />
</LevelPatternSelector>
</PatternLayout>
</Console>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2308 次 |
| 最近记录: |