Bagaimana cara memberitahu rsyslog untuk membuat file log jika tidak ada?

12

Perilaku default oleh rsyslog adalah untuk menambahkan jejak ke yang sudah ada file log yang .

Sekarang, saya telah melihat (CentOs, Scientific Linux) bahwa ketika rsyslog sudah berjalan, Anda menghapus file log (misalnya yang didedikasikan untuk melacak log dari aplikasi Anda), Anda kemudian menjalankan aplikasi Anda, rsyslog tidak akan membuat file log dan tidak ada jejak yang akan direkam.

Apakah ada opsi konfigurasi entah bagaimana yang dapat memberitahu rsyslog untuk membuat file log jika tidak ada sebelum menambahkan jejak ke sana?

Catatan : melakukan service rsyslog restarttekad memaksa pembuatan file log kosong.

rsyslog.conf (tidak ada yang ditambahkan)

# rsyslog v5 configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability

$SystemLogRateLimitInterval 1
$SystemLogRateLimitBurst 50000

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$WorkDirectory /var/lib/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###
fduff
sumber
Bisakah Anda membagikan file .conf Anda?
slm

Jawaban:

10

Dari rsyslog's POV, file log yang dihapus masih ada. Ini karena rsyslog tidak menulis ke nama file, itu menulis ke file yang dibuka untuk file log.

Sistem Unix tidak benar-benar menghapus file sampai tidak ada proses dengan pegangan terbuka ke file. Ini berarti bahwa ruang disk yang digunakan oleh file yang dihapus tidak dibebaskan sampai semua dan semua pegangan file yang terbuka ditutup. Ini juga berarti bahwa setiap proses dengan pegangan file terbuka ke file yang dihapus dapat melanjutkan membaca dari dan / atau menulis ke file.

Mengirim sinyal HUP (mis. Via pkill -HUP rsyslogatau /etc/init.d/rsyslog rotate) ke rsyslog memberitahukannya untuk menutup semua file yang dibuka, memuat ulang file konfignya, dan membuka kembali semua file log untuk menulis (membuatnya jika perlu).

Restart rsyslogd juga berfungsi.

Perhatikan bahwa ini adalah fitur, bukan bug, dengan beberapa implikasi berguna - misalnya itu sebabnya rsyslog terus menulis ke file log yang sama bahkan setelah diputar (mis. Berganti nama / mv-red) sampai rsyslog menerima sinyal HUP. Ini berarti bahwa skrip & utilitas pemrosesan log tidak harus sangat berhati-hati dalam menentukan waktu - mereka hanya dapat memutar semua log, mengirim rsyslog HUP, dan semuanya terus bekerja, tanpa kehilangan data log.

BTW, satu-satunya cara agar hal ini tidak terjadi dengan rsyslog adalah dengan menutup dan membuka kembali setiap file log pada setiap penulisan (atau setidaknya disebut sync()). Kinerja akan sangat buruk.

cas
sumber
Apakah Anda tahu jika sebuah kill -HUP ke rsyslog akan memicunya untuk mulai menulis ke file baru?
slm
maksud Anda, jika rsyslog.conf telah berubah dan ada file log baru yang ditentukan? ya, itu pasti akan membuat dan mulai menulis ke file baru tentang menerima HUP ... itu bagian dari titik itu memuat ulang konfigurasi.
cas
OK, itulah yang saya sarankan dalam metode ke-3 saya, terima kasih!
slm
masalahnya adalah rsyslog sedang berjalan, Anda menghapus file log aplikasi (tanpa memulai ulang rsyslog) dan kemudian tidak ada lagi jejak yang akan dicatat karena rsyslog tidak akan membuat file log jika tidak ada ketika sedang berjalan ...
fduff
1
seperti yang saya katakan, dari rsyslog's POV, file handle itu masih ada. itu tidak akan menutup dan membuka kembali / membuat kembali file log sampai Anda menyuruhnya dengan me-restart atau dengan sinyal HUP. rsyslog melakukan apa yang Anda suruh, jangan lagi. yang lebih penting, masalahnya bukan pada apa yang dilakukan rsyslog, tetapi dalam pemahaman Anda tentang perilaku rsyslog dan mengapa berperilaku seperti itu.
cas
3

$ FileCreateMode

Apakah opsi ini tidak melakukan apa yang Anda inginkan, $ FileCreateMode ?

kutipan

$FileCreateMode 0600

This sample lets rsyslog create files with read and write access only for the 
users it runs under.

The following sample is deemed to be a complete rsyslog.conf:

$umask 0000 # make sure nothing interferes with the following definitions
*.* /var/log/file-with-0644-default
$FileCreateMode 0600
*.* /var/log/file-with-0600
$FileCreateMode 0644

*.* /var/log/file-with-0644

Modul Output File

Menurut dokumentasi rsyslog, argumen File dari Modul Output File dapat digunakan untuk melakukan ini.

kutipan modul omfile

Mengajukan

Jika file sudah ada, data baru ditambahkan ke sana. Data yang ada tidak terpotong. Jika file belum ada, itu dibuat. File tetap terbuka selama rsyslogd aktif. Ini bertentangan dengan rotasi file log eksternal. Untuk menutup file setelah rotasi, kirim rsyslogd sinyal HUP setelah file diputar.

Kirim syslog sinyal HUP

Saya pikir pada akhirnya Anda perlu "memicu" rsyslog untuk melakukan ini. Saya tidak berpikir itu akan apa yang Anda inginkan secara otomatis. Jadi Anda bisa memberikannya sinyal HUP untuk memicu pembuatan kembali file log setelah dihapus.

$ sudo pkill -HUP rsyslog

Melakukan hal itu membuat pesan berikut dalam /var/log/messagesfile log saya :

Sep 26 15:16:17 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Sep 26 15:16:44 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
slm
sumber
Tidak, saya sudah menggunakannya untuk mengatur izin file dan itu berfungsi dengan baik. Masalahnya adalah bahwa jika file log telah dihapus, syslog tidak akan mencoba membuatnya sebelum mencatat pesan.
fduff
Sudah dihapus, dan server belum dihidupkan ulang?
slm
persis. Saya sedang melakukan beberapa tes dan menemukan
spesifisitas
@fduff - lihat pembaruan saya, coba yang ke-3!
slm