Konsol ve Dosya ekleyicisi kullanarak çok basit log4j2 XML yapılandırma dosyası


223

Log4j2 kullanarak bir konsol ve dosya ekleyicisi ile çok basit bir XML yapılandırma dosyası istiyorum.

(Apache Web sitesi beni çok fazla Bilgi ile öldürüyor.)


72
Haha - bunu söylediğine çok sevindim "(Apache Web Sitesi beni çok fazla Bilgi ile öldürüyor.)"
thonnor

19
Bu cümlenin (Apache Web sitesi beni çok fazla Bilgi ile öldürüyor.) Sorunuzu görüntülememin ana nedeni bu!
Ju Oliveira

Yanıtlar:


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>

Notlar:

  • Aşağıdaki içeriği yapılandırma dosyanıza yerleştirin.
  • Log4j2.xml yapılandırma dosyasını adlandırın
  • Log4j2.xml dosyasını sınıf yolundaki bir klasöre yerleştirin (yani kaynak klasörünüz "src")
  • Logger logger = LogManager.getLogger();Kaydedicinizi başlatmak için kullanın
  • Bu SSD ömrü için daha iyi olduğu için instantFlush = "false" ayarladım . Günlük dosyasında günlüğe hemen ihtiyacınız varsa parametreyi kaldırın veya true değerine ayarlayın

1
Tamlık için, özellikle Async Loggers veya AsyncAppender kullanılırken instantFlush = "false" kullanılması önerilir.
Remko Popma

1
Arka plan: instantFlush = "false", Log4J2'nin zaman uyumsuz bileşenlerinin tek bir disk yazımında birden çok günlük olayını toplu olarak birleştirmesine izin verir. Bonus olarak, en son günlük olaylarınız her zaman diske yazılır ve bir bellek arabelleğinde asılı bırakılmaz. (Log4j-1.2 hakkında can sıkıcı bulduğum bir şey.)
Remko Popma

1
Çalışmak için Log4j 2.0 sitesinde örnekler alamadım ama bu yaptı. Teşekkür ederim.
djangofan

12
Lütfen tutulma kullanan kişiler için temizliğin gerekli olabileceği gerçeğini ekleyin. İnsanlık uğruna.
Reut Sharabani

1
@ThorstenNiehues Önceki yorumumu düzenleyemiyorum, ancak eclipse yapılandırmayı oluştururken kopyalar ve bir nedenle değişse bile log4j.xml dosyasını her zaman kopyalamaz. En azından benim için bunu çözdü.
Sharabani

19

İşte benim basite log4j2.xmlbaskılar konsola olduğunu ve günlük haddeleme dosyasına yazıyor:

// 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

aralığı (tamsayı) - Tarih düzenindeki en spesifik zaman birimine göre bir rollover'ın ne sıklıkta gerçekleşmesi gerektiği. Örneğin, en belirgin öğe olarak saat içeren bir tarih düzeniyle ve her 4 saatte bir 4 rollover artışla gerçekleşir. Varsayılan değer 1'dir.

modulate (boolean) - Aralığın, bir sonraki rollover'ın aralık sınırında gerçekleşmesine neden olacak şekilde ayarlanıp ayarlanmayacağını belirtir. Örneğin, öğe saatse, geçerli saat 3 am ve aralık 4'tür, ilk rollover 4'te gerçekleşir ve daha sonra 8:00, öğlen, 16:00 vb.

Kaynak: https://logging.apache.org/log4j/2.x/manual/appenders.html

Çıktı:

[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

Önceki gün otomatik olarak şu şekilde yeniden adlandırılarak günlük olarak yeni bir günlük dosyası oluşturulur:

cucumber_yyyy-MM-dd.log

Bir Maven projede, koyardı log4j2.xmlin src/main/resources ya src/test/resources .


12

log4j2 çok esnek bir yapılandırma sistemine sahiptir (IMHO bir yardımdan daha dikkat dağıtıcıdır), JSON'u bile kullanabilirsiniz. Referans için https://logging.apache.org/log4j/2.x/manual/configuration.html adresine bakın .

Şahsen, kısa bir süre önce log4j2 kullanmaya başladım, ancak şema doğrulaması yapılabilen "katı XML" yapılandırmasına (yani, öğe adları yerine öznitelikleri kullanarak) yöneliyorum.

Dosya adını ayarlamak için "Özellik" kullanarak, otomatik yapılandırma ve katı modu kullanarak basit örneğim:

<?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>

Esnek yapılandırma, yapılandırmayı derlemeden ayırmayı ve başka bir yerde bir depoya koymayı denediğinizde kullanışlı olur. Ne yazık ki, karmaşıklıklar onu biraz can sıkıcı hale getiriyor, ancak sadece yapılandırma için esnek seçeneklere fayda sağlayacağımı düşündüm.
adprocas

FileBuradaki politika nedir ? Maksimum dosya boyutu nedir? Ve dosyaya nasıl yazıyor? (dosya her zaman günlüklerin son 10 mb'sini içerir mi?)
Tina J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.