Log4j: как настроить простейшее ведение журнала файлов?
моя история:
Я хочу сделать вещь, которая так же проста, как самый простой log4j logger, который записывает строки в файл. Я нашел несколько примеров с некоторой функциональностью, но не базовый, общий, который действительно работает, а не один с объяснением того, как работает каждая строка.
вопрос:
может ли кто-нибудь предоставить один?
требования:
- I уже знаю, куда поместить файл, и у меня есть log4j настроен и работает для ведения журнала консоли.
- теперь я хочу войти в файл и файл из файловой системы после выполнения программы.
- строки должны быть добавлены к существующей
log4j.properties
файл-это желаемый результат.
4 ответа:
у меня есть один общий log4j.xml файл для вас:
<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration debug="false"> <appender name="default.console" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="default.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/mylogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="another.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/anotherlogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <logger name="com.yourcompany.SomeClass" additivity="false"> <level value="debug" /> <appender-ref ref="another.file" /> </logger> <root> <priority value="info" /> <appender-ref ref="default.console" /> <appender-ref ref="default.file" /> </root> </log4j:configuration>
С одной консолью, два файла appender и один регистратор poiting на второй файл appender вместо первого.
EDIT
в одном из старых проектов я нашел простой файл log4j. properties:
# For the general syntax of property based configuration files see # the documentation of org.apache.log4j.PropertyConfigurator. # The root category uses two appenders: default.out and default.file. # The first one gathers all log output, the latter only starting with # the priority INFO. # The root priority is DEBUG, so that all classes can be logged unless # defined otherwise in more specific properties. log4j.rootLogger=DEBUG, default.out, default.file # System.out.println appender for all classes log4j.appender.default.out=org.apache.log4j.ConsoleAppender log4j.appender.default.out.threshold=DEBUG log4j.appender.default.out.layout=org.apache.log4j.PatternLayout log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n log4j.appender.default.file=org.apache.log4j.FileAppender log4j.appender.default.file.append=true log4j.appender.default.file.file=/log/mylogfile.log log4j.appender.default.file.threshold=INFO log4j.appender.default.file.layout=org.apache.log4j.PatternLayout log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n
описание всех аргументов макета смотрите здесь:log4j PatternLayout аргументы
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="INFO" /> <param name="File" value="sample.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="fileAppender" /> </root> </log4j:configuration>
Log4j может быть немного запутанным. Итак, давайте попробуем понять, что происходит в этом файле: В log4j у вас есть две основные конструкции-приложения и регистраторы.
Appenders определить, как и где все добавляются. Будет ли он записан в файл, в консоль, в базу данных и т. д.? В этом случае вы указываете, что инструкции журнала, направленные на fileAppender, будут помещены в файл
sample.log
используя шаблон, указанный в элементе планировка метить. Вы можете так же легко создать приложение для консоли или базы данных. Где приложение консоли будет указывать такие вещи, как макет на экране, а приложение базы данных будет иметь сведения о соединении и имена таблиц.лесозаготовителей реагировать на события регистрации, как они пузырятся. Если событие захватывает интерес конкретного регистратора, он будет вызывать его прикрепленные приложения. В приведенном ниже примере у вас есть только один регистратор корневой регистратор-который отвечает все события ведения журнала по умолчанию. В дополнение к корневому регистратору можно указать более конкретные регистраторы, которые реагируют на события из определенных пакетов. Эти регистраторы могут иметь свои собственные приложения, указанные с помощью
appender-ref
теги или иным образом наследуют приложения от корневого регистратора. Использование более конкретных регистраторов позволяет точно настроить уровень ведения журнала для конкретных пакетов или направить определенные пакеты другим добавителям.Итак, что говорит этот файл это:
- создать fileAppender, который входит в систему образец файла.журнал
- прикрепите это приложение к корню лесоруб.
- регистратор корня ответит к любому события, по крайней мере, столь же подробные, как 'отладка' уровень
- приложение настроено только на журнал событий не менее подробно, как "информация"
сеть заключается в том, что если у вас есть
logger.debug("blah blah")
в коде он будет игнорироваться. Аlogger.info("Blah blah");
выводить образец.бревно.фрагмент кода ниже может быть добавлен в файл выше с log4j теги. Этот регистратор унаследует приложения от
<root>
но ограничил бы все события регистрации из пакетаorg.springframework
для тех, кто регистрируется на уровнеinfo
или выше.<!-- Example Package level Logger --> <logger name="org.springframework"> <level value="info"/> </logger>
вот простой, который я часто использую:
# Set up logging to include a file record of the output # Note: the file is always created, even if there is # no actual output. log4j.rootLogger=error, stdout, R # Log format to standard out log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n # File based log output log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=owls_conditions.log log4j.appender.R.MaxFileSize=10000KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
формат журнала выглядит следующим образом:
ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44) http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
такой формат определяется строкой
%5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
. Вы можете прочитать значение символов преобразования в log4j javadoc дляPatternLayout
.включены комментарии должны помочь в понимании того, что он делает. Дальнейшие Примечания:
- он регистрируется как в консоли, так и в файле; в этом случае файл называется
owls_conditions.log
: изменить его в соответствии с вашими потребностями;- файлы вращаются, когда они достигают 10000KB, и один резервный файл сохраняется
вот файл log4j. properties, который я использовал с большим успехом.
logDir=/var/log/myapp log4j.rootLogger=INFO, stdout #log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n log4j.appender.stdout.DatePattern='.'yyyy-MM-dd log4j.appender.stdout.File=${logDir}/myapp.log log4j.appender.stdout.append=true
DailyRollingFileAppender будет создавать новые файлы каждый день с именами файлов, которые выглядят следующим образом:
myapp.log.2017-01-27 myapp.log.2017-01-28 myapp.log.2017-01-29 myapp.log <-- today's log
каждая запись в лог-файл будет иметь следующий формат:
01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1 01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar()
установите расположение вышеуказанного файла с помощью
-Dlog4j.configuration
, как указано в данное сообщение:java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
в коде Java, не забудьте установить имя каждого программного обеспечения компонент при создании экземпляра объекта logger. Мне также нравится входить в файл журнала и стандартный вывод, поэтому я написал эту небольшую функцию.
private static final Logger LOGGER = Logger.getLogger("Component1"); public static void log(org.apache.log4j.Logger logger, String message) { logger.info(message); System.out.printf("%s\n", message); } public static String stackTraceToString(Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); return sw.toString(); }
а потом назовем это так:
LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));