Log4j: Как настроить простейшее ведение журнала файлов? - PullRequest
62 голосов
/ 15 июня 2011

Моя история:

Я хочу создать такую ​​простую вещь, как простейший из возможных log4j logger, который записывает строки в файл. Я нашел несколько примеров с некоторыми функциональными возможностями, но не базовый, общий, который действительно работает, и не один с объяснением, как работает каждая строка.

Вопрос:

Может ли кто-нибудь предоставить один?

Требования:

  • Я уже знаю, куда поместить файл, и у меня настроен log4j, и он работает для ведения журнала консоли.
  • Теперь я хочу войти в файл, а также найти файл в файловой системе после запуска программы.
  • Строки, которые необходимо добавить в существующий файл log4j.properties, являются желаемыми выходными данными.

Ответы [ 4 ]

77 голосов
/ 15 июня 2011

У меня есть для вас один общий файл 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>

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

РЕДАКТИРОВАТЬ

В одном из старых проектов я обнаружил простой файл 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

31 голосов
/ 15 июня 2011
<?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 у вас есть две основные конструкции appender и logger.

Appenders определяет, как и где что-то добавляется.Будет ли он записан в файл, на консоль, в базу данных и т. Д.?В этом случае вы указываете, что операторы журнала, направленные на fileAppender, будут помещены в файл sample.log с использованием шаблона, указанного в тегах layout .Вы также можете легко создать приложение для консоли или базы данных.Где приложение консоли будет указывать такие вещи, как макет на экране, а приложение базы данных будет иметь сведения о соединении и имена таблиц.

Регистраторы отвечают на события регистрации, когда они всплывают.Если событие заинтересует определенный регистратор, он вызовет подключенные к нему дополнения.В приведенном ниже примере у вас есть только один регистратор - корневой регистратор, который по умолчанию отвечает на все события журналирования.В дополнение к корневому регистратору вы можете указать более конкретные регистраторы, которые отвечают на события из определенных пакетов.У этих регистраторов могут быть свои собственные добавочные файлы, указанные с помощью тегов appender-ref, или они будут наследоваться от корневого регистратора.Использование более специфичных регистраторов позволяет вам точно настроить уровень ведения журнала для определенных пакетов или направить определенные пакеты другим приложениям.

Итак, этот файл говорит:

  1. Создать файлAppenderкоторый записывает в файл sample.log
  2. Присоедините этот appender к корневому логгеру.
  3. Корневой регистратор будет реагировать на любые события, по крайней мере, такие же подробные, как уровень отладки
  4. Приложение настроено на запись только тех событий, которые, по крайней мере, столь же детализированы, как 'info'

Выход из системы заключается в том, что если в вашем коде есть logger.debug("blah blah"), то оно будет игнорироваться.logger.info("Blah blah"); будет выводиться в sample.log.

Фрагмент, приведенный ниже, можно добавить в файл выше с тегами log4j .Этот регистратор унаследует приложение от <root>, но ограничит все события журналирования из пакета org.springframework событиями, зарегистрированными на уровне info или выше.

  <!-- Example Package level Logger -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>   
10 голосов
/ 15 июня 2011

Вот простой, который я часто использую:

# 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: измените его в соответствии с вашими потребностями;
  • файлы поворачиваются, когда они достигают 10000 КБ, и один резервный файл сохраняется
2 голосов
/ 31 января 2017

Вот файл 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 обязательно указывайте имя каждого программного компонента при создании экземпляра объекта регистратора.Мне также нравится регистрировать как файл журнала, так и стандартный вывод, поэтому я написал эту небольшую функцию.

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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...