2.1 Pembalak pertama - log4j

Seperti yang anda sedia maklum, sejarah log bermula dengan System.err.println()output rekod ke konsol. Ia masih digunakan secara aktif untuk penyahpepijatan, contohnya, Intellij IDEA menggunakannya untuk memaparkan mesej ralat ke konsol. Tetapi pilihan ini tidak mempunyai sebarang tetapan, jadi mari kita teruskan.

Pembalak pertama dan paling popular dipanggil Log4j. Ia adalah penyelesaian yang baik dan sangat disesuaikan. Disebabkan oleh pelbagai keadaan, keputusan ini tidak pernah masuk ke dalam JDK, yang sangat mengecewakan seluruh masyarakat.

Pembalak ini bukan sahaja boleh log, ia dicipta oleh pengaturcara untuk pengaturcara dan membolehkan mereka menyelesaikan masalah yang sentiasa timbul berkaitan dengan pembalakan.

Seperti yang anda sedia maklum, log ditulis pada akhirnya supaya sesetengah orang membacanya dan cuba memahami apa yang berlaku semasa operasi program - apa dan bila berlaku kesilapan seperti yang dijangkakan.

Terdapat log4jtiga perkara untuk ini:

  • pembalakan subpakej;
  • set penambah (hasil);
  • tetapan muat semula panas.

Pertama, tetapan log4jboleh ditulis sedemikian rupa untuk membolehkan log masuk dalam satu pakej dan melumpuhkannya dalam pakej lain. Sebagai contoh, adalah mungkin untuk mendayakan log masuk com.codegym.server, tetapi melumpuhkannya dalam com.codegym.server.payment. Ini memungkinkan untuk mengalih keluar maklumat yang tidak diperlukan dengan cepat daripada log.

Kedua, log4jia membenarkan menulis hasil pengelogan ke beberapa fail log sekaligus. Dan output kepada setiap satu boleh dikonfigurasikan secara individu. Sebagai contoh, dalam satu fail adalah mungkin untuk menulis hanya maklumat tentang ralat yang serius, dalam yang lain - log dari modul tertentu, dan dalam yang ketiga - log untuk masa tertentu.

Oleh itu, setiap fail log telah ditala kepada jenis masalah yang dijangkakan. Ini sangat memudahkan kehidupan pengaturcara yang tidak gemar melihat fail log gigabait secara manual.

Dan akhirnya, ketiga, log4jia membenarkan menukar tetapan log secara langsung semasa program sedang berjalan, tanpa memulakannya semula. Ini sangat berguna apabila perlu membetulkan kerja log untuk mencari maklumat tambahan tentang ralat tertentu.

Penting! Terdapat dua versi log log4j: 1.2.x dan 2.xx , yang tidak serasi antara satu sama lain .

Anda boleh menyambungkan pembalak ke projek menggunakan kod:

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
  </dependency>

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

2.2 Pembalak rasmi pertama - JUL: java.util.logging

Selepas zoo pembalak muncul dalam komuniti Java, pembangun JDKmemutuskan untuk membuat satu pembalak standard yang semua orang akan gunakan. Ini adalah bagaimana pembalak muncul JUL: pakej java.util.logging.

Walau bagaimanapun, semasa pembangunannya, pencipta pembalak mengambil sebagai asas bukan log4j, tetapi varian pembalak daripada IBM, yang mempengaruhi perkembangannya. Berita baiknya ialah pembalak JULdisertakan JDK, berita buruknya ialah beberapa orang menggunakannya.

JUL

Bukan sahaja pembangun JULmembuat "standard universal lain" , mereka juga membuat tahap pembalakan mereka sendiri untuknya, yang berbeza daripada yang diterima oleh pembalak popular pada masa itu.

Dan itu adalah masalah besar. Lagipun, produk Javasering dikumpulkan dari sejumlah besar perpustakaan, dan setiap perpustakaan tersebut mempunyai pembalak sendiri. Oleh itu, adalah perlu untuk mengkonfigurasi semua pembalak yang ada dalam aplikasi.

Walaupun pembalak itu sendiri cukup bagus. Mencipta pembalak adalah lebih kurang sama. Untuk melakukan ini, anda perlu mengimport:


java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());

Nama kelas diluluskan khas untuk mengetahui dari mana pembalakan itu datang.

Hanya dengan keluaran, pemaju menyelesaikan masalah penting, selepas itu ia JULsangat mudah digunakan. Sebelum itu, ia adalah sejenis pembalak kelas kedua.

Pembalak ini juga menyokong ekspresi lambda dan penilaian malas. Bermula dengan Java 8, anda boleh lulus Supplier<String>. Ini membantu untuk membaca dan mencipta rentetan hanya pada masa ia benar-benar diperlukan, dan bukan setiap masa, seperti sebelum ini.

Kaedah dengan hujah Supplier<String> msgSupplierkelihatan seperti ini:

public void info(Supplier msgSupplier) {
   log(Level.INFO, msgSupplier);
}

2.3 Pembalut pembalak pertama - JCL: jakarta commons logging

Untuk masa yang lama tiada standard tunggal di kalangan pembalak, ia JULsepatutnya menjadi satu, tetapi ia lebih teruk log4j, jadi satu piawaian tidak pernah muncul. Tetapi seluruh zoo pembalak muncul, masing-masing mahu menjadi sama.

JCL

Walau bagaimanapun, pembangun Java biasa tidak menyukai bahawa hampir setiap perpustakaan mempunyai logger sendiri dan perlu dikonfigurasikan entah bagaimana dengan cara yang istimewa. Oleh itu, komuniti memutuskan untuk membuat pembungkus khas ke atas pembalak lain - begini caranyaJCL: jakarta commons logging

Dan sekali lagi, projek yang dicipta untuk menjadi pemimpin, tidak menjadi satu. Anda tidak boleh mencipta pemenang, anda hanya boleh menjadi pemenang. Fungsinya JCLsangat lemah dan tiada siapa yang mahu menggunakannya. Pembalak, yang direka untuk menggantikan semua pembalak, menemui nasib yang sama kerana ia JULtidak digunakan.

Walaupun ia telah ditambah kepada banyak perpustakaan yang dikeluarkan oleh komuniti Apache, zoo pembalak hanya berkembang.

2.4 Pembalak terakhir pertama - Log balik

Tetapi bukan itu sahaja. Pemaju log4jmemutuskan bahawa dia adalah yang paling bijak (lagipun, kebanyakan orang menggunakan pembalaknya) dan memutuskan untuk menulis pembalak baharu yang dipertingkatkan yang akan menggabungkan kelebihan log4jpembalak lain.

Pembalak baru dipanggil Logback. Pembalak inilah yang sepatutnya menjadi pembalak tunggal masa depan yang akan digunakan oleh semua orang. Ia berdasarkan idea yang sama seperti dalam log4j.

Anda boleh menyambungkan pembalak ini ke projek menggunakan kod:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

Perbezaannya adalah dalam Logback:

  • prestasi yang bertambah baik;
  • menambah sokongan asli slf4j;
  • pilihan penapisan yang diperluaskan.

Satu lagi kelebihan pembalak ini ialah ia mempunyai tetapan lalai yang sangat baik. Dan anda perlu mengkonfigurasi logger hanya jika anda mahu menukar sesuatu di dalamnya. Selain itu, fail tetapan lebih baik disesuaikan dengan perisian korporat - semua konfigurasinya ditetapkan sebagai xml/.

Secara lalai, Logbackia tidak memerlukan sebarang tetapan dan merekodkan semua log dari peringkat DEBUGdan ke atas. Jika anda memerlukan tingkah laku yang berbeza, ia boleh dikonfigurasikan melalui xmlkonfigurasi:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

2.5 Pembalak sejagat terkini - SLF4J: Fasad Pembalakan Mudah untuk Java

Berapa lama masa untuk mencari min emas...

Pada tahun 2006, salah seorang pencipta log4jmeninggalkan projek itu dan memutuskan untuk mencuba lagi untuk mencipta pembalak sejagat. Tetapi kali ini ia bukan pembalak baharu, tetapi piawaian sejagat baharu (pembungkus) yang membenarkan pembalak berbeza berinteraksi bersama.

Pembalak ini dipanggil slf4j — Simple Logging Facade for Java, ia adalah pembalut di sekeliling log4j, JUL, common-loggins and logback. Pembalak ini menyelesaikan masalah sebenar - menguruskan zoo pembalak, jadi semua orang segera mula menggunakannya.

Kami dengan berani menyelesaikan masalah yang kami buat untuk diri kami sendiri. Seperti yang anda lihat, kemajuan telah mencapai tahap yang kami telah mencipta pembungkus di atas pembungkus ...

Balutan itu sendiri terdiri daripada dua bahagian:

  • API, yang digunakan dalam aplikasi;
  • Pelaksanaan yang ditambah sebagai kebergantungan berasingan untuk setiap pembalak.

Anda boleh menyambungkan pembalak ke projek menggunakan kod:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
</dependency>

Ia cukup untuk menyambung pelaksanaan yang betul dan itu sahaja: keseluruhan projek akan berfungsi dengannya.

2.6 Pengoptimuman dalam slf4j

Slf4jmenyokong semua ciri baharu seperti pemformatan rentetan untuk pengelogan . Sebelum ni ada masalah macam ni. Katakan anda ingin mencetak mesej ke log:

log.debug("User " + user + " connected from " + request.getRemoteAddr());

Terdapat masalah dengan kod ini. Katakan aplikasi anda berfungsi productiondan tidak menulis apa-apa pada log DEBUG-messages, bagaimanapun, kaedah itu log.debug()masih akan dipanggil dan apabila ia dipanggil, kaedah berikut juga akan dipanggil:

  • user.toString();
  • request.getRemoteAddr();

Memanggil kaedah ini melambatkan aplikasi. Panggilan mereka diperlukan hanya semasa penyahpepijatan, tetapi mereka dipanggil juga.

Dari sudut logik, masalah ini terpaksa diselesaikan dalam perpustakaan pembalakan itu sendiri. Dan dalam versi pertama log4j penyelesaiannya muncul:

if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}

Daripada satu baris untuk log, kini perlu menulis tiga. Yang secara mendadak memburukkan kebolehbacaan kod, dan menurunkan populariti log4j.

Pembalak itu slf4jdapat memperbaiki sedikit keadaan dengan menawarkan pembalakan pintar. Ia kelihatan seperti ini:

log.debug("User {} connected from {}", user, request.getRemoteAddr());

di mana {}menandakan sisipan hujah yang diluluskan dalam kaedah. Iaitu, yang pertama {}sepadan dengan pengguna, yang kedua {}kepada request.getRemoteAddr().

Parameter ini akan digabungkan menjadi satu mesej hanya jika tahap pengelogan membenarkan pengelogan. Tidak sempurna, tetapi lebih baik daripada semua pilihan lain.

Selepas itu, SLF4Jia mula berkembang pesat dalam populariti, pada masa ini ini adalah penyelesaian terbaik.

Oleh itu, kami akan mempertimbangkan pengelogan menggunakan contoh berkas slf4j-log4j12.