Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修改所选日志消息以打印到其他日志文件?_Java_Logging_Log4j_Log4j2 - Fatal编程技术网

Java 如何修改所选日志消息以打印到其他日志文件?

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

我使用log4j将消息打印到Java项目中的日志文件中

我的当前日志文件设置为log.INFO级别,这将生成一个名为logFile1.log的日志文件

我想将同一组消息打印到不同的日志文件(logFile2.log)中,并稍微修改选定数量的消息

代码例如:

    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,如果需要的话。