Как изменить выбранные сообщения журнала для печати в другой файл журнала? - PullRequest
0 голосов
/ 17 апреля 2020

Я использую 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>

Вот как выглядит logFile1.log:

Customer created
Customer name:Bob
Phone number added
Phone number:123-456-7890

Вот как я хочу, чтобы мой logFile2.log выглядел так:

Customer created
ABC
Phone number added
DEF

Какой самый эффективный способ добиться этого?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Есть несколько способов справиться с этим, о которых я могу подумать. Оба предполагают, что вы используете PatternLayout Log4j2.

Первый вариант - использовать атрибут замены PatternLayout. Однако я не знаю, что можно заменить несколько строк разными значениями из одного регулярного выражения. Это более полезно, если вы пытаетесь замаскировать определенные поля и заменить их на «****» или аналогичные.

Второй вариант - использовать PatternSelector. В этом варианте вы либо используете ScriptPatternSelector, либо создаете собственный PatternSelector для сравнения текста сообщения и выбора шаблона для использования. Это будет выглядеть так:

<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>
0 голосов
/ 17 апреля 2020
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>

А потом вы можете войти в другой регистратор сообщений? Создайте собственный расширенный appender и измените сообщение, прежде чем инициировать событие

...