Java 如何修改所选日志消息以打印到其他日志文件?
我使用log4j将消息打印到Java项目中的日志文件中 我的当前日志文件设置为log.INFO级别,这将生成一个名为logFile1.log的日志文件 我想将同一组消息打印到不同的日志文件(logFile2.log)中,并稍微修改选定数量的消息 代码例如:Java 如何修改所选日志消息以打印到其他日志文件?,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我使用log4j将消息打印到Java项目中的日志文件中 我的当前日志文件设置为log.INFO级别,这将生成一个名为logFile1.log的日志文件 我想将同一组消息打印到不同的日志文件(logFile2.log)中,并稍微修改选定数量的消息 代码例如: log.info("Customer created"); log.info("Customer name:" +customerName); <instead of the above log message, her
log.info("Customer created");
log.info("Customer name:" +customerName);
<instead of the above log message, here I want to print "ABC" in logFile2.log>
log.info("Phone number added");
log.info("Phone number:" +phoneNumber);
<instead of the above log message, here I want to print "DEF" in logFile2.log>
以下是我希望logFile2.log的外观:
Customer created
ABC
Phone number added
DEF
<PatternLayout>
<ScriptPatternSelector defaultPattern="%m%n">
<Script name="BeanShellSelector" language="bsh"><![CDATA[
if (logEvent.getMessage() != null) {
String msg = logEvent.getMessage().getFormattedMessage();
if (msg.startsWith("Customer name:")) {
return "CustomerName";
} else if (msg.startsWith("Phone number:")) {
return "PhoneNumber";
}
return null;
} else {
return null;
}]]>
</Script>
<PatternMatch key="CustomerName" pattern="ABC%n"/>
<PatternMatch key="PhoneNumber" pattern="DEF%n"/>
</ScriptPatternSelector>
</PatternLayout>
实现这一点最有效的方法是什么?log4j.logger.logFile1=DEBUG,file1Appender
log4j.logger.logFile1 =DEBUG, file1Appender
log4j.logger.logFile2= DEBUG, file2Appender
log4j.additivity.logFile1=false
log4j.additivity.logFile2=false
log4j.appender.file1Appender=org.apache.log4j.RollingFileAppender
log4j.appender.file1Appender.File=<path>/logFile1.log
log4j.appender.file1Appender.MaxFileSize=1MB
log4j.appender.file1Appender.MaxBackupIndex=1
log4j.appender.file1Appender.layout=org.apache.log4j.PatternLayout
log4j.appender.file1Appender.layout.ConversionPattern=<specify your pattern>
log4j.appender.file2Appender=org.apache.log4j.RollingFileAppender
log4j.appender.file2Appender.File=<path>/logFile2.log
log4j.appender.file2Appender.MaxFileSize=1MB
log4j.appender.file2Appender.MaxBackupIndex=1
log4j.appender.file2Appender.layout=org.apache.log4j.PatternLayout
log4j.appender.file2Appender.layout.ConversionPattern=<specify your pattern>
log4j.logger.logFile2=DEBUG,file2Appender
log4j.additivity.logFile1=false
log4j.additivity.logFile2=false
log4j.appender.file1Appender=org.apache.log4j.RollingFileAppender
log4j.appender.file1Appender.File=/logFile1.log
log4j.appender.file1Appender.MaxFileSize=1MB
log4j.appender.file1Appender.MaxBackupIndex=1
log4j.appender.file1Appender.layout=org.apache.log4j.patternalyout
log4j.appender.file1Appender.layout.ConversionPattern=
log4j.appender.file2Appender=org.apache.log4j.RollingFileAppender
log4j.appender.file2Appender.File=/logFile2.log
log4j.appender.file2Appender.MaxFileSize=1MB
log4j.appender.file2Appender.MaxBackupIndex=1
log4j.appender.file2Appender.layout=org.apache.log4j.patternalyout
log4j.appender.file2Appender.layout.ConversionPattern=
然后你可以把这些信息记录到不同的记录器上?拥有自己的扩展appender并在引发事件之前修改消息我可以想出几种方法来处理此问题。两者都假设您使用的是Log4j2的模式布局 第一个选项是使用PatternLayout的replace属性。但是,我不知道可以用单个正则表达式中的不同值替换多个字符串。如果试图屏蔽某些字段并将其全部替换为“***”或类似字段,则此选项更有用 第二种选择是使用模式选择器。在此选项中,您可以使用ScriptPatternSelector或创建自定义PatternSelector来比较消息文本并选择要使用的模式。这看起来像:
Customer created
ABC
Phone number added
DEF
<PatternLayout>
<ScriptPatternSelector defaultPattern="%m%n">
<Script name="BeanShellSelector" language="bsh"><![CDATA[
if (logEvent.getMessage() != null) {
String msg = logEvent.getMessage().getFormattedMessage();
if (msg.startsWith("Customer name:")) {
return "CustomerName";
} else if (msg.startsWith("Phone number:")) {
return "PhoneNumber";
}
return null;
} else {
return null;
}]]>
</Script>
<PatternMatch key="CustomerName" pattern="ABC%n"/>
<PatternMatch key="PhoneNumber" pattern="DEF%n"/>
</ScriptPatternSelector>
</PatternLayout>
这个配置如何改变OP所要求的结果输出?你使用Log4J 1 x还是Log4J 2?我使用Log4J 1.XI可以切换到Log4J 2,如果需要的话。