Kami memiliki beberapa aplikasi yang menghasilkan file log teks biasa, yang ingin saya teruskan ke server syslog jarak jauh untuk logging terpusat. Saya tidak memiliki akses ke root
pada mesin-mesin ini, saya juga tidak dapat mengkonfigurasi ulang syslog
untuk mengarahkan output ke mesin jarak jauh.
Saya telah menemukan beberapa solusi online, tetapi sebagian besar adalah skrip bash buatan rumah orang-orang, dan saya mencari sesuatu yang lebih kuat yang cocok untuk implementasi di lingkungan produksi yang berpotensi bervolume tinggi.
Lebih disukai sesuatu yang dirancang dengan mata untuk tapak kecil, daemon latar belakang yang terus berjalan, yang dapat mengikuti banyak garis, dll. - Solusi apa yang saat ini tersedia?
Jawaban:
Anda sudah menolak "skrip bash orang lain", tetapi ini adalah solusi yang cukup umum - beberapa penggunaan kreatif
logger
perintah dapat mengikuti file dan mengirim isinya di tempat lain.Saya pribadi tidak akan melakukan ini dalam lingkungan produksi.
Opsi yang lebih baik yang membutuhkan lebih sedikit peretasan scripting adalah menggunakan
rsyslogd
dan modul input file teks seperti yoonix disebutkan - Ini adalah solusi yang cukup layak meskipun ada beberapa potensi untuk garis yang hilang selama rotasi file, dan jika Anda berada di sistem Linux denganrsyslog
sebagai daemon syslog Anda tidak diperlukan banyak pekerjaan tambahan.syslog-ng
juga mendukung sumber input file dengan fungsionalitas yang mirip denganrsyslog
.IMHO solusi terbaik - meskipun membutuhkan modifikasi aplikasi yang menghasilkan log-log ini - adalah login ke syslog secara langsung. Anda tidak ingin melalui langkah perantara, file, dll. -
syslog
adalah SYStem LOGger, dan hal-hal yang menulis log pada platform Unix harus mengirimnya ke syslog.Implementasi dari ini, sayangnya, dibiarkan sebagai latihan untuk pembaca (dan pengembang aplikasi) dan mungkin tidak dapat dilakukan jika pengembang Anda tidak ada, malas, atau tidak kompeten ....
sumber
rsyslog
konfigurasi yang sedang berjalan di sistem. Anda TIDAK seharusnya menjalankan dua daemon syslog. Bukan untuk bersikap kasar, tetapi Anda harus berhenti berusaha melakukan kesalahan *: Setiap solusi yang tepat untuk skenario ini memerlukan tindakan administratif (root) di server atau modifikasi aplikasi. Anda harus menghadapi kenyataan itu dan berurusan dengan kelompok apa pun dalam organisasi Anda yang berakar pada sistem yang bersangkutan, jika tidak, pertanyaan ini di luar topik (Anda mencoba mengelak dari kebijakan organisasi Anda) ....Anda dapat menggunakan logstash dengan input file dan output syslog .
Misalnya, buat konfigurasi dengan file (atau file) yang ingin Anda pantau dan info server syslog Anda.
file-ke-syslog.conf:
Start up logstash dengan
sumber
Saya meretas bersama
tail.c
danlogger.c
menjadi satu, program kompilasi jejak kecil (biner) yang ringan, cepat dan stabil. Selama ia memiliki akses baca ke file log, maka ia berfungsi tanpa memerlukan hak akses root.Saya juga membuat beberapa perbaikan pada logger asli dan menambahkan kemampuan (opsional) baru untuk memasukkan string teks pada awal setiap baris log sebelum dikirim ke server log. Hasilnya adalah program yang dapat dijalankan dengan sendirinya, tanpa perlu menggunakan pipa shell (yaitu tidak perlu
tail logfile | logger
). Ini akan berjalan selamanya sampai terbunuh secara eksplisit atau menemui kesalahan penulisan ke soket jaringan. Itu bahkan terus berjalan jika file log diputar atau bahkan menghilang (itu hanya akan terus melihat apakah file muncul kembali.)Mudah digunakan: cukup berikan satu atau lebih file log untuk dipantau, dan setiap kali baris baru ditulis ke file, itu akan mengirim salinan garis itu ke server syslog lokal atau jauh yang Anda tentukan. Ditambah string teks tambahan jika Anda menggunakan opsi itu.
Saya benar-benar menyelesaikan program kembali pada bulan Desember, tetapi sedang menunggu Yahoo untuk mengambil hak cipta dan membuatnya tersedia, yang sekarang telah mereka lakukan. (Saya menulisnya sebagai bagian dari pekerjaan saya di Yahoo).
informasi program filelogger dan tautan unduhan:
sumber
Ada beberapa cara untuk mengatasi ini. Tetapi hal yang sangat, sangat pertama yang harus Anda lakukan adalah: meneruskan log menggunakan syslog itu sendiri .
Syslog (dan banyak pengganti untuk syslog) memiliki fasilitas bawaan untuk meneruskan logging ke server syslog lain di alamat yang berbeda. Anda dapat dengan mudah melakukannya dengan mengubah file konfigurasi dan menambahkan alamat untuk meneruskan fasilitas. Misalnya, menambahkan baris ini ke:
... akan meneruskan semua fasilitas ke mesin di 192.168.1.1, yang (semoga) menjalankan layanan. Contoh yang saya berikan di sini adalah untuk rsyslog, yang merupakan server syslog stok di Debian, meskipun harus bekerja untuk banyak orang lain. Konsultasikan dokumentasi untuk implementasi syslog Anda dengan
man syslog
dan lihat apa yang dikatakannya tentang "penerusan".Server syslog jarak jauh bisa apa saja yang Anda suka. Bahkan ada produk, seperti Splunk , yang dengan senang hati menggabungkan log-log ini ke dalam satu tampilan dengan dashboard web, pencarian, notifikasi yang didorong oleh peristiwa, dll. Anda dapat melihat lebih banyak di sini: http://www.splunk.com/ Jika yang tidak memenuhi kebutuhan Anda, Anda dapat menggunakan sesuatu yang lain. Bahkan ada server syslog yang akan membuang ke database SQL!
Tentu, Anda dapat menulis skrip / program / layanan Anda sendiri untuk melakukan ini untuk Anda, tetapi mengapa menemukan kembali roda ketika keduanya dilakukan untuk Anda dan sudah diberikan kepada Anda?
Sunting: Jadi saya kembali dan membaca kembali pertanyaan itu, dan memperhatikan beberapa komentar. Kedengarannya seperti:
Jadi mari kita alamat masing-masing secara berurutan:
root
untuk mengatur logging. Kami hanya perlu akses ke syslog API.root
bukan persyaratan untuk menulis ke syslog; jika ini masalahnya, maka semua layanan yang kehilangan hak istimewa tidak akan bisa menulis diagnostik ke file log.Re: kesedihan teks, ini normal. namun, Anda harus dapat menggunakan subkulit untuk menyalurkan output STDERR dan STDOUT ke program yang memanggil API syslog. Ini bukan ilmu roket, jauh dari rapuh, dan didokumentasikan dengan baik. Bahkan, itu salah satu alasan bahwa redirection output bahkan ada. Perintah sederhana yang dapat dilemparkan ke dalam satu skrip shell adalah:
(aplikasi saya 2> & 1 | my-syslog-shunt) &
jika Anda memiliki kemampuan untuk mengubah kode sumber aplikasi Anda, Anda harus menulis shunt ke dalamnya untuk membuang output teks ke syslog alih-alih file teks biasa. Ini seharusnya tidak terlalu sulit; yang Anda lakukan hanyalah mengambil jalur yang akan Anda hasilkan, dan membungkusnya dengan panggilan. Namun....
Anda mungkin tidak memiliki akses ke kode sumber sama sekali, jadi Anda tidak bisa melakukan ini. Yang berarti sesuatu seperti # 3 di atas akan berfungsi dengan baik.
sumber
Runtime.exec("logger ..."
) OK, terima kasih.Saya menjawab pertanyaan saya sendiri.
swatch mungkin berhasil, tetapi saya tidak bisa mendapatkan perl's Sys :: Syslog module untuk bekerja pada host, dan / usr / bin / logger yang diinstal pada host tidak mendukung logging ke server jauh (util-linux-ng- 2.17.2).
Jadi, hal pertama yang saya lakukan adalah mengunduh kode sumber untuk util-linux-2.20.1 yang mana program logger mendukung logging jarak jauh. Setelah pengujian, menjadi jelas ada batas yang dikenakan pada jumlah karakter yang diizinkan pada baris log. Menggali kode sumber saya menemukan batas 400-karakter kode keras. (Jika Anda tidak percaya, jalankan "strings / usr / bin / logger | grep 400" di sistem Linux apa pun).
Batas ini tidak dapat diterima untuk logging tipe apache (termasuk nodejs), jadi saya memodifikasi kodenya dan meningkatkan batasnya menjadi 4096. Ketika saya berada di sana, saya juga menambahkan opsi baris perintah baru yang memungkinkan seseorang untuk memasukkan opsi opsional string teks di awal setiap baris log. Saya melakukan ini karena log nodejs tidak menyertakan nama host seperti yang mungkin akan dilihat di apache.
Pada titik ini, saya dapat menjalankan skrip shell dengan "tail -F -n 0 [logfile] | ./modified_logger ...." dan berhasil. Tetapi saya memiliki beberapa kekhawatiran tentang menjalankan ini dari pengawasan (daemontools) atau bahkan di latar belakang, karena jika satu atau sisi lain dari pipa berakhir, maka ada risiko seluruh pipa akan berakhir. Saya juga memiliki kekhawatiran (meskipun belum diuji) tentang kinerja.
jadi saya memutuskan untuk menggabungkan fungsi ekor dengan fungsi logger menjadi biner tunggal yang dapat dieksekusi yang akan memotong kebutuhan untuk menggunakan pipa Unix atau program eksternal. Saya melakukan ini dengan meretas tail.c dari gnu coreutils dan memasukkan apa yang saya butuhkan ke dalam program logger yang dimodifikasi.
Hasilnya adalah biner baru (ukuran 117k) yang saya sebut "filelogger" dan yang terus-menerus memonitor satu atau lebih file dan mencatat setiap baris baru ke syslog lokal atau jauh, baik melalui UDP atau TCP. Itu bekerja seperti pesona. Saya dapat melakukan sedikit pembandingan dan mencatat sekitar 17.000 baris (1.8MB) dalam waktu sekitar 3 detik melintasi subnet dengan vlan dan beberapa saklar fisik di antara mereka, ke server jarak jauh yang menjalankan syslog-ng.
untuk menjalankan program Anda melakukan sesuatu seperti berikut (baik di latar depan, latar belakang, atau diawasi dengan daemontools):
./filelogger -t 'akses' -d -p local1.info -n [remote loghost] -u / tmp / diabaikan -a $ (nama host) / tmp / myfile1 / tmp / myfile2 ...
/ tmp / myfile1 dan / tmp / myfile2 adalah file yang dipantau.
"-A" adalah opsi baru yang saya tambahkan. Dalam hal ini saya memasukkan nama host lokal di awal setiap baris log.
Solusi ini persis jenis solusi yang saya cari ketika saya mengajukan pertanyaan dan, ternyata, tidak ada sampai saya membuatnya sendiri. :)
sumber