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

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

rsyslog 的默认行为是将跟踪附加到现存的日志档案。

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

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

笔记:执行 aservice 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 ###

答案1

从rsyslog的POV来看,删除的日志文件仍然存在。这是因为 rsyslog 没有写入文件名,而是写入为日志文件打开的文件句柄。

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

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

重新启动 rsyslogd 也可以。

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

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

答案2

$文件创建模式

这个选项没有达到你想要的效果吗?$文件创建模式

摘抄

$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 参数可用于执行此操作。

摘抄om文件模块

文件

如果文件已存在,则会将新数据附加到其中。现有数据不会被截断。如果该文件尚不存在,则会创建该文件。只要 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'.

相关内容