Panduan Menggulung Lampiran Fail

1. Gambaran keseluruhan

Walaupun fail log sering menyampaikan maklumat berguna, secara semula jadi mereka bertambah besar dari masa ke masa, dan jika dibiarkan berkembang tanpa batas, ukurannya boleh menjadi masalah.

Perpustakaan log mengatasi masalah ini menggunakan penggulung file appenders, yang secara automatik "menggulung" atau mengarkibkan fail log semasa dan meneruskan log masuk ke fail baru apabila keadaan tertentu yang telah ditentukan berlaku, sehingga mencegah waktu henti yang tidak diinginkan.

Dalam artikel ini, kita akan meneroka cara mengkonfigurasi rolling app appers di beberapa perpustakaan log yang paling banyak digunakan - Log4j, Log4j2, dan Slf4j.

Kami akan menunjukkan cara menggulung fail log berdasarkan ukuran, tarikh / waktu, dan gabungan ukuran dan tarikh / waktu. Kami juga akan menunjukkan cara mengkonfigurasi setiap perpustakaan untuk memampatkan secara automatik dan kemudian menghapus fail log lama, menyelamatkan kami daripada menulis kod pembersihan yang membosankan.

2. Contoh Permohonan Kami

Mari kita mulakan dengan aplikasi contoh yang mencatat beberapa mesej. Kod ini berdasarkan Log4j tetapi dapat diubahsuai dengan mudah untuk berfungsi 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 mesej dalam satu gelung, dengan kelewatan yang singkat antara lelaran. Dengan 2,000 gelung untuk dijalankan dan jeda 100 ms di setiap gelung, aplikasi akan memerlukan sedikit lebih dari tiga minit untuk diselesaikan.

Kami akan menggunakan sampel ini untuk menunjukkan beberapa ciri dari pelbagai jenis lampiran fail bergulir.

3. Rolling File Appenders di Log4j

3.1. Ketergantungan Maven

Pertama sekali, untuk menggunakan Log4j dalam aplikasi anda, tambahkan kebergantungan ini ke fail pom.xml projek anda :

 log4j log4j 1.2.17  

Untuk menggunakan tambahan tambahan yang disediakan oleh apache-log-extras yang akan kami gunakan dalam contoh seterusnya, tambahkan kebergantungan berikut, pastikan untuk menggunakan versi yang sama dengan yang kami nyatakan untuk Log4j untuk memastikan keserasian penuh:

 log4j apache-log4j-extras 1.2.17  

Anda boleh mendapatkan keluaran terbaru Log4j dan Apache Log4j Extras di Maven Central.

3.2. Bergolek Berdasarkan Saiz Fail

Di Log4j, seperti di perpustakaan pembalakan lain, penggulungan fail diberikan kepada pelamar. Mari kita lihat konfigurasi untuk pelekat fail bergulir di Log4j yang digulung berdasarkan ukuran fail:

Di sini, kami mengkonfigurasi Log4j untuk menggulung fail log apabila ukurannya mencapai 5KB, menggunakan parameter MaxFileSize . Kami juga mengarahkan Log4j untuk menyimpan maksimum dua fail log yang digulung menggunakan parameter MaxBackupIndex .

Semasa menjalankan aplikasi sampel kami, kami memperoleh fail 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 berlaku? Log4j mula menulis ke fail app.log . Apabila saiz fail melebihi had 5KB, Log4j memindahkan app.log ke app.log.1 , membuat app.log kosong, baru , dan terus menulis mesej log baru ke app.log .

Kemudian setelah app.log baru melebihi had 5KB, proses penggulungan ini diulang. Kali ini, app.log.1 dipindahkan ke app.log.2, memberi ruang untuk app.log baru dan kosong yang lain .

Proses penggulungan diulang beberapa kali semasa dijalankan, tetapi kerana kami mengkonfigurasikan appender kami untuk menyimpan paling banyak dua fail yang digulung, tidak ada fail yang disebut app.log.3 .

Oleh itu, kami telah menyelesaikan salah satu masalah yang asal kerana sekarang kami dapat menetapkan had ukuran fail log yang dihasilkan.

Sebaliknya, ketika kami memeriksa baris pertama app.log.2 , ia mengandungi mesej yang berkaitan dengan lelaran ke-700, yang bermaksud semua mesej log sebelumnya telah hilang:

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

Mari kita lihat sama ada kita dapat membuat persediaan yang lebih sesuai dengan persekitaran produksi, di mana kehilangan mesej log tidak boleh dianggap sebagai pendekatan terbaik.

Untuk melakukan itu, kita akan menggunakan pelengkap Log4j yang lebih kuat, fleksibel dan boleh dikonfigurasi yang dihantar dalam pakej khusus yang disebut apache-log4j-extras .

Appenders yang terkandung dalam artifak ini menawarkan banyak pilihan untuk menyempurnakan penggulingan log, dan mereka memperkenalkan konsep yang berbeza mengenai kebijakan pemicu dan penggulingan . The dasar mencetuskan menerangkan apabila roll yang perlu berlaku, manakala dasar rolling menerangkan bagaimana rolling perlu dijalankan. Kedua konsep ini adalah kunci untuk melancarkan fail log dan digunakan lebih kurang secara eksplisit oleh perpustakaan lain juga, seperti yang akan kita lihat tidak lama lagi.

3.3. Bergolek Dengan Pemampatan Automatik

Mari kembali ke contoh Log4j dan tingkatkan penyediaan kami dengan menambahkan pemampatan automatik fail yang digulung untuk menjimatkan ruang:

Dengan elemen dasar pencetus , kami menyatakan bahawa gulungan harus berlaku apabila log melebihi ukuran 5,120 bait.

Dalam dasar bergolek tag , yang ActiveFileName parameter menyatakan jalan fail log utama yang mengandungi mesej yang kemas dan yang FileNamePattern dinyatakan oleh parameter template menerangkan yang sepatutnya menjadi jalan fail dilancarkan. Mari kita perhatikan bahawa ini memang corak kerana placeholder % i khas akan diganti dengan indeks fail yang digulung.

Mari kita perhatikan juga bahawa FileNamePattern diakhiri dengan pelanjutan ".gz" . Setiap kali kami menggunakan peluasan yang dikaitkan dengan format termampat yang disokong, kami akan memampatkan fail lama yang lama tanpa usaha tambahan dari pihak kami.

Sekarang semasa kita menjalankan aplikasi, kita memperoleh satu set fail log yang berbeza:

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 fail log untuk selang waktu tertentu meningkat melebihi had ukuran yang dikonfigurasikan, fail log lain dengan nilai yang sama untuk pemegang tempat yang berkaitan dengan masa tetapi dengan indeks tambahan 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. Kesimpulannya

Seperti yang kita lihat, memanfaatkan perpustakaan log untuk menggulung fail menyelamatkan anda dari beban menguruskan fail log secara manual, yang membolehkan anda memberi tumpuan kepada pengembangan logik perniagaan anda. Appenders fail bergulir adalah alat berharga yang harus ada di kotak alat setiap pemaju.

Seperti biasa, anda akan menemui sumber-sumber di GitHub, di mana contoh aplikasi yang disajikan dalam artikel ini dikonfigurasikan untuk log menggunakan beberapa susunan penggulungan yang berbeza untuk membolehkan anda mencari konfigurasi pangkalan yang baik agar dapat disesuaikan dengan keperluan anda.