Что было бы хорошим способом обработки пользовательских сообщений журнала для разных файлов для одного и того же оператора в Java? - PullRequest
0 голосов
/ 14 июля 2020

Не уверен, что этот вопрос размещен на правильном форуме.

Пожалуйста, укажите мне на правильный форум, если вопросы типа дизайна предполагается размещать где-то еще.

Справочная информация : Java проект. Использование log4j. xml. Maven. TestNG.

Каждый тест распечатывает операторы в два файла журнала - нефильтрованный файл журнала и фильтрованный файл журнала. Все сообщения должны быть напечатаны в том виде, в каком они есть, в обоих файлах. За исключением нескольких сообщений, в которых измененное сообщение (значения переменных удалены) необходимо распечатать во втором файле журнала (файл журнала с фильтрами).

Пример тестового кода с операторами печати:

1. printInfo("Login completed");
2. printInfo("Home page displayed");
// Here the value of accountNumber variable is random and changes with each run.
3. printInfo("Account number " + accountNumber + " created", "printUnfilteredMessageOnlyForUnfilteredLog");
4. printInfo("Account number created", "replaceMessageForFilteredLog");

Идея состоит в том, что оба файла журнала будут содержать Строку 1 и Строку 2. Строка 3 будет go только для Нефильтрованного файла журнала. Строка 4 будет go только для отфильтрованного файла журнала.

Код метода:

Logger unfilteredLogFile = Logger.getLogger("unfilteredLogFileLogger");
Logger filteredLogFile = Logger.getLogger("filteredLogFileLogger");

public void printInfo(String message, String level) {
    if (level.equalsIgnoreCase("")) {
            //Print the same message in both the log files
            unfilteredLogFile.info("Unfiltered Log :"+message);
            filteredLogFile.debug("Filtered Log :"+message);
        } else if (level.equalsIgnoreCase("printUnfilteredMessageOnlyForUnfilteredLog")) {
            unfilteredLogFile.info("Unfiltered Log :"+message);
        } else if (level.equalsIgnoreCase("replaceMessageForFilteredLog")) {
            filteredLogFile.debug("Filtered Log :"+message);
        }
    }

Этот код успешно работает согласно моим требованиям.

ПРАВИЛЬНЫЙ ВЫХОД:

unfilteredLogFile.log:

Unfiltered Log :Login completed
Unfiltered Log :Home page displayed
Unfiltered Log :Account number 4876 created


filteredLogFile.log:

Filtered Log :Login completed
Filtered Log :Home page displayed
Filtered Log :Account number created

Log4j. xml:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
                     debug="false">
    <appender name="fileAppender" class="org.apache.log4j.FileAppender">
        <param  name="File" value="./log/unfilteredLogFile.log" />
        <param name="append" value="false" />
        <param name="Threshold" value="INFO"/>
    </appender>
    <appender name="unfilteredLog" class="org.apache.log4j.FileAppender">
        <param name="File" value="./log/filteredLogFile.log" />
        <param name="append" value="false" />
        <param name="Threshold" value="DEBUG"/>
    </appender>


    <logger name="unfilteredLogFileLogger" additivity="false">
        <appender-ref ref="fileAppender"/>
    </logger>
    <logger name="filteredLogFileLogger" additivity="false">
        <appender-ref ref="filteredLog"/>
    </logger>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="filteredLog"/>
    </root>
</log4j:configuration>

Этот код успешно работает в соответствии с моими требованиями. Однако это означает, что для каждого оператора printInfo в коде, где должна произойти замена, мне нужно написать две строки кода, по одной для каждого файла журнала, что не похоже на самый оптимальный способ или чистый код.

Есть ли другой дизайн для обработки этого сценария, но с тем же результатом? Или это лучший вариант для этого требования?

Я подумал о текстовом файле, который мог бы быть списком пар ключ-значение. Ключом будет нефильтрованное сообщение, а значением - отфильтрованное сообщение. Но добиться этого не удалось, так как список не мог бы иметь случайные значения для сравнения.

Пожалуйста, дайте мне знать ваши мысли.

1 Ответ

1 голос
/ 15 июля 2020

Что вы можете сделать, так это создать 3 настраиваемых уровня журнала - НЕФИЛЬТР, ФИЛЬТР и ОБЩИЙ - как показано здесь . Затем сделайте ОБЩИЙ логгера уровня журнала потомков (отметьте здесь и здесь ) как НЕФИЛЬТРОВАННЫХ, так и ФИЛЬТРОВАННЫХ уровней журнала, чтобы все, что зарегистрировано в ОБЩЕМ, попадало на них обоих . Это должно решить то, чего вы хотите достичь.

Однако это может быть неправильное использование уровней журнала. Это устранит гибкость использования предопределенных уровней журнала - информация, отладка, ошибка и т. Д. c.

...