Rsyslog berhenti mengirim data ke server jauh setelah rotasi log

9

Dalam konfigurasi saya, saya memiliki rsyslog yang bertanggung jawab untuk mengikuti perubahan /home/user/my_app/shared/log/unicorn.stderr.logpenggunaan imfile. Konten dikirim ke server logging jarak jauh lain menggunakan TCP.

Ketika file log diputar, rsyslog berhenti mengirim data ke server jauh.

Saya mencoba memuat ulang rsyslog, mengirim sinyal HUP dan memulai ulang semuanya, tetapi tidak ada yang berhasil.

Satu-satunya cara saya dapat menemukan bahwa itu benar-benar berfungsi adalah kotor:

  • hentikan layanan, hapus file stat rsyslog dan mulai rsyslog lagi. Semua itu di kait postrotate di file logrotate saya.
  • kill -9 rsyslog dan mulai lagi dari awal.

Apakah ada cara yang tepat bagi saya untuk melakukan ini tanpa menyentuh rsyslog internal?

File rsyslog

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ template WithoutTimeFormat, "[environment] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag unicorn-stderr
$ InputFileStateFile stat-unicorn-stderr
$ Info InputFileSeverity
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# Teruskan ke server jauh
jika $ syslogtag mengandung 'apache-' maka @@ my_server: 5000; TanpaTimeFormat
: syslogtag, mengandung, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

File logrotate

/home/user/my_app/shared/log/*.log {
  harian
  missingok
  dateext
  putar 30
  kompres
  pemberitahuan
  ekstensi gz
  copytruncate
  buat 640 pengguna pengguna
  skrip yang dibagikan
  pasca-putar
    (hentikan rsyslog && rm / var / spool / rsyslog / stat- * && mulai rsyslog 2> & 1) || benar
  naskah akhir
}

FYI, file dapat dibaca untuk pengguna rsyslog, server saya dapat dijangkau dan file log lainnya yang tidak diputar pada siklus yang sama terus dilacak dengan benar.

Saya menjalankan Ubuntu 12.04.

Vincent B.
sumber

Jawaban:

8

Masalahnya sebenarnya berasal dari logrotate.

Pada dasarnya dengan konfigurasi saya, menjalankan unicorn, saya tidak perlu menggunakan copytruncatearahan. (yang menyebabkan masalah di sini)

USR1 - Buka kembali semua log yang dimiliki oleh proses pekerja. Lihat Unicorn :: Util.reopen_logs untuk apa yang dianggap sebagai log. File log tidak dibuka kembali sampai selesai memproses permintaan saat ini, jadi beberapa baris log untuk satu permintaan (seperti yang dilakukan oleh Rails) tidak akan dipecah menjadi beberapa log.

Ini mulai berfungsi dengan baik setelah memperbarui ke konfigurasi ini:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}
Vincent B.
sumber
Jika ini adalah salinan langsung dari file Anda, saya pikir masalah Anda sebenarnya adalah bahwa Anda menggunakan post-rotate(yang bukan merupakan hal) sebagai gantinya postrotate, karena skrip logrotate asli yang Anda seharusnya bekerja dengan baik dengan rsyslog (jika skrip postrotate telah berjalan ) ...?
mltsy
2
Saya tidak ingat kapan, tapi aku perubahan post-rotateuntuk lastaction. Komentar Anda masih sangat masuk akal dan mungkin telah memecahkan masalah saya saat itu :). Sebagai catatan, saya akan menghindari menggunakan copytruncatedi masa depan karena itu lambat dan bermain dengan file menangani.
Vincent B.
2

File logrotate Anda berisi entri untuk /home/user/shared/log/*.log, yang tidak cocok dengan file log Anda /home/user/my_app/shared/log/unicorn.stderr.log. Anda perlu menambahkan entri logrotate untuk direktori itu dan memastikannya berisi copytruncate- sebagaimana adanya, rsyslog mengganti nama file saat ini dan membuat yang baru, dan imfile terus mengikuti filehandle dari file yang sekarang diubah namanya.

Jenny D
sumber
Maaf nama filenya hanya salah ketik. Namun copytruncate mungkin merupakan poin yang bagus. Biarkan saya melihat yang satu itu :).
Vincent B.