如果不存在,如何告诉rsyslog创建日志文件?


12

rsyslog的默认行为是将跟踪追加到现有的日志文件。

现在,我已经看到(CentOs,Scientific Linux),当rsyslog已经运行时,您删除日志文件(例如,一个专用于从应用程序进行日志跟踪的文件),然后运行您的应用程序,rsyslog 将不会创建日志文件并且不会记录任何跟踪。

是否有某种配置选项可以告诉rsyslog在添加跟踪文件之前创建日志文件(如果不存在)?

注意:执行a service rsyslog restart将强制创建一个空的日志文件。

rsyslog.conf(未添加任何内容)

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

可以共享您的.conf文件吗?
slm

Answers:


10

从rsyslog的POV中,删除的日志文件仍然存在。这是因为rsyslog不会写入文件名,而是写入已为日志文件打开的文件句柄。

Unix系统实际上不会删除文件,直到没有打开该文件句柄的进程为止。这意味着在关闭所有打开的文件句柄之前,不会释放已删除文件使用的磁盘空间。这也意味着,任何具有已删除文件的打开文件句柄的进程都可以继续读取和/或写入文件。

向rsyslog发送HUP信号(例如通过pkill -HUP rsyslog/etc/init.d/rsyslog rotate),告诉它关闭所有打开的文件,重新加载其配置文件,然后重新打开所有日志文件以进行写入(必要时创建它们)。

重新启动rsyslogd也可以。

请注意,这是一个功能,而不是错误,具有一些有用的含义-例如,这就是为什么rsyslog即使在旋转(即重命名/ mv-ed)后,仍会继续写入同一日志文件,直到rsyslog收到HUP信号为止。这意味着日志处理脚本和实用程序不必在时间上格外小心-它们只需旋转所有日志,向rsyslog发送HUP,一切就可以继续工作,而不会丢失日志数据。

顺便说一句,rsyslog不会发生这种情况的唯一方法是在每次写入(或至少调用sync())时关闭并重新打开每个日志文件。表现将很糟糕。


您是否知道立即关闭rsyslog的kill -HUP会触发它开始写入新文件?
slm

您的意思是,如果rsyslog.conf已更改,并且定义了新的日志文件?是的,它肯定会在接收到HUP之后创建并开始写入新文件...这是重新加载配置的一部分。
cas 2013年

好的,这就是我在第三种方法中提出的建议,谢谢!
slm

问题是rsyslog正在运行,您删除了应用程序日志文件(无需重新启动rsyslog),然后不再记录任何跟踪信息,因为
rsyslog

1
如我所说,从rsyslog的POV看,该文件句柄仍然存在。它不会关闭并重新打开/重新创建日志文件,直到您通过重新启动或使用HUP信号告知它为止。rsyslog仅执行您要执行的操作。更重要的是,问题不在于rsyslog的功能,而在于您对rsyslog的行为及其行为的理解。
cas

3

$ FileCreateMode

$ FileCreateMode这个选项不会做您想要的吗?

摘抄

$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

文件输出模块

根据rsyslog文档,可以使用文件输出模块的File参数来执行此操作。

摘录omfile模块

文件

如果文件已存在,则将新数据附加到该文件。现有数据不会被截断。如果该文件尚不存在,则会创建它。只要rsyslogd处于活动状态,文件就保持打开状态。这与外部日志文件轮换冲突。为了在旋转后关闭文件,请在旋转文件后向rsyslogd发送HUP信号。

向系统日志发送HUP信号

我认为最终您需要“触发” rsyslog来执行此操作。我认为这不会自动满足您的需求。因此,您可以为它提供一个HUP信号,以在删除日志文件后触发日志文件的重新创建。

$ sudo pkill -HUP rsyslog

这样做在我的/var/log/messages日志文件中创建了以下消息:

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

不,我用它来设置文件权限,并且可以正常工作。问题是,如果已删除日志文件,则syslog在记录msg之前不会尝试创建它。
fduff 2013年

它已被删除,并且服务器还没有重新启动?
slm

究竟。我正在做一些测试,遇到了这种特殊情况……
fduff 2013年

@fduff-查看我的更新,尝试第三个!
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.