Дуже простий файл конфігурації log4j2 XML за допомогою додатка консолі та файлу


223

Я хотів би дуже простий файл конфігурації XML з консоллю та додатком до файлу за допомогою log4j2.

(Веб-сайт Apache убиває мене багато інформації.)


72
Ха-ха - так рада, що ви сказали це "(Веб-сайт Apache вбиває мене з великою кількістю інформації.)"
Тоннор

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();для ініціалізації вашого реєстратора
  • Я встановив directFlush = "false", оскільки це краще для життя SSD . Якщо вам потрібен журнал одразу у вашому файлі журналу, видаліть параметр або встановіть його на істинне

1
Для повноти використання DirectFlush = "false" особливо рекомендується при використанні Async Loggers або AsyncAppender.
Ремко Попма

1
Передумови: instantFlush = "false" дозволяє компонентам асинхронізації Log4J2 об'єднати кілька записів журналу в один запис. Як бонус, ваші останні події журналу завжди записуються на диск і ніколи не залишаються висячими в буфері пам'яті. (Щось мене дратує про log4j-1.2.)
Ремко Попма

1
Я не міг отримати приклади на сайті Log4j 2.0 для роботи, але це було. Дякую.
djangofan

12
Будь ласка, додайте той факт, що тим, хто користується затемненням, може знадобитися чистота. Заради людства.
Reut Sharabani

1
@ThorstenNiehues Я не можу редагувати свій попередній коментар, але затемнення копіює конфігурацію під час створення, і чомусь воно не завжди копіює log4j.xml, навіть якщо він змінився. Принаймні, саме це вирішило це для мене.
Reut Sharabani

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>

TimeBaseTriggeringPolicy

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

модуляція (булева) - вказує, чи слід відрегулювати інтервал, щоб викликати наступне перекидання на межі інтервалу. Наприклад, якщо елемент - години, поточна година - 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тут політика? Який максимальний розмір файлу? І як це записати у файл? (чи завжди файл містить останні 10mb журналів?)
Тіна J
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.