Подтвердить что ты не робот

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

Моя история:

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

Вопрос:

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

Необходимые условия:

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

Ответ 1

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

Ответ 2

<?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 и loggers.

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

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

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

  • Создайте файлAppender, который регистрируется в файл sample.log
  • Прикрепите это приложение к корню регистратор.
  • Корневой регистратор ответит на любой события как минимум Уровень отладки
  • Приложение настроено только для событий журнала, которые по крайней мере как подробно как "информация"

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

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

  <!-- Example Package level Logger -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>   

Ответ 3

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

# 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 КБ, а один резервный файл сохраняется

Ответ 4

Вот файл 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 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)));