2014-04-27 5 views
15

Это может быть очень простой вопрос для некоторых, но лично я нахожу конфигурацию Log4j в кошмарной сложности и что обучение выполнению операций на головном мозге может быть менее сложным.Log4j config - разные журналы для разных файлов

Я пытаюсь запустить несколько регистраторов в разных файлах. Вот что у меня есть в моем log4j.properties файле:

# Root logger option 
log4j.rootLogger=INFO, file, admin 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=/home/nick/logging/file.log 
log4j.appender.file.MaxFileSize=1MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

log4j.appender.admin=org.apache.log4j.RollingFileAppender 
log4j.appender.admin.File=/home/nick/logging/admin.log 
log4j.appender.admin.MaxFileSize=1MB 
log4j.appender.admin.MaxBackupIndex=1 
log4j.appender.admin.layout=org.apache.log4j.PatternLayout 
log4j.appender.admin.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

А вот мой (очень простой) Java приложение используется для проверки конфигурации:

public static void main(String[] args) throws Exception { 

    Properties resource = new Properties(); 
    InputStream in = new FileInputStream("/home/nick/logging/log4j.properties"); 
    resource.load(in); 
    PropertyConfigurator.configure(resource); 

    Logger admin = Logger.getLogger("admin"); 
    Logger file = Logger.getLogger("file"); 

    admin.info("hello admin"); 
    file.info("hello file"); 
} 

У меня есть 2 проблемы:

Одна проблема, которую я всегда получаю исключение в строке PropertyConfigurator.configure(resource);:

java.io.FileNotFoundException: /home/nick/logging (Is a directory) 
at java.io.FileOutputStream.open(Native Method) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:212) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:136) 
at org.apache.log4j.FileAppender.setFile(FileAppender.java:289) 
at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:167) 
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:163) 
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:256) 

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

админ Файл: войти: file.log

2014-04-27 11:55:30 INFO admin - hello admin 
2014-04-27 11:55:30 INFO file - hello file 

Файл:

2014-04-27 11:55:30 INFO admin - hello admin 
2014-04-27 11:55:30 INFO file - hello file 

Вот требуется результат:

Файл администратора : log:

2014-04-27 11:55:30 INFO admin - hello admin 

file.log Файл:

2014-04-27 11:55:30 INFO file - hello file 

Что вызывает исключение, и как я могу добиться нужного результата?

+0

Попробуйте относительный путь 'new FileInputStream (« home/nick/logging/log4j.properties »);'. удалите первый '/', чтобы сделать его относительным путем. – Braj

ответ

1

Вам не нужно загружать файл свойств. Просто поместите его в папку src, которая будет автоматически добавлена ​​в путь класса.

Пример кода:

public static void main(String[] args) throws Exception { 

    Logger admin = Logger.getLogger("admin"); 
    Logger file = Logger.getLogger("file"); 

    admin.info("hello admin"); 
    file.info("hello file"); 
} 
+0

Спасибо - в файле src появился еще один файл log4j.properties, и он собирал этот, следовательно, исключение. Итак, это отсортировано. Но все еще проблема обоих сообщений, идущих в оба файла ... – NickJ

+0

Посмотрите на [log4j-properties-examples] (http://www.mkyong.com/logging/log4j-log4j-properties- примеры /) – Braj

+0

Видел это уже. Я основывал свою конфигурацию на 3. Вывод на консоль и файл, но был изменен как два разных файла. – NickJ

0

Первое: log4j recommands использовать XML-файл формата для свойств.

Во-вторых: его лучше загрузить файл свойств в загрузчик классов.

Третье: есть наследование в регистраторе, но вы можете вырезать его свойству аддитивности см log4j.properties file - multiple loggers in same class

+0

действительно не понимают, что там происходит – NickJ

+1

Забудьте первый и второй, у вас есть свой ответ, посмотрите на аддитивность – spopoff

8

Чтобы ответить на мой собственный вопрос, это то, что мне было нужно:

log4j.logger.file=DEBUG, fileAppender 
log4j.logger.admin=DEBUG, adminAppender 

log4j.additivity.file=false 
log4j.additivity.admin=false 

log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.fileAppender.File=/home/nick/logging/file.log 
log4j.appender.fileAppender.MaxFileSize=1MB 
log4j.appender.fileAppender.MaxBackupIndex=1 
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

log4j.appender.adminAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.adminAppender.File=/home/nick/logging/admin.log 
log4j.appender.adminAppender.MaxFileSize=1MB 
log4j.appender.adminAppender.MaxBackupIndex=1 
log4j.appender.adminAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.adminAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 
52

Log4J делает различие между регистраторы, ответственные за создание сообщений журнала, и appenders, которые несут ответственность за отправку этих сообщений где-нибудь (файл, консоль, база данных и т. Д.).Регистраторы формируют иерархию, корневой регистратор - это родительский логгер с именем admin, который является родителем admin.component1 и т. Д., И вы можете прикреплять приложения к любому регистратору в иерархии. По умолчанию регистратор отправляет сообщения всем приятелям, прикрепленным непосредственно к нему, или любому из его предков в иерархии (поэтому регистраторы обычно называются Java-классами, например, вы можете управлять протоколированием для com.example.Class1 и com.example.subpkg.AnotherClass путем настройки com.example регистратор).

Регистраторы и приставки образуют отдельные пространства имен, и это источник вашей путаницы - регистратор с именем admin, а приложение с именем admin - это два отдельных объекта.

Конфигурация, заданная вами в задании, определяет один регистратор (корневой журнал), который отправляет все сообщения, которые он генерирует, двум отдельным appenders, по одному для каждого из двух файлов. Затем ваш код запрашивает два разных регистратора и генерирует одно сообщение журнала с каждым регистратором. Оба этих регистратора наследуют конфигурацию appender от корневого регистратора, поэтому оба отправляют свои сообщения в как настроенных приложений.

enter image description here

Вместо крепления двух appenders в корневой регистратор, вы должны прикрепить file Appender к file регистраторе и admin Appender к admin регистраторе:

log4j.rootLogger=INFO 
log4j.logger.file=INFO, file 
log4j.logger.admin=INFO, admin 

Таким образом file logger отправит сообщения только file.log, регистратор admin только admin.log, и все сообщения от другие регистраторов будут отключены, поскольку к корню нет добавок.

enter image description here


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

+0

Это лучшее объяснение лесорубов, которые я видел. Это очень полезно. –

Смежные вопросы