Log4j: как настроить простейшее ведение журнала файлов?


моя история:

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

вопрос:

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

требования:

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

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 теги или иным образом наследуют приложения от корневого регистратора. Использование более конкретных регистраторов позволяет точно настроить уровень ведения журнала для конкретных пакетов или направить определенные пакеты другим добавителям.

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

  1. создать fileAppender, который входит в систему образец файла.журнал
  2. прикрепите это приложение к корню лесоруб.
  3. регистратор корня ответит к любому события, по крайней мере, столь же подробные, как 'отладка' уровень
  4. приложение настроено только на журнал событий не менее подробно, как "информация"

сеть заключается в том, что если у вас есть 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)));