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

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

Das Standardverhalten von rsyslog besteht darin, Spuren an einebestehendeLogdatei.

Ich habe gesehen (CentOs, Scientific Linux), dass, wenn rsyslog bereits läuft, man die Logdatei löscht (z.B. die, die für die Protokollierung von Traces aus der Anwendung vorgesehen ist), dann die Anwendung ausführt, rsyslogwird nichtErstellen Sie eine Protokolldatei und es wird keine Ablaufverfolgung aufgezeichnet.

Gibt es irgendwie eine Konfigurationsoption, die rsyslog anweisen kann, eine Protokolldatei zu erstellen, wenn diese nicht vorhanden ist, bevor Traces daran angehängt werden?

Notiz: Dadurch 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 ###

Antwort1

Aus Sicht von rsyslog existiert die gelöschte Protokolldatei noch immer. Dies liegt daran, dass rsyslog nicht in den Dateinamen schreibt, sondern in den Datei-Handle, den es für die Protokolldatei geöffnet hat.

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

Wenn Sie ein HUP-Signal (z. B. über pkill -HUP rsyslogoder /etc/init.d/rsyslog rotate) an rsyslog senden, weist Sie das Programm an, alle geöffneten Dateien zu schließen, die Konfigurationsdatei neu zu laden und alle Protokolldateien erneut zum Schreiben zu öffnen (und sie bei Bedarf zu erstellen).

Ein Neustart von rsyslogd funktioniert auch.

Beachten Sie, dass dies eine Funktion und kein Fehler ist, mit einigen nützlichen Auswirkungen – z. B. ist dies der Grund, warum rsyslog weiterhin in dieselbe Protokolldatei schreibt, selbst nachdem sie rotiert (d. h. umbenannt/mv-ed) wurde, bis rsyslog ein HUP-Signal empfängt. Dies bedeutet, dass Protokollverarbeitungsskripte und -programme nicht peinlich genau auf das Timing achten müssen – sie können einfach alle Protokolle rotieren, rsyslog ein HUP senden und alles funktioniert weiter, ohne dass Protokolldaten verloren gehen.

Übrigens, die einzige Möglichkeit, dies mit rsyslog zu vermeiden, besteht darin, bei jedem Schreiben jede Protokolldatei zu schließen und neu zu öffnen (oder zumindest aufzurufen sync()). Die Leistung wäre miserabel.

Antwort2

$FileCreateMode

Erfüllt diese Option nicht Ihren Zweck?$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

Laut der rsyslog-Dokumentation könnte hierfür das File-Argument des File Output Module verwendet werden.

Auszugomfile-Modul

Datei

Wenn die Datei bereits existiert, werden neue Daten angehängt. Vorhandene Daten werden nicht abgeschnitten. Wenn die Datei noch nicht existiert, wird sie erstellt. Dateien bleiben geöffnet, solange rsyslogd aktiv ist. Dies steht im Konflikt mit der externen Protokolldateirotation. Um eine Datei nach der Rotation zu schließen, senden Sie rsyslogd ein HUP-Signal, nachdem die Datei rotiert wurde.

Senden Sie dem Syslog ein HUP-Signal

Ich denke, letztendlich müssen Sie rsyslog „auslösen“, um dies zu tun. Ich glaube nicht, dass es automatisch das tut, was Sie wollen. Sie könnten ihm also ein HUP-Signal geben, um die Neuerstellung der Protokolldatei nach ihrer Löschung auszulösen.

$ sudo pkill -HUP rsyslog

Dadurch wurden in meiner /var/log/messagesProtokolldatei die folgenden Meldungen 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'.

verwandte Informationen