File konfigurasi XML log4j2 yang sangat sederhana menggunakan Konsol dan File appender

223

Saya ingin file konfigurasi XML yang sangat sederhana dengan konsol dan file appender menggunakan log4j2.

(Situs web Apache membunuhku dengan banyak informasi.)

Thorsten Niehues
sumber
72
Haha - sangat senang Anda mengatakan ini "(Situs Apache membunuh saya dengan banyak Informasi.)"
thonnor
19
Kalimat Anda itu (Situs web Apache membunuh saya dengan banyak informasi.) Adalah alasan utama mengapa saya melihat pertanyaan Anda!
Ju Oliveira

Jawaban:

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>

Catatan:

  • Masukkan konten berikut dalam file konfigurasi Anda.
  • Beri nama file konfigurasi log4j2.xml
  • Letakkan log4j2.xml di folder yang ada di jalur kelas (yaitu folder sumber Anda "src")
  • Gunakan Logger logger = LogManager.getLogger();untuk menginisialisasi logger Anda
  • Saya memang mengatur directFlush = "false" karena ini lebih baik untuk masa pakai SSD . Jika Anda membutuhkan log segera di file-log Anda hapus parameter atau setel ke true
Thorsten Niehues
sumber
1
Untuk kelengkapan, penggunaan directFlush = "false" sangat disarankan saat menggunakan Async Loggers atau AsyncAppender.
Remko Popma
1
Latar belakang: directFlush = "false" memungkinkan komponen-komponen async Log4J2 untuk menggabungkan beberapa peristiwa log dalam satu disk. Sebagai bonus, acara log terbaru Anda selalu ditulis ke disk dan tidak pernah tertinggal dalam buffer memori. (Sesuatu yang saya
anggap
1
Saya tidak bisa mendapatkan contoh di situs Log4j 2.0 untuk bekerja tetapi yang ini berhasil. Terima kasih.
djangofan
12
Harap tambahkan fakta bahwa pembersihan mungkin diperlukan bagi mereka yang menggunakan gerhana. Demi umat manusia.
Reut Sharabani
1
@ThorstenNiehues Saya tidak bisa mengedit komentar saya sebelumnya, tetapi gerhana menyalin konfigurasi ketika Anda membangun, dan untuk beberapa alasan itu tidak selalu menyalin log4j.xml bahkan jika itu berubah. Setidaknya itulah yang menyelesaikannya untuk saya.
Reut Sharabani
19

Berikut ini adalah daftar sederhana saya log4j2.xmlyang dicetak untuk menghibur dan menulis ke file bergulir harian:

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

interval (integer) - Seberapa sering rollover terjadi berdasarkan unit waktu paling spesifik dalam pola tanggal. Misalnya, dengan pola tanggal dengan jam sebagai item yang paling spesifik dan dan kenaikan 4 rollover akan terjadi setiap 4 jam. Nilai standarnya adalah 1.

modate (boolean) - Menunjukkan apakah interval harus disesuaikan untuk menyebabkan rollover berikutnya terjadi pada batas interval. Misalnya, jika itemnya adalah jam, jam saat ini adalah jam 3 pagi dan intervalnya adalah 4 maka rollover pertama akan terjadi pada jam 4 pagi dan kemudian jam berikutnya akan terjadi pada jam 8 pagi, siang, jam 4 sore, dll.

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

Keluaran:

[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

File log baru akan dibuat setiap hari dengan hari sebelumnya secara otomatis diganti namanya menjadi:

cucumber_yyyy-MM-dd.log

Dalam proyek Maven, Anda akan menempatkan log4j2.xmldi src/main/resources atau src/test/resources .

perak
sumber
12

log4j2 memiliki sistem konfigurasi yang sangat fleksibel (yang IMHO lebih merupakan gangguan daripada bantuan), Anda bahkan dapat menggunakan JSON. Lihat https://logging.apache.org/log4j/2.x/manual/configuration.html untuk referensi.

Secara pribadi, saya baru saja mulai menggunakan log4j2, tapi saya cenderung ke arah konfigurasi "XML ketat" (yaitu, menggunakan atribut alih-alih nama elemen), yang dapat divalidasi skema.

Berikut ini adalah contoh sederhana saya menggunakan konfigurasi otomatis dan mode ketat, menggunakan "Properti" untuk mengatur nama file:

<?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>
Christof Kälin
sumber
Konfigurasi fleksibel berguna ketika Anda mencoba memisahkan konfigurasi dari build dan meletakkan konfigurasi ke dalam repositori di tempat lain. Sayangnya, kerumitannya membuatnya sedikit mengganggu, tetapi saya pikir saya akan membuang manfaat untuk opsi fleksibel untuk konfigurasi.
adprocas
Apa Filekebijakannya di sini? Berapa ukuran file maks? Dan bagaimana cara menulis ke file? (apakah file selalu berisi 10mb log terakhir?)
Tina J