Очень простой XML-файл конфигурации log4j2 с использованием приложения Console и File


223

Мне нужен очень простой XML-файл конфигурации с консолью и файловым аппендером, использующим log4j2.

(Сайт Apache убивает меня большим количеством информации.)


72
Ха-ха, я так рада, что ты сказал это «(сайт Apache убивает меня большим количеством информации.)»
17

19
Это ваше предложение (сайт Apache убивает меня большим количеством информации.) Является основной причиной, почему я просматриваю ваш вопрос!
Ju Oliveira

Ответы:


281
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Ноты:

  • Поместите следующее содержимое в файл конфигурации.
  • Назовите файл конфигурации log4j2.xml
  • Поместите log4j2.xml в папку, которая находится в пути к классам (т.е. ваша исходная папка "src")
  • Используйте Logger logger = LogManager.getLogger();для инициализации вашего регистратора
  • Я установил немедленныйFlush = "false", так как это лучше для жизни SSD . Если вам нужен журнал прямо в вашем лог-файле, удалите параметр или установите его в true

1
Для полноты, рекомендуется использовать немедленное добавление = «ложь» при использовании Async Loggers или AsyncAppender.
Ремко Попма

1
Справочная информация: instantFlush = "false" позволяет асинхронным компонентам Log4J2 объединять несколько событий журнала за одну запись на диск. В качестве бонуса, ваши последние события журнала всегда записываются на диск и никогда не остаются в буфере памяти. (Что-то, что я нашел раздражающим в log4j-1.2.)
Ремко Попма

1
Я не мог заставить примеры на сайте Log4j 2.0 работать, но этот сделал. Спасибо.
Джангофан

12
Пожалуйста, добавьте тот факт, что для тех, кто использует затмение, может потребоваться чистка. Ради человечества.
Реут Шарабани

1
@ThorstenNiehues Я не могу редактировать свой предыдущий комментарий, но eclipse копирует конфигурацию при сборке, и по какой-то причине он не всегда копирует log4j.xml, даже если он изменился. По крайней мере, это то, что решило это для меня.
Реут Шарабани

19

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

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

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

modulate (логическое значение) - указывает, следует ли корректировать интервал, чтобы следующий переход произошел на границе интервала. Например, если для элемента заданы часы, текущий час - 3 часа утра, а интервал - 4, тогда первый ролловер произойдет в 4 часа утра, а затем следующие произойдут в 8 часов утра, в полдень, в 4 часа дня и т. Д.

Источник: https://logging.apache.org/log4j/2.x/manual/appenders.html

Вывод:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

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

cucumber_yyyy-MM-dd.log

В проекте Maven, вы бы поставить log4j2.xmlв систему src/main/resources или src/test/resources .


12

log4j2 имеет очень гибкую систему конфигурации (что, IMHO, больше отвлекает, чем помогает), вы даже можете использовать JSON. См. Https://logging.apache.org/log4j/2.x/manual/configuration.html для справки.

Лично я только недавно начал использовать log4j2, но я склоняюсь к конфигурации «строгого XML» (то есть с использованием атрибутов вместо имен элементов), которая может быть проверена схемой.

Вот мой простой пример, использующий автоконфигурацию и строгий режим, используя «Свойство» для установки имени файла:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

Гибкая конфигурация удобна, когда вы пытаетесь отделить конфигурацию от сборки и поместить конфигурацию в хранилище в другом месте. К сожалению, сложности делают это немного раздражающим, но я подумал, что я бы выбрал преимущество гибких вариантов конфигурации.
adprocas

Какая Fileздесь политика? Каков максимальный размер файла? И как это записать в файл? (файл всегда содержит последние 10 МБ журналов?)
Тина Дж
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.