log4J2 логи не записываются в файл - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу хранить логи в 2 разных файлах.С одной стороны, мои журналы не записываются в файлы, но файлы создаются, а с другой стороны, в консоли отображаются только уровни «error» и «fatal». файл свойств:

name=PropertiesConfig
property.filename = logs
appenders = console, user, system

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n



appender.user.type = File
appender.user.name = LOGFILE
appender.user.fileName=${filename}/user.log
appender.user.layout.type=PatternLayout
appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
appender.user.MaxFileSize=5120KB
appender.user.MaxBackupIndex=10


appender.system.type = File
appender.system.name = LOGFILE
appender.system.fileName=${filename}/system.log
appender.system.layout.type=PatternLayout
appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
appender.system.MaxFileSize=5120KB
appender.system.MaxBackupIndex=10




Loggers = file
logger.file.name = de.pares.int_plan
logger.file.level = All
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref  = LOGFILE

Вот как я создаю регистраторы:

private static Logger userLog = LogManager.getLogger("user");
private static Logger systemLog = LogManager.getLogger("system");

Используйте их так:

userLog.debug("UserLogger: This is a debug message");
userLog.info("UserLogger: This is an info message");
userLog.warn("UserLogger: This is a warn message");
userLog.error("UserLogger: This is an error message");
userLog.fatal("UserLogger: This is a fatal message");

systemLog.debug("SystemLogger: This is a debug message");
systemLog.info("SystemLogger: This is an info message");
systemLog.warn("SystemLogger: This is a warn message");
systemLog.error("SystemLogger: This is an error message");
systemLog.fatal("SystemLogger: This is a fatal message");

чтоя делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Есть несколько проблем со свойствами, которые вы определили.Я постараюсь объяснить каждый из них по одному.Однако вам следует обратиться к руководству log4j2, касающемуся конфигурации свойств , и провести собственное исследование , чтобы найти примеры, в которых используются свойства log4j2, или другие вопросы, касающиеся свойств log4j2, которые помогут вам, когда вы застрялии включите эту информацию в свой вопрос.

Вы сказали, что на консоли отображаются только уровни ошибок и фатальные ошибки.Это связано с тем, что вы не определили корневой логгер.Как указано в руководстве log4j2 :

Каждая конфигурация должна иметь корневой логгер.Если один из них не настроен, будет использован корневой каталог по умолчанию LoggerConfig, который имеет уровень ОШИБКИ и к которому подключен консольный приложение.

, поскольку аддитивность по умолчанию trueи вы не отключили его, все события журнала отправляются в корневой регистратор по умолчанию, как упоминалось выше.В результате в консоль записываются только те события, которые являются ошибочными или фатальными, так как уровень корневого регистратора по умолчанию равен ERROR

Теперь, что касается конфигурации ваших свойств, вот проблемы:

  1. У ваших файловых приложений есть недопустимые атрибуты "MaxBackupIndex", "MaxFileSize".Следующие две строки не применимы к файловому аппендеру:

    appender.user.MaxFileSize=5120KB

    appender.user.MaxBackupIndex=10

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

  2. Если вы используете log4j2 версии 2.6 или выше, тогда вы не понимаете 'эти строки не нужны:

    appenders = console, user, system

    Loggers = file

    Вы не указали, какую версию вы используете, поэтому я предположил, что вы используете последнюю версию вв этом случае эти строки не нужны.Я также прокомментировал эти строки.

  3. Оба ваших дополнения используют одно и то же имя "LOGFILE".Я изменил имя пользовательского приложения на «userLog», а имя системного приложения на «systemLog».(подробности см. далее в ответе)

  4. Вы определили только один регистратор, и его имя не соответствует имени, которое вы используете для его получения.Вот почему все ваши события журнала идут в корневой логгер по умолчанию.У вас есть logger.file.name = de.pares.int_plan, но de.pares.int_plan не является одним из имен, которые вы использовали в своем коде Java для получения регистратора.Вы использовали user и system.Я исправил их в свойствах (см. Полные свойства позже в ответе).

  5. Вам не хватает «%» до c{1} в шаблоне обоих файловых дополнений.

  6. В вашем определении логгера logger.file.appenderRefs = file есть дополнительная строка, которая, по-видимому, не требуется на основании примера в log4j2 руководстве .

Собрав все эти исправления вместе, я получил следующие свойства:

name=PropertiesConfig
property.filename = logs
#Removed the following line since latest log4j2 does not need it
#appenders = console, user, system

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

appender.user.type = File
appender.user.name = userLog
appender.user.fileName=${filename}/user.log
appender.user.layout.type=PatternLayout
appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#Removed attributes that do not apply to file appender
#appender.user.MaxFileSize=5120KB
#appender.user.MaxBackupIndex=10

appender.system.type = File
appender.system.name = systemLog
appender.system.fileName=${filename}/system.log
appender.system.layout.type=PatternLayout
appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#Removed attributes that do not apply to file appender
#appender.system.MaxFileSize=5120KB
#appender.system.MaxBackupIndex=10

#Removed the following line since latest log4j2 does not need it
#Loggers = file
logger.userFile.name = user
logger.userFile.level = All
logger.userFile.appenderRef.user.ref  = userLog

logger.systemFile.name = system
logger.systemFile.level = All
logger.systemFile.appenderRef.system.ref = systemLog

#Adding the following commented lines for reference - this is how you define the root logger in the properties.
#rootLogger.level = info
#rootLogger.appenderRef.console.ref = STDOUT

Для проверки этой конфигурации я использовал следующий код:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static Logger userLog = LogManager.getLogger("user");
    private static Logger systemLog = LogManager.getLogger("system");

    public static void main(String[] args){

        systemLog.debug("This is the top of main method");
        if(userLog.isDebugEnabled())
            userLog.debug("This is some debug!");
        userLog.info("Here's some info!");
        userLog.error("Some error happened!");
        systemLog.info("This is the end of main method");
        systemLog.error("woops an error occurred");
    }
}

Результатдва файла журнала:

system.log

[DEBUG] 2019-02-16 18:04:04.980 [main] system - This is the top of main method
[INFO ] 2019-02-16 18:04:04.980 [main] system - This is the end of main method
[ERROR] 2019-02-16 18:04:04.980 [main] system - woops an error occurred

user.log

[DEBUG] 2019-02-16 18:04:04.980 [main] user - This is some debug!
[INFO ] 2019-02-16 18:04:04.980 [main] user - Here's some info!
[ERROR] 2019-02-16 18:04:04.980 [main] user - Some error happened!

и консольный вывод:

[DEBUG] 2019-02-16 18:04:04.980 [main] system - This is the top of main method
[DEBUG] 2019-02-16 18:04:04.980 [main] user - This is some debug!
[INFO ] 2019-02-16 18:04:04.980 [main] user - Here's some info!
[ERROR] 2019-02-16 18:04:04.980 [main] user - Some error happened!
[INFO ] 2019-02-16 18:04:04.980 [main] system - This is the end of main method
[ERROR] 2019-02-16 18:04:04.980 [main] system - woops an error occurred

Чтобы полностью понять вывод консоли, пожалуйста, обратитесь к руководству log4j2 - раздел под названием Аддитивность .

Надеюсь, это поможет!

0 голосов
/ 11 февраля 2019

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

appender.user.type = File
appender.user.name = LOGFILE
#                    ^^^^^^^ This must be distinct - it conflicts with appender.system
appender.user.fileName=${filename}/user.log
appender.user.layout.type=PatternLayout
appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
#                                                         missing % here ^^^^
appender.user.MaxFileSize=5120KB
appender.user.MaxBackupIndex=10

appender.system.type = File
appender.system.name = LOGFILE
#                      ^^^^^^^ This must be distinct - it conflicts with appender.user
appender.system.fileName=${filename}/system.log
appender.system.layout.type=PatternLayout
appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
#                                                           missing % here ^^^^
appender.system.MaxFileSize=5120KB
appender.system.MaxBackupIndex=10
...