Berbagi teknologi

Praktik pengumpulan kayu dalam proyek: teknologi, alat, dan praktik terbaik

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


✨✨Terima kasih semuanya atas dukungan Anda. Saya berharap semua teman di depan layar mendapat keberuntungan setiap hari! ✨✨
🎈🎈作者主页: Oh ya🎈🎈

Daftar isi

perkenalan

1. Pilih kerangka logging yang sesuai

2. Konfigurasikan kerangka log

3. Gunakan level log yang sesuai

1. Ikhtisar level log

2. Pilih level log yang sesuai (ambil logbkck sebagai contoh di sini)

3. Menyesuaikan level log secara dinamis

4. Dikombinasikan dengan informasi konteks log

1. Menggunakan SLF4J MDC

2. Menggunakan ThreadContext Log4j 2

3. Memanfaatkan informasi kontekstual

5. Pemantauan waktu nyata dan penyimpanan terpusat

1. Tumpukan ELK (Elasticsearch, Logstash, Kibana)

2. Konfigurasikan Logstash untuk mengumpulkan log

3. Gunakan Kibana untuk visualisasi dan analisis

4. Splunk

5. Penyimpanan dan skalabilitas terpusat

Kesimpulan

6. Penggulungan dan pengarsipan log

1. Konfigurasikan strategi bergulir kerangka log

2. Menggulir berdasarkan ukuran file

3. Sesuaikan strategi pengguliran

4. Arsipkan file log lama

Kesimpulan


perkenalan

Dalam pengembangan perangkat lunak modern, logging adalah bagian penting untuk memastikan stabilitas sistem, pemecahan masalah, dan pemantauan kinerja. Artikel ini akan mempelajari pengalaman praktis pengumpulan log dalam proyek, dan memperkenalkan teknologi pengumpulan log, alat, dan beberapa praktik terbaik yang umum digunakan dalam proyek Java.

1. Pilih kerangka logging yang sesuai

Dalam proyek Java, memilih kerangka log yang sesuai adalah langkah pertama dalam pengumpulan log. Kerangka kerja logging yang umum mencakup Log4j, Logback, dan SLF4J. Berikut beberapa pertimbangan dalam memilih framework:

  • pertunjukan: Kerangka kerja tertentu mungkin memiliki kinerja lebih baik, jadi pilihlah kerangka kerja yang sesuai berdasarkan kebutuhan proyek Anda.
  • fleksibilitas: Beberapa kerangka kerja menyediakan konfigurasi dan opsi keluaran yang lebih fleksibel untuk beradaptasi dengan skenario aplikasi yang berbeda.
  • Dukungan komunitas: Pilih kerangka kerja dengan dukungan komunitas aktif dan pembaruan berkelanjutan untuk memastikan penyelesaian masalah secara tepat waktu dan akses ke fitur-fitur terbaru.

2. Konfigurasikan kerangka log

Setelah memilih kerangka logging, kerangka tersebut perlu dikonfigurasi dengan tepat untuk memenuhi kebutuhan proyek. Secara umum, file konfigurasi biasanya berupa file XML atau properti, yang berisi informasi tentang level log, format output, lokasi tujuan, dll.

Mengambil Logback sebagai contoh, contoh file konfigurasi sederhana adalah sebagai berikut:

  1. <!-- logback.xml -->
  2. <configuration>
  3. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  4. <encoder>
  5. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  6. </encoder>
  7. </appender>
  8. <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  9. <file>logs/myapp.log</file>
  10. <encoder>
  11. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  12. </encoder>
  13. </appender>
  14. <logger name="com.example" level="DEBUG"/>
  15. <root level="INFO">
  16. <appender-ref ref="CONSOLE"/>
  17. <appender-ref ref="FILE"/>
  18. </root>
  19. </configuration>

Konfigurasi di atas mendefinisikan dua Appender, satu untuk keluaran konsol dan yang lainnya untuk keluaran file, serta menetapkan level log dan format keluaran.

3. Gunakan level log yang sesuai

Menggunakan tingkat logging yang sesuai dalam proyek Anda adalah salah satu faktor kunci dalam memastikan efektivitas maksimum sistem logging Anda. Memilih tingkat log yang sesuai dapat memastikan bahwa tingkat informasi log terperinci yang sesuai diperoleh di lingkungan dan tahapan yang berbeda, sekaligus menghindari terlalu banyak atau terlalu sedikit log untuk meningkatkan kinerja dan pemeliharaan sistem.

1. Ikhtisar level log

Dalam kerangka logging Java, level log yang umum meliputi:

  1. JEJAK: Memberikan informasi log paling detail, sering digunakan untuk debugging.
  2. DEBUG: untuk membantu Anda: Memberikan detail untuk debugging, cocok untuk lingkungan pengembangan dan pengujian.
  3. INFORMASI: Memberikan informasi runtime penting yang menunjukkan bahwa aplikasi berfungsi dengan baik.
  4. MEMPERINGATKAN: Menunjukkan potensi masalah yang mungkin memerlukan perhatian namun tidak mempengaruhi pengoperasian normal program.
  5. KESALAHAN: Menunjukkan bahwa kesalahan telah terjadi dan pemrosesan lebih lanjut mungkin diperlukan.

2. Pilih level log yang sesuai (ambil logbkck sebagai contoh di sini)

  1. Gunakan DEBUG selama fase pengembangan: Selama fase pengembangan, gunakan level DEBUG untuk mendapatkan informasi log yang lebih detail guna membantu pengembang melacak dan men-debug kode.

  1. public class ExampleClass {
  2. private static final Logger logger = LoggerFactory.getLogger(ExampleClass.class);
  3. public void someMethod() {
  4. // ...
  5. logger.debug("Debug information for developers");
  6. // ...
  7. }
  8. }

Lingkungan produksi menggunakan INFO: Dalam lingkungan produksi, atur tingkat log ke INFO untuk memastikan bahwa informasi runtime penting dicatat sekaligus mengurangi informasi debug yang berlebihan.

Penanganan peringatan dan kesalahan: Untuk potensi masalah dan kondisi kesalahan, gunakan level WARN dan ERROR. Tingkat pencatatan ini akan membantu tim dengan cepat mengidentifikasi dan menyelesaikan masalah dalam sistem.

3. Menyesuaikan level log secara dinamis

Beberapa kerangka logging memungkinkan penyesuaian dinamis tingkat log saat runtime, yang dapat berguna untuk menyesuaikan verbositas logging tanpa memulai ulang aplikasi.

Dengan menggunakan tingkat log yang sesuai, tim pengembangan dapat menyeimbangkan detail informasi dan overhead kinerja dengan lebih baik, memastikan hasil logging yang optimal di berbagai lingkungan dan skenario.

4. Dikombinasikan dengan informasi konteks log

Menggabungkan informasi konteks log adalah dengan menambahkan informasi konteks tambahan ke catatan log untuk lebih memahami latar belakang peristiwa log. Ini berguna untuk melacak permintaan spesifik, sesi pengguna, atau proses bisnis lainnya. Dalam proyek Java, praktik umum adalah menggunakan MDC (Mapped Diagnostic Context) SLF4J atau ThreadContext Log4j 2 untuk menambahkan informasi konteks log.

1. Menggunakan SLF4J MDC

MDC SLF4J memungkinkan informasi nilai kunci ditambahkan ke konteks log dalam permintaan atau proses bisnis, sehingga informasi tersebut tetap ada di seluruh pemrosesan.

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.slf4j.MDC;
  4. public class RequestContextLogger {
  5. private static final Logger logger = LoggerFactory.getLogger(RequestContextLogger.class);
  6. public void processRequest(String requestId, String userId) {
  7. try {
  8. // 将请求ID和用户ID放入日志上下文
  9. MDC.put("requestId", requestId);
  10. MDC.put("userId", userId);
  11. // 处理请求
  12. logger.info("Processing request");
  13. // ...
  14. } catch (Exception e) {
  15. logger.error("Error processing request", e);
  16. } finally {
  17. // 清理日志上下文,确保不影响其他请求
  18. MDC.clear();
  19. }
  20. }
  21. }

2. Menggunakan ThreadContext Log4j 2

Log4j 2 menyediakan ThreadContext, yang mirip dengan MDC SLF4J dan juga dapat menyimpan informasi konteks pasangan nilai kunci dalam lingkup thread.

  1. import org.apache.logging.log4j.LogManager;
  2. import org.apache.logging.log4j.Logger;
  3. import org.apache.logging.log4j.ThreadContext;
  4. public class RequestContextLogger {
  5. private static final Logger logger = LogManager.getLogger(RequestContextLogger.class);
  6. public void processRequest(String requestId, String userId) {
  7. try {
  8. // 将请求ID和用户ID放入日志上下文
  9. ThreadContext.put("requestId", requestId);
  10. ThreadContext.put("userId", userId);
  11. // 处理请求
  12. logger.info("Processing request");
  13. // ...
  14. } catch (Exception e) {
  15. logger.error("Error processing request", e);
  16. } finally {
  17. // 清理日志上下文,确保不影响其他请求
  18. ThreadContext.clearAll();
  19. }
  20. }
  21. }

3. Memanfaatkan informasi kontekstual

Keuntungan menggabungkan informasi kontekstual log adalah Anda dapat menghubungkan serangkaian peristiwa log terkait, sehingga lebih mudah untuk melacak aliran permintaan tertentu atau tindakan pengguna. Misalnya, dalam sistem terdistribusi, seluruh proses pemrosesan permintaan dapat dilacak di beberapa layanan dengan menambahkan ID permintaan unik ke log.

  1. public class DistributedService {
  2. private static final Logger logger = LoggerFactory.getLogger(DistributedService.class);
  3. public void processDistributedRequest(String requestId) {
  4. try {
  5. MDC.put("requestId", requestId);
  6. // 处理分布式请求
  7. logger.info("Processing distributed request");
  8. // ...
  9. } catch (Exception e) {
  10. logger.error("Error processing distributed request", e);
  11. } finally {
  12. MDC.clear();
  13. }
  14. }
  15. }

Dengan menggabungkan informasi kontekstual, catatan log tidak lagi merupakan peristiwa yang terisolasi, namun terhubung secara organik, menyediakan alat yang lebih canggih untuk pemecahan masalah sistem dan optimalisasi kinerja.

5. Pemantauan waktu nyata dan penyimpanan terpusat

Pemantauan waktu nyata dan penyimpanan terpusat merupakan aspek penting dari manajemen log dalam proyek. Melalui cara ini, tim dapat melacak status sistem yang berjalan secara waktu nyata, mendeteksi potensi masalah, dan melakukan pemecahan masalah tepat waktu bila diperlukan. Dalam proyek Java, alat yang umum digunakan antara lain ELK Stack (Elasticsearch, Logstash, Kibana), Splunk, dll.

1. Tumpukan ELK (Elasticsearch, Logstash, Kibana)

ELK Stack adalah seperangkat alat sumber terbuka untuk pengumpulan, penyimpanan, dan visualisasi log.

  • Pencarian elastis: Digunakan untuk menyimpan dan mengambil data log dalam jumlah besar. Ini memberikan kemampuan pencarian dan analisis yang kuat untuk data waktu nyata.

  • Logstash: Digunakan untuk pengumpulan log, pemfilteran, dan penerusan. Logstash dapat menormalkan data log dari berbagai sumber dan mengirimkannya ke Elasticsearch untuk disimpan.

  • Kibana: Menyediakan antarmuka pengguna yang intuitif untuk menanyakan, memvisualisasikan, dan menganalisis data log yang disimpan di Elasticsearch. Dengan Kibana, tim dapat membuat dasbor, bagan, dan melakukan analisis mendalam terhadap data log.

2. Konfigurasikan Logstash untuk mengumpulkan log

Mengonfigurasi Logstash di proyek Anda untuk mengumpulkan log adalah langkah penting untuk ELK Stack. Logstash mendukung berbagai sumber masukan dan target keluaran, yang dapat ditentukan melalui file konfigurasi sederhana.

  1. # logstash.conf
  2. input {
  3. file {
  4. path => "/path/to/your/application.log"
  5. start_position => "beginning"
  6. }
  7. }
  8. filter {
  9. # 可添加过滤规则
  10. }
  11. output {
  12. elasticsearch {
  13. hosts => ["localhost:9200"]
  14. index => "your_index_name"
  15. }
  16. }

Contoh ini mengonfigurasi plugin masukan Logstash untuk memantau file log di bawah jalur yang ditentukan dan mengeluarkannya ke Elasticsearch. Bagian filter dapat menambahkan aturan tambahan untuk mengurai, memfilter, atau menambahkan informasi tambahan ke log.

3. Gunakan Kibana untuk visualisasi dan analisis

Kibana menyediakan antarmuka pengguna intuitif yang dapat diakses melalui browser web. Di Kibana, Anda dapat membuat dasbor, bagan, dan melakukan kueri dan analisis yang kompleks.

Dengan Kibana, Anda dapat dengan mudah:

  • pemantauan waktu nyata: Lihat data log waktu nyata dan pahami status sistem yang berjalan kapan saja.

  • Penyelesaian masalah: Telusuri log berdasarkan kriteria tertentu untuk menemukan akar penyebab potensi masalah.

  • Analisis kinerja: Memanfaatkan bagan dan alat visualisasi untuk menganalisis hambatan kinerja sistem.

4. Splunk

Splunk adalah alat manajemen log lain yang banyak digunakan yang menyediakan solusi lengkap untuk pengumpulan log, pencarian, analisis, dan visualisasi.

  • Pengumpulan log: Splunk mendukung pengumpulan data log dari berbagai sumber (file, database, lalu lintas jaringan, dll.).

  • Pencarian dan analisis waktu nyata: Menyediakan fungsi pencarian dan analisis waktu nyata, mendukung kueri kompleks, dan menampilkan hasil pencarian melalui antarmuka visual.

  • Dasbor dan Laporan: Pengguna dapat membuat dasbor dan laporan khusus untuk memantau dan menganalisis kinerja sistem.

5. Penyimpanan dan skalabilitas terpusat

ELK Stack dan Splunk memiliki mekanisme penyimpanan terpusat yang kuat yang dapat menyimpan data log dalam jumlah besar. Penyimpanan terpusat ini tidak hanya memfasilitasi pengambilan dan analisis log, namun juga menyediakan skalabilitas bagi sistem dan dapat menangani log aplikasi berskala besar.

Kesimpulan

Pemantauan waktu nyata dan penyimpanan terpusat adalah kunci untuk memastikan stabilitas dan kinerja proyek. Dengan menggunakan alat seperti ELK Stack dan Splunk, tim proyek dapat melacak log secara real time di lingkungan sistem yang kompleks dan melakukan pemecahan masalah dan optimalisasi kinerja secara tepat waktu. Kekuatan alat-alat ini tidak hanya meningkatkan efisiensi tim, namun juga memberikan proyek dengan kemampuan pemeliharaan dan skalabilitas yang lebih baik.

6. Penggulungan dan pengarsipan log

Penggulungan dan pengarsipan log adalah praktik penting dalam proyek. Hal ini memastikan pengelolaan file log yang wajar, mencegah masalah penyimpanan yang disebabkan oleh file log yang berlebihan, dan membantu menjaga pengoperasian normal sistem. Berikut adalah beberapa praktik umum untuk menerapkan penggulungan dan pengarsipan log di proyek Java.

1. Konfigurasikan strategi bergulir kerangka log

Sebagian besar kerangka logging menyediakan strategi bergulir yang dapat diatur melalui file konfigurasi. Kebijakan ini menentukan kapan harus beralih ke file log baru dan kapan harus menghapus file log lama. Mengambil Logback sebagai contoh, konfigurasikan strategi pengguliran dasar:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  4. <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
  5. <maxHistory>30</maxHistory>
  6. </rollingPolicy>
  7. <encoder>
  8. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  9. </encoder>
  10. </appender>

Konfigurasi di atas menggunakanTimeBasedRollingPolicy, yang akan menggulung file log berdasarkan waktu.maxHistoryMenentukan jumlah file log historis yang akan disimpan. File log yang melebihi jumlah ini akan dihapus.

2. Menggulir berdasarkan ukuran file

Terkadang, menggulirkan berdasarkan waktu mungkin tidak cukup, dan Anda juga perlu menggulirkan berdasarkan ukuran file log. Hal ini dapat dicapai dengan mengkonfigurasi ukuran file:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  4. <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  5. <maxFileSize>5MB</maxFileSize>
  6. <maxHistory>30</maxHistory>
  7. </rollingPolicy>
  8. <encoder>
  9. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  10. </encoder>
  11. </appender>

Konfigurasi di atas menggunakanSizeAndTimeBasedRollingPolicy, yang menggulung file log berdasarkan ukuran dan waktu file.maxFileSizeMenentukan ukuran maksimum setiap file log.

3. Sesuaikan strategi pengguliran

Terkadang, proyek mungkin perlu melakukan roll log berdasarkan kondisi khusus. Dalam hal ini, pertimbangkan untuk menerapkan strategi pengguliran khusus. Misalnya, menggulirkan file log berdasarkan aturan bisnis tertentu:

  1. public class CustomRollingPolicy extends TimeBasedRollingPolicy<ILoggingEvent> {
  2. // 实现自定义的滚动逻辑
  3. }

Kemudian gunakan strategi pengguliran khusus di file konfigurasi:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="com.example.CustomRollingPolicy">
  4. <!-- 自定义配置 -->
  5. </rollingPolicy>
  6. <encoder>
  7. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  8. </encoder>
  9. </appender>

4. Arsipkan file log lama

Selain menggulirkan file log, mengarsipkan file log lama juga merupakan praktik umum. Hal ini dapat dilakukan dengan memindahkan file log lama ke direktori arsip secara teratur untuk mencegahnya memakan terlalu banyak ruang disk.

Atau gunakan pendekatan terprogram untuk mengimplementasikannya dalam kode Java:

  1. import java.io.File;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.nio.file.StandardCopyOption;
  5. import java.time.LocalDate;
  6. import java.time.format.DateTimeFormatter;
  7. public class LogArchiver {
  8. public static void archiveLogFile(String logFileName, String archiveDirectory) {
  9. String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  10. File logFile = new File(logFileName);
  11. File archiveDir = new File(archiveDirectory);
  12. if (!archiveDir.exists()) {
  13. archiveDir.mkdirs();
  14. }
  15. Path sourcePath = logFile.toPath();
  16. Path targetPath = new File(archiveDir, logFile.getName() + "." + currentDate + ".log").toPath();
  17. try {
  18. Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

Dipanggil dalam tugas berkalaarchiveLogFileMetode ini dapat digunakan untuk mengarsipkan file log.

Dengan menerapkan penggulungan dan pengarsipan log, proyek dapat mengelola file log dengan lebih efisien dan memastikan bahwa sistem mempertahankan kinerja yang baik dalam jangka waktu yang lama. Hal ini tidak hanya berguna untuk pemecahan masalah, namun juga membantu persyaratan kepatuhan.

Kesimpulan

Dengan memilih kerangka logging yang sesuai, mengkonfigurasinya dengan tepat, menggunakan tingkat log yang sesuai, dan menggabungkan informasi kontekstual, proyek dapat membangun sistem logging yang kuat yang memberikan dukungan kuat untuk pemecahan masalah, optimalisasi kinerja, dan pemantauan sistem. Pada saat yang sama, pemantauan real-time dan penyimpanan terpusat memberi tim cara yang lebih nyaman untuk melacak status sistem. Penebangan yang cermat tidak hanya merupakan praktik teknis untuk pengembangan proyek, tetapi juga merupakan jaminan penting untuk meningkatkan efisiensi tim dan kualitas proyek secara keseluruhan.