Panduan untuk Rolling File Appenders

1. Ikhtisar

Meskipun file log sering kali menyampaikan informasi yang berguna, mereka secara alami tumbuh lebih besar dari waktu ke waktu, dan jika dibiarkan tumbuh tanpa batas, ukurannya bisa menjadi masalah.

Pustaka pencatatan mengatasi masalah ini menggunakan penambah berkas bergulir, yang secara otomatis “menggulung” atau mengarsipkan berkas log saat ini dan melanjutkan pencatatan dalam berkas baru ketika kondisi yang telah ditentukan sebelumnya terjadi, sehingga mencegah waktu henti yang tidak diinginkan.

Pada artikel ini, kita akan mempelajari cara mengonfigurasi rolling file appenders di beberapa perpustakaan logging yang paling banyak digunakan - Log4j, Log4j2, dan Slf4j.

Kami akan menunjukkan cara menggulung file log berdasarkan ukuran, tanggal / waktu, dan kombinasi ukuran dan tanggal / waktu. Kami juga akan mendemonstrasikan cara mengonfigurasi setiap pustaka untuk secara otomatis mengompresi dan kemudian menghapus file log lama, sehingga kami tidak perlu menulis kode tata graha yang membosankan.

2. Aplikasi Sampel Kami

Mari kita mulai dengan aplikasi contoh yang mencatat beberapa pesan. Kode ini didasarkan pada Log4j tetapi dapat dengan mudah dimodifikasi untuk bekerja dengan Log4j2 atau Slf4j:

import org.apache.log4j.Logger; public class Log4jRollingExample { private static Logger logger = Logger.getLogger(Log4jRollingExample.class); public static void main(String[] args) throws InterruptedException { for(int i = 0; i < 2000; i++) { logger.info("This is the " + i + " time I say 'Hello World'."); Thread.sleep(100); } } }

Aplikasi ini cukup naif - ia menulis beberapa pesan dalam satu lingkaran, dengan jeda singkat di antara iterasi. Dengan 2.000 pengulangan untuk dijalankan dan jeda 100 md di setiap pengulangan, aplikasi akan membutuhkan waktu lebih dari tiga menit untuk menyelesaikannya.

Kami akan menggunakan contoh ini untuk mendemonstrasikan beberapa fitur dari berbagai jenis appenders file bergulir.

3. Rolling File Appenders di Log4j

3.1. Dependensi Maven

Pertama-tama, untuk menggunakan Log4j di aplikasi Anda, tambahkan dependensi ini ke file pom.xml proyek Anda :

 log4j log4j 1.2.17  

Untuk menggunakan appender tambahan yang disediakan oleh apache-log-extras yang akan kita gunakan dalam contoh berikutnya, tambahkan dependensi berikut, pastikan untuk menggunakan versi yang sama yang kita nyatakan untuk Log4j untuk memastikan kompatibilitas penuh:

 log4j apache-log4j-extras 1.2.17  

Anda dapat menemukan rilis terbaru Log4j dan Apache Log4j Extras di Maven Central.

3.2. Bergulir Berdasarkan Ukuran File

Di Log4j, seperti di pustaka logging lainnya, file rolling didelegasikan ke appender. Mari kita lihat konfigurasi untuk file appender bergulir di Log4j yang berputar berdasarkan ukuran file:

Di sini, kami mengonfigurasi Log4j untuk menggulung file log ketika ukurannya mencapai 5KB, menggunakan parameter MaxFileSize . Kami juga menginstruksikan Log4j untuk menyimpan maksimal dua file log yang digulung menggunakan parameter MaxBackupIndex .

Ketika kami menjalankan aplikasi sampel kami, kami memperoleh file-file berikut:

27/11/2016 10:28 138 app.log 27/11/2016 10:28 5.281 app.log.1 27/11/2016 10:28 5.281 app.log.2 

Apa yang terjadi? Log4j mulai menulis ke file app.log . Ketika ukuran file melebihi batas 5KB, Log4j memindahkan app.log ke app.log.1 , membuat app.log kosong yang baru , dan terus menulis pesan log baru ke app.log .

Kemudian setelah app.log baru melebihi batas 5KB, proses bergulir ini diulangi. Kali ini, app.log.1 dipindahkan ke app.log.2, memberi ruang untuk app.log baru yang kosong .

Proses bergulir diulangi beberapa kali selama menjalankan, tetapi karena kami mengonfigurasi appender kami untuk menyimpan paling banyak dua file yang digulung, tidak ada file apa pun yang disebut app.log.3 .

Jadi, kami telah memecahkan salah satu masalah asli karena kami sekarang dapat menetapkan batas ukuran file log yang dihasilkan.

Di sisi lain, ketika kami memeriksa baris pertama app.log.2 , itu berisi pesan yang terkait dengan iterasi ke-700, yang berarti semua pesan log sebelumnya telah hilang:

2016-11-27 10:28:34 INFO This is the 700 time I say 'Hello World'. 

Mari kita lihat apakah kita dapat membuat penyiapan yang lebih cocok untuk lingkungan produksi, di mana kehilangan pesan log tidak dapat dianggap sebagai pendekatan terbaik.

Untuk melakukan itu kita akan menggunakan appenders Log4j lain yang lebih kuat, fleksibel dan dapat dikonfigurasi yang dikirimkan dalam paket khusus yang disebut apache-log4j-extras .

Appenders yang terdapat dalam artefak ini menawarkan banyak opsi untuk menyempurnakan log rolling, dan mereka memperkenalkan konsep berbeda tentang kebijakan pemicuan dan kebijakan rolling . The kebijakan memicu menggambarkan ketika gulungan harus terjadi, sementara kebijakan bergulir menjelaskan bagaimana bergulir yang harus dilakukan. Kedua konsep ini adalah kunci untuk menggulirkan file log dan digunakan secara lebih eksplisit oleh library lain juga, seperti yang akan segera kita lihat.

3.3. Bergulir Dengan Kompresi Otomatis

Mari kembali ke contoh Log4j dan tingkatkan pengaturan kita dengan menambahkan kompresi otomatis dari file yang digulung untuk menghemat ruang:

Dengan elemen kebijakan pemicu , kami menyatakan bahwa gulungan harus terjadi ketika log melebihi ukuran 5.120 byte.

Dalam kebijakan bergulir tag , yang ActiveFileName parameter menyatakan jalur file log utama yang berisi pesan-pesan terbaru dan FileNamePattern menspesifikasikan parameter template menjelaskan yang seharusnya menjadi jalur file digulung. Perhatikan bahwa ini memang sebuah pola karena placeholder khusus % i akan diganti dengan indeks file yang digulung.

Perhatikan juga bahwa FileNamePattern diakhiri dengan ekstensi ".gz" . Setiap kali kami menggunakan ekstensi yang terkait dengan format terkompresi yang didukung, kami akan memiliki file gulungan lama yang dikompresi tanpa upaya ekstra dari pihak kami.

Sekarang ketika kami menjalankan aplikasi, kami mendapatkan sekumpulan file log yang berbeda:

03/12/2016 19:24 88 app.1.log.gz ... 03/12/2016 19:26 88 app.2.log.gz 03/12/2016 19:26 88 app.3.log.gz 03/12/2016 19:27 70 app.current.log 

The file app.current.log is where the last logs occurred. Previous logs have been rolled and compressed when their size reached the set limit.

3.4. Rolling Based on Date and Time

In other scenarios, you may want to configure Log4j to roll the files based on the date and time of the log messages instead of the size of the file. In a web application, for instance, you may want to have all the log messages issued in one day in the same log file.

To do that, you can use the TimeBasedRollingPolicy. With this policy, it is mandatory to specify a template for the path of the log file that contains a time-related placeholder. Each time a log message is issued, the appender verifies what the resulting log path would be, and if it differs from the last used path, then a roll will occur. Here's a quick example that configures such an appender:

3.5. Rolling Based on Size and Time

Combining the SizeBasedTriggeringPolicy and the TimeBasedRollingPolicy, you can obtain an appender that rolls based on date/time, and when the size of the file reaches the set limit, it rolls based on size too:

When we ran our application with this setup, we obtained the following log files:

03/12/2016 19:25 234 app.19-25.1481393432120.log.gz 03/12/2016 19:25 234 app.19-25.1481393438939.log.gz 03/12/2016 19:26 244 app.19-26.1481393441940.log.gz 03/12/2016 19:26 240 app.19-26.1481393449152.log.gz 03/12/2016 19:26 3.528 app.19-26.1481393470902.log

The file app.19-26.1481393470902.log is where current logging takes place. As you can see, all the logs in the interval between 19:25 and 19:26 are stored in multiple compressed log files with names starting with “app.19-25″. The “%i” placeholder is replaced by an ever increasing number.

4. Rolling File Appenders in Log4j2

4.1. Maven Dependencies

To use Log4j2 as our preferred logging library, we need to update our project's POM with the following dependency:

 org.apache.logging.log4j log4j-core 2.7 

As usual, you can find the latest version on Maven Central.

4.2. Rolling Based on File Size

Let's change our example application to use the Log4j2 logging libraries and let's explore now how we can set up file rolling based on the size of the log file in the log4j2.xml configuration file:

  %d{yyyy-MM-dd HH:mm:ss} %p %m%n       

In the Policies tag, we specified all the triggering policies we want to apply. OnStartupTriggeringPolicy triggers a roll every time the application starts, which could be useful for stand-alone applications. We then specified a SizeBasedTriggeringPolicy stating that a roll should occur whenever the log file reaches 5KB.

4.3. Rolling Based on Date and Time

Using the policies offered by Log4j2, let's set up an appender to roll and compress the log file based on time:

  %d{yyyy-MM-dd HH:mm:ss} %p %m%n    

Here the key is the use of TimeBasedTriggeringPolicy that allows us to use time-related placeholders in the template of the rolled file names. Note that since we needed only a single triggering policy, we do not have to use the Policies tag as we did in the previous example.

4.4. Rolling Based on Size and Time

As previously described, a more compelling scenario is to roll and compress log files based on both time and size. Here is an example of how we can set up Log4j2 for this task:

  %d{yyyy-MM-dd HH:mm:ss} %p %m%n             

With this configuration, we stated that a roll should occur based on time and size. The appender is able to understand what time interval we're referring to because of the pattern used for the file name, “app.%d{MM-dd-yyyy-HH-mm}.%i.log.gz”, which implicitly sets a roll to occur every minute and compresses the rolled file.

We also added a DefaultRolloverStrategy to delete old rolled files matching certain criteria. We configure ours to delete files that match the given pattern when they are older than 20 days.

4.5. Maven Dependencies

To use Log4j2 as our preferred logging library, we need to update our project's POM with the following dependency:

 org.apache.logging.log4j log4j-core 2.7 

As usual, you can find the latest version on Maven Central.

5. Rolling File Appenders in Slf4j

5.1. Maven Dependencies

When you want to use Slf4j2 with a Logback backend as logging libraries, add this dependency to your pom.xml:

 ch.qos.logback logback-classic 1.1.7 

As usual, you can find the latest version on Maven Central.

5.2. Rolling Based on File Size

Let's see now how to use Slf4j instead, with its default back-end Logback. Let's explore how we can set up file rolling in the configuration file logback.xml, which is placed in the application's classpath:

 target/slf4j/roll-by-size/app.log  target/slf4j/roll-by-size/app.%i.log.zip 1 3 1MB   5KB   %-4relative [%thread] %-5level %logger{35} - %msg%n   

Again we encounter the concept of rolling policy. The basic mechanism is the same as that used by Log4j and Log4j2. The FixedWindowRollingPolicy allows us to use an index placeholder in the name pattern of the rolled file.

When the size of the log file grows over the configured limit, a new file is allocated, and the old content is stored as the first file of the list, shifting the existing ones one place further.

5.3. Rolling Based on Time

In Slf4j, we can roll a log file based on time using the provided TimeBasedRollingPolicy. This policy allows us to specify the template name of the rolling file using time and date related placeholders:

 target/slf4j/roll-by-time/app.log  target/slf4j/roll-by-time/app.%d{yyyy-MM-dd-HH-mm}.log.zip  20 1MB   %d{yyyy-MM-dd HH:mm:ss} %p %m%n  

5.4. Rolling Based on Size and Time

If you need to roll a file both based on both time and size, you can use the provided SizeAndTimeBasedRollingPolicy. When using this policy, you must specify both a time-related placeholder and an index placeholder.

Setiap kali ukuran file log untuk interval waktu tertentu tumbuh melebihi batas ukuran yang dikonfigurasi, file log lain dengan nilai yang sama untuk placeholder terkait waktu tetapi dengan indeks yang bertambah akan dibuat:

 target/slf4j/roll-by-time-and-size/app.log   target/slf4j/roll-by-time-and-size/app.%d{yyyy-MM-dd-mm}.%i.log.zip  5KB 20 1MB   %d{yyyy-MM-dd HH:mm:ss} %p %m%n  

6. Kesimpulan

Seperti yang kita lihat, memanfaatkan perpustakaan logging untuk menggulung file akan menyelamatkan Anda dari beban pengelolaan file log secara manual, memungkinkan Anda untuk fokus pada pengembangan logika bisnis Anda. Rolling file appenders adalah alat berharga yang harus ada di setiap kotak alat pengembang.

Seperti biasa, Anda akan menemukan sumber di GitHub, di mana contoh aplikasi yang disajikan dalam artikel ini dikonfigurasi untuk log menggunakan beberapa pengaturan bergulir yang berbeda untuk memungkinkan Anda menemukan konfigurasi dasar yang baik untuk selanjutnya disesuaikan dengan kebutuhan Anda.