Penebangan Terpusat
Pusatkan Logging Docker Anda Dengan Syslog
Cara terbaik untuk memahami sistem kami dan keberhasilan atau kegagalannya adalah melalui logging yang baik
Latar Belakang
Dalam salah satu proyek yang saya kerjakan beberapa tahun terakhir, saya mendapat tugas untuk mengintegrasikan sistem logging terpusat dengan tumpukan aplikasi yang kami gunakan (mengikuti arsitektur layanan mikro). Ide pertama yang terlintas dalam pikiran adalah membangun tumpukan ELK (Elasticsearch, Logstash, Kibana) untuk menyelesaikan tugas ini. Namun, ternyata hal ini bukanlah suatu pilihan karena keterbatasan sumber daya proyek.
Hasilnya, saya menyelidiki semua opsi dan ide yang akan membantu saya menerapkan fitur ini tanpa bertentangan dengan keterbatasan kami. Saya akhirnya mendapatkan ide-ide berikut:
- Kumpulkan log Docker secara langsung.
- Menggunakan Syslog untuk mengumpulkan log.
Seperti yang sudah saya katakan, ide pertama adalah membangun tumpukan ELK untuk mengumpulkan kayu gelondongan. Namun, hal tersebut bukanlah suatu pilihan karena keterbatasan anggaran dan sumber daya untuk proyek tersebut.
Ide lainnya adalah meneruskan log ke layanan terkelola seperti logz.io. Opsi ini juga tidak memungkinkan karena server produksi tidak memiliki akses internet—ditambah keterbatasan anggaran yang sama.
Ide ketiga adalah menyiapkan skrip Logrotate
yang melakukan tindakan berikut untuk menghasilkan file log:
- Kumpulkan log Docker dari
/var/lib/docker/containers/*
. - Ganti nama file dengan nama kontainer, bukan id.
- Kompres file log.
Langkah kedua dari ide ini adalah menyiapkan pekerjaan Cron untuk menyalin file log ke server terpusat tempat log dapat dimuat dan diperiksa.
Ide ini memiliki banyak kelemahan dan lebih seperti menciptakan kembali roda. Salah satu kelemahan yang paling penting adalah log akan hilang jika terjadi penerapan baru dan kontainer diganti.
Itu sebabnya saya mulai mencari solusi alternatif yang akan membantu kami mengumpulkan log dari server ke server terpusat tanpa kehilangan log. Untungnya, Docker mendukung banyak driver log (lihat daftar lengkap). Salah satu driver log ini adalah Syslog, yang secara default diinstal pada sistem Linux (tidak perlu menginstal perangkat lunak tambahan). Untuk alasan ini, saya memutuskan untuk menerapkan sistem logging terpusat dengan Syslog.
Implementasi
Untuk alasan kesederhanaan saja, mari kita asumsikan bahwa infrastruktur yang menghosting layanan mikro terdiri dari node berikut:
- Kluster Docker dua node yang menghosting layanan tersebut.
- Satu node untuk menyimpan log.
Catat konfigurasi server
Untuk mengonfigurasi server log dan menyiapkannya untuk mengumpulkan log dari host Docker, saya harus melakukan langkah-langkah berikut:
- Pastikan Syslog sudah terinstal atau instal menggunakan perintah di bawah ini:
$> yum update -y
$> sudo yum install rsyslog rsyslog-doc
- Daftar pada port TCP yang benar. Baris di bawah ini harus ada di file konfigurasi Syslog
/etc/rsyslog.conf
:
$ModLoad imtcp $InputTCPServerRun 514
- Perbarui konfigurasi batas Nilai Jurnal untuk Syslog dan
journald
. Konfigurasi di bawah ini harus ditambahkan ke file/etc/rsyslog.conf
untuk menghindari kehilangan log jika ada terlalu banyak pesan log. Lihat dokumentasi Syslog untuk informasi lebih lanjut.
$imjournalRatelimitInterval 0
$imjournalRatelimitBurst 0
- Selain itu, Konfigurasi batas kecepatan perlu disetel ke
0
di file konfigurasijournald
/etc/systemd/journald.conf
.
RateLimitInterval=0
Secara default, Syslog akan menyimpan semua log di /var/log/messages
. Namun, kami ingin memisahkan log berdasarkan nama container untuk memudahkan penyelidikan. Untuk mengonfigurasi server Syslog agar memisahkan log dari kontainer berbeda ke dalam file berbeda, kita perlu melakukan langkah-langkah berikut:
- Putuskan dan buat folder untuk menyimpan semua log.
$>
mkdir /var/log/dockerlfs
- Kumpulkan log untuk daemon Docker dan simpan ke disk. Aturan konfigurasi Syslog di bawah ini (disimpan di
/etc/rsyslog.d/docker_daemon.conf
) membuat Syslog menyimpan semua log milik program yang dimulaidocker
hingga/var/log/dockerlfs/daemon.log
.
- Kumpulkan log kontainer Docker dan simpan ke file log terpisah. Aturan konfigurasi Syslog di bawah ini akan menyimpan log ke dalam file individual untuk setiap container yang berjalan berdasarkan nama container. Aturannya harus disimpan di
/etc/rsyslog.d/docker_container.con
. Aturan ini mengandalkan host Docker untuk menandai semua log dengancontainer_name
.
Langkah selanjutnya adalah menyiapkan aturan Logrotate
untuk merotasi log dan menghindari file log besar di server. Log lama dapat diarsipkan oleh administrator sistem. Aturan di bawah ini akan merotasi log di server setiap hari atau jika ukuran file lebih dari 20MB. Itu juga hanya akan menyimpan 30 file log terakhir untuk setiap kontainer.
Sebagai langkah terakhir untuk konfigurasi server, kita perlu me-restart layanan untuk memastikan bahwa konfigurasi kita dimuat.
$>
systemctl restart rsyslog$>
systemctl restart systemd-journald
Konfigurasikan Host Docker
Sekarang setelah kita selesai mengonfigurasi server Syslog, kita dapat melanjutkan dan mulai mengonfigurasi host Docker untuk meneruskan log dari server ke server Syslog.
Hal pertama yang perlu dilakukan adalah mengkonfigurasi ulang daemon Docker untuk menggunakan driver log syslog
alih-alih journald
dan menandai log dengan nama kontainer. Untuk mencapai tujuan ini, kita perlu memodifikasi file konfigurasi daemon Docker yang terletak di bawah /etc/docker
. daemon.json
harus mencakup konten berikut:
Variabel SYSLOG_SERVER_IP
harus diganti dengan IP server Syslog. Variabel ENV_NAME
harus diganti dengan nama lingkungan (pengujian, pementasan, atau produksi). Dengan konfigurasi di atas, Docker akan meneruskan log langsung ke server Syslog. Jika server Syslog sedang down atau tidak ada koneksi yang valid, kami mungkin kehilangan beberapa log dengan konfigurasi di atas.
Untuk meningkatkan sistem logging kami dan menghindari kehilangan log, kami akan melakukan perubahan berikut:
- Meneruskan log dari Docker ke server lokal.
- Konfigurasikan Syslog lokal untuk meneruskan log ke server log terpusat.
Untuk meneruskan log dari Docker ke server Syslog lokal, kita hanya perlu menghapus baris berikut dari /etc/docker/daemon.json
atau mengganti SYSLOG_SERVER_IP
dengan 127.0.0.1
:
"syslog-address": "tcp://${SYSLOG_SERVER_IP}:514",
Setelah kita selesai dengan konfigurasi Docker, kita perlu me-restart daemon Docker.
$>
systemctl restart docker
Langkah selanjutnya adalah memperbarui konfigurasi Syslog pada node Docker agar dapat menyimpan log Docker secara lokal dan meneruskannya ke server terpusat.
konfigurasi syslog dan journald
Kami memerlukan item konfigurasi berikut untuk journald
di file /etc/systemd/journald.conf
: RateLimitInterval=0
.
Kami memerlukan item konfigurasi berikut untuk Syslog di file /etc/rsyslog.conf
:
$ActionQueueFileName fwdRule1 $ActionQueueSaveOnShutdown on $ActionQueueType LinkedList $ActionResumeRetryCount -1
$imjournalRatelimitInterval 0 $imjournalRatelimitBurst 0
ActionQueueFileName
:Menambahkanawalan nama unik untuk file spul.ActionQueueSaveOnShutdown
:Simpan pesan ke disk saat dimatikan.ActionQueueType
: Jalankan secara asinkron.ActionResumeRetryCount
:Sayamencoba ulang tanpa batas jika host sedang down.
Dengan konfigurasi di atas, Syslog akan terus mencoba mengirim log ke server terpusat hingga log ditangkap oleh server tujuan. Namun, hingga saat ini, kami belum mengonfigurasi server Syslog lokal di host Docker untuk meneruskan log ke server lain. Oleh karena itu, semua log yang dikumpulkan dari Docker akan disimpan dalam file default /var/log/messages
.
Meneruskan log dari Syslog ke server lain sangat sederhana. Anda hanya perlu menambahkan aturan berikut di akhir file /etc/rsyslog.conf
dan mengganti SYSLOG_SERVER_IP
dengan IP server log yang valid. Aturan ini pada dasarnya memeriksa semua log dan memfilternya berdasarkan tag dan nama program. Jika tag pesan berisi tag bernama container_name
atau programname
, mulailah dengan docker
. Kemudian ia akan meneruskan log ke SYSLOG_SERVER_IP
.
Kita dapat memperbaiki aturan di atas dengan menyimpan salinan log secara lokal di server Docker. Dengan perubahan di bawah ini, aturan Syslog kami akan mengirimkan log ke server Syslog jarak jauh dan akan menyimpan salinan file log secara lokal di masing-masing server yang menjalankan Docker di bawah /var/log/dockerlfs
.
Karena kita sekarang memiliki salinan file log di server Docker, masuk akal untuk menambahkan aturan Logrotate
untuk memutar file ini juga. Kita dapat menggunakan aturan yang sama dengan yang digunakan untuk node server.
Terakhir, diperlukan restart untuk Syslog dan journald
untuk mengambil konfigurasi baru.
$> systemctl restart rsyslog $> systemctl restart systemd-journald
Kesimpulan
Sistem dan tumpukan logging terpusat dapat diterapkan dengan berbagai metode dan alat. Syslog adalah salah satu metode ini—dan ini sangat berguna ketika ada beberapa keterbatasan pada lingkungan yang berjalan dan kurangnya pengalaman dalam mengelola dan menjalankan tumpukan yang lebih canggih seperti ELK.