Wie kann ich rsyslog anweisen, eine Protokolldatei zu erstellen, wenn diese nicht vorhanden ist?


12

Standardmäßig hängt rsyslog Ablaufverfolgungen an eine vorhandene Protokolldatei an.

Jetzt habe ich gesehen (CentOs, Scientific Linux), dass, wenn rsyslog bereits ausgeführt wird, Sie die Protokolldatei löschen (z. B. die, die für die Protokollierung von Traces aus Ihrer Anwendung bestimmt ist), Sie dann Ihre Anwendung ausführen. Rsyslog erstellt keine Protokolldatei und es wird keine Spur aufgezeichnet.

Gibt es eine Konfigurationsoption, die rsyslog anweist, eine Protokolldatei zu erstellen, wenn diese nicht vorhanden ist, bevor Traces an die Datei angehängt werden?

Hinweis : Durch Ausführen von service rsyslog restartwird die Erstellung einer leeren Protokolldatei erzwungen.

rsyslog.conf (nichts hinzugefügt)

# 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 ###

Können Sie Ihre .conf-Datei freigeben?
slm

Antworten:


10

In der POV von rsyslog ist die gelöschte Protokolldatei noch vorhanden. Dies liegt daran, dass rsyslog nicht in den Dateinamen schreibt, sondern in das Dateihandle, das für die Protokolldatei geöffnet ist.

Unix-Systeme löschen eine Datei erst dann, wenn Prozesse mit offenen Handles für die Datei vorhanden sind. Dies bedeutet, dass der von der gelöschten Datei belegte Speicherplatz erst freigegeben wird, wenn alle offenen Datei-Handles geschlossen sind. Dies bedeutet auch, dass Prozesse mit geöffneten Dateihandles für die gelöschte Datei weiterhin aus der Datei lesen und / oder in die Datei schreiben können.

Wenn ein HUP-Signal (z. B. über pkill -HUP rsyslogoder /etc/init.d/rsyslog rotate) an rsyslog gesendet wird, wird dieses aufgefordert, alle geöffneten Dateien zu schließen, die Konfigurationsdatei neu zu laden und alle Protokolldateien zum Schreiben erneut zu öffnen (ggf. zu erstellen).

Das Neustarten von rsyslogd funktioniert ebenfalls.

Beachten Sie, dass dies eine Funktion und kein Fehler ist, der einige nützliche Auswirkungen hat. Beispielsweise schreibt rsyslog auch dann in dieselbe Protokolldatei, wenn es gedreht (dh umbenannt / mv-ed) wurde, bis rsyslog ein HUP-Signal empfängt. Dies bedeutet, dass die Skripte und Dienstprogramme für die Protokollverarbeitung keine gewissenhaften zeitlichen Vorgaben haben müssen. Sie können einfach alle Protokolle drehen, rsyslog ein HUP senden und alles funktioniert weiterhin, ohne dass Protokolldaten verloren gehen.

Übrigens, die einzige Möglichkeit, dass dies mit rsyslog nicht passiert, wäre, dass jede Protokolldatei bei jedem Schreibvorgang geschlossen und erneut geöffnet (oder zumindest aufgerufen sync()) wird. Leistung wäre miserabel.


Wissen Sie, ob ein kill -HUP an rsyslog das Schreiben in eine neue Datei auslöst?
SLM

Sie meinen, wenn rsyslog.conf geändert wurde und eine neue Protokolldatei definiert wurde? Ja, es wird auf jeden Fall eine neue Datei erstellen und mit dem Schreiben beginnen, sobald ein HUP empfangen wird.
cas

OK, das habe ich in meiner dritten Methode vorgeschlagen, danke!
slm

Das Problem ist, dass rsyslog ausgeführt wird. Sie löschen eine Anwendungsprotokolldatei (ohne rsyslog neu zu starten) und dann wird kein Trace mehr protokolliert, da rsyslog die Protokolldatei nicht erstellt, wenn sie nicht ausgeführt wird ...
fduff

1
Wie gesagt, aus dem POV von rsyslog existiert dieses Dateihandle immer noch. es wird nicht schließen und wieder öffnen / neu erstellen , die Protokolldateien , bis Sie ihm sagen , indem es einen Neustart oder mit einem HUP - Signal. rsyslog macht, was Sie ihm sagen, nicht mehr. Noch wichtiger ist, dass das Problem nicht darin besteht, was rsyslog tut, sondern darin, wie Sie das Verhalten von rsyslog verstehen und warum es sich so verhält.
cas

3

$ FileCreateMode

Macht diese Option nicht das, was Sie wollen, $ FileCreateMode ?

Auszug

$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

Dateiausgabemodul

In der Dokumentation zu rsyslog kann dazu das File-Argument des File Output Module verwendet werden.

Auszug Omfile-Modul

Datei

Wenn die Datei bereits vorhanden ist, werden neue Daten an sie angehängt. Vorhandene Daten werden nicht abgeschnitten. Wenn die Datei noch nicht vorhanden ist, wird sie erstellt. Dateien bleiben geöffnet, solange rsyslogd aktiv ist. Dies steht in Konflikt mit der Drehung der externen Protokolldatei. Um eine Datei nach dem Drehen zu schließen, senden Sie rsyslogd ein HUP-Signal, nachdem die Datei weggedreht wurde.

Senden Sie Syslog ein HUP-Signal

Ich denke, letztendlich müssen Sie rsyslog "auslösen", um dies zu tun. Ich denke nicht, dass es das ist, was du automatisch willst. Sie können ihm also ein HUP-Signal geben, um die Neuerstellung der Protokolldatei nach dem Löschen auszulösen.

$ sudo pkill -HUP rsyslog

Dabei wurden die folgenden Meldungen in meiner /var/log/messagesProtokolldatei erstellt:

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

Nein, ich habe es verwendet, um Dateiberechtigungen festzulegen, und das funktioniert einwandfrei. Das Problem ist, dass syslog nicht versucht, die Protokolldatei zu erstellen, bevor msg protokolliert wird, wenn sie entfernt wurde.
Fduff

Es wurde gelöscht und der Server wurde nicht neu gestartet?
SLM

genau. Ich mache einige Tests und bin auf diese Besonderheit
gestoßen

@fduff - siehe meine Updates, probiere das 3. aus!
slm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.