Linux: bagaimana cara mengirim baris baru dalam file log ke syslog jarak jauh?

8

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 rootpada mesin-mesin ini, saya juga tidak dapat mengkonfigurasi ulang sysloguntuk 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?

Michael Martinez
sumber
3
Sudahkah Anda melihat modul input file teks untuk rsyslog?
yoonix
@yoonix: Tidak, belum, tapi saya akan :)
Michael Martinez
3
Ehm, syslog dapat mengirim ke server syslog jarak jauh. Konfigurasikan syslog lokal Anda untuk dikirim ke server jarak jauh. Kemudian akses syslog lokal Anda melalui panggilan syslog standar atau dengan menggunakan logger atau sesuatu.
Zoredache
4
Mengapa Anda tidak menulis file log Anda ke pipa bernama dan memiliki daemon mendengarkan yang mengirim mereka di serverfault.com/questions/189477/…
user9517
3
Anda tidak harus memodifikasi aplikasi, cukup beri nama pipa dengan nama yang sama dengan file log tempat aplikasi tersebut menulis.
user9517

Jawaban:

13

Anda sudah menolak "skrip bash orang lain", tetapi ini adalah solusi yang cukup umum - beberapa penggunaan kreatif loggerperintah 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 rsyslogddan 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 dengan rsyslogsebagai daemon syslog Anda tidak diperlukan banyak pekerjaan tambahan.

syslog-ngjuga mendukung sumber input file dengan fungsionalitas yang mirip dengan rsyslog.


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. - syslogadalah 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 ....

voretaq7
sumber
7
@MichaelMartinez Anda akan memodifikasi rsyslogkonfigurasi 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) ....
voretaq7
5
@Michael Semua ini memberitahu kita bahwa seseorang sedang mencoba untuk memaksa tim yang salah untuk menerapkan perbaikan.
Andrew B
4
@MichaelMartinez imho, itu terdengar seperti rute yang cukup cepat untuk melemahkan tingkat utang teknis.
Sirex
2
@ Sirex. Baik itu apa adanya, itu adalah cara hidup. Saya bekerja di sebuah organisasi yang mempekerjakan 10-an ribu orang, yang sebagian besar adalah teknis (insinyur, pengembang, dsb.)
Michael Martinez
5
Saya tebak. Secara umum saya telah menemukan jangka panjang bahwa tidak ada medali dalam memenangkan pertempuran yang dilakukan sendiri. Ketika hutang teknis sampai ke titik itu berdampak bisnis ironisnya orang-orang yang rajin bekerja keras untuk menghindari gajah di ruangan cenderung berakhir dengan membawa kaleng, dalam pengalaman saya. Jadi saya akan mengatakan tutupi pantat Anda dan minta seseorang untuk setuju dalam menulis kerugian dari ini.
Sirex
6

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:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

Start up logstash dengan

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
sciurus
sumber
+1. jika menggunakan input file rsyslog bukanlah suatu pilihan, logstash adalah hal terbaik berikutnya. Dalam banyak hal lebih baik dalam jangka panjang.
Sirex
Saya tidak terbiasa dengan ini. Jika ia melakukan apa yang saya butuhkan, itu akan menyelamatkan saya dari masalah meretas coreutils dan util-linux.
Michael Martinez
ya, konfigurasi akan terlihat sedikit seperti ini: pastebin.com/xeC9hxD3
Sirex
terlihat seperti alat yang sangat keren, tapi pasti berlebihan untuk apa yang saya butuhkan di sini. logstash adalah layanannya sendiri, dengan antarmuka web, memerlukan java, dll. Saya akan terus menggunakan filelogger saya yang ringan, tapak kecil, dioptimalkan untuk kinerja. ... Tapi, terima kasih telah menyarankan logstash karena saya dapat melihat kebutuhan untuk itu dalam situasi lain di masa depan!
Michael Martinez
ya itu alat jar dikemas jruby. Gui sebenarnya adalah kibana yang dikemas ke dalamnya dengan mudah tetapi sebenarnya adalah proyek yang terpisah, jadi itu tidak diperlukan hanya untuk mem-parsing pesan. Ini pada dasarnya adalah pisau penebangan tentara swiss. Anda menentukan input dan output dan di tengah Anda secara opsional dapat grok log, yang memberi mereka konteks. - Ini kemungkinan berlebihan bagi Anda kecuali Anda juga ingin menggunakan elasticsearch pada data log Anda.
Sirex
4

Saya meretas bersama tail.cdan logger.cmenjadi 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:

Michael Martinez
sumber
@slm: Saya menulis ulang seperti yang Anda minta
Michael Martinez
Sangat berguna, terima kasih Michael. Apakah Anda akan mengemasnya untuk debian apt-get install?
joelparkerhenderson
@joelparkerhenderson. Hai Joel. Sayangnya, mungkin bukan karena saya tidak bekerja dengan debian. Sudahkah Anda mencoba menyalin biner ke sistem Anda dan melihat apakah itu berjalan?
Michael Martinez
1

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:

*.*    @192.168.1.1

... 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 syslogdan 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:

  1. Anda ingin menggabungkan log aplikasi Anda
  2. Anda tidak memiliki akses ke root
  3. aplikasi Anda hanya membuang teks di suatu tempat
  4. aplikasi Anda tidak tahu cara menulis ke syslog lokal
  5. Anda tidak memiliki kendali atas kode sumber aplikasi Anda

Jadi mari kita alamat masing-masing secara berurutan:

  1. syslog dimaksudkan untuk mengumpulkan log bersama. Anda dapat menggunakan apa pun yang Anda suka, tetapi ada alasan mengapa itu sudah ada sejak lama. Ini sudah teruji, debug baik, terdokumentasi dengan baik, terkenal, dan untuk sebagian besar platform * nix hampir secara universal didukung dalam satu atau lain rasa.
  2. kami tidak perlu akses rootuntuk mengatur logging. Kami hanya perlu akses ke syslog API. rootbukan persyaratan untuk menulis ke syslog; jika ini masalahnya, maka semua layanan yang kehilangan hak istimewa tidak akan bisa menulis diagnostik ke file log.
  3. 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) &

  4. 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....

  5. 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.

Avery Payne
sumber
dua alasan: (1) hanya karena, sebagaimana telah disebutkan, tidak memiliki root atau sudo pada kotak yang dimaksud. (2) "logger" itu sendiri dapat meneruskan ke server jauh, tetapi memiliki batas 400 karakter per baris log, yang tidak sesuai untuk log Apache. Lagi pula, saya sudah mengumpulkan solusi kustom yang melakukan persis apa yang saya butuhkan (dan meningkatkan "logger" juga). Lihat jawaban saya di sini untuk "filelogger"
Michael Martinez
4. Syslog bukan hanya aliran file yang saya bisa buka dan tulis teks. Shunt yang saya tulis harus membuka soket ke port UDP yang didengarkan syslog?
Noumenon
1
@ Noumenon, saya tidak sepenuhnya jelas pada maksud Anda, tapi saya berasumsi Anda ingin menyalurkan output program ke log sistem, yang dapat dilakukan dengan perintah logger. linux.die.net/man/1/logger
Avery Payne
@ AveryPayne Jadi suka Runtime.exec("logger ...") OK, terima kasih.
Noumenon
0

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. :)

Michael Martinez
sumber
Saya mungkin akan membuat ini tersedia di sourceforge di beberapa titik. Keunggulannya adalah tapaknya yang sangat kecil, ringan, mudah digunakan, dan dioptimalkan untuk kinerja. Setelah teks pesan dibaca, semua pemrosesan dilakukan dalam buffer memori kemudian ditransfer langsung ke soket.
Michael Martinez
1
xkcd.com/763
user9517
4
Saya mencoba untuk tidak keras, tapi saya saya akan menjadi tumpul: Solusi ini tidak ada karena itu mengerikan. Daripada berinteraksi dengan kelompok lain dalam organisasi Anda dan menerapkan waras solusi, standar Anda telah dilemparkan hack di tempat dengan kode benar-benar tidak didukung bahwa Anda sekarang perlu untuk test / debug / memelihara maju. Anda dengan mudah mengabaikan pengalaman gabungan lebih dari 50 tahun yang memberi tahu Anda "Jangan lakukan itu" - Saya harap ini tidak meledak di wajah Anda, tetapi Anda benar-benar, tidak diragukan lagi, Melakukannya dengan Salah di sini ...
voretaq7
1
ya. benar .... Inilah cara open source bergerak maju, bung. Jika semua orang melakukannya dengan cara Anda, tidak akan ada kemajuan. Menurut Anda bagaimana GNU, Linux, dan semua yang didasarkan padanya muncul? Orang-orang melakukan hal yang saya lakukan di sini. Jika itu membuat Anda merasa lebih baik, saya ingin kode saya ke dalam sistem manajemen paket kami, di mana semua orang di sini di organisasi bebas untuk menggunakannya, menyebarkan, dan memperbaikinya, jika mereka menginginkannya.
Michael Martinez
Dan FYi, itu bukan solusi yang mengerikan. Sebaliknya itu adalah alat yang sangat berguna. Ketika saya mencari solusi online minggu lalu, saya menjumpai orang lain bertanya di mana mereka dapat menemukan fungsi yang tepat ini.
Michael Martinez