我使用以下 rsyslog 配置文件将程序的日志重定向到特定文件。
# Name of the program
set $.program_name = "myapp";
# Path to the log file
set $.logfile_path = "/var/log/myapp.log";
# Templates
$template log_file, "%$.logfile_path%"
$template datetime_message, "[%timestamp:::date-year%-%timestamp:::date-month%-%timestamp:::date-day%_%timestamp:::date-hour%_%timestamp:::date-minute%_%timestamp:::date-second%.%timestamp:0:3:date-subseconds%]%msg%\n"
# Program log redirection
if( ($programname == $.program_name)) then
{
?log_file;datetime_message
}
由于我没有大量可用存储空间,并且程序会生成大量日志,因此使用 logrotate 定期轮换文件,压缩,然后发送到具有大存储容量的服务器,因此安装的分区/var
永远不会饱和。
它运行得很好,直到我意识到即使日志被重定向到文件,它们也会被发送到/var/log/messages
,/var/log/syslog
和/var/log/user.log
。
因此,日志被复制到四个不同的文件中,其中三个文件没有定期轮换,从而导致分区很快饱和。
我搜索了一种仅将日志发送到的方法,/var/log/myapp.log
但没有找到任何内容。另外我想避免修改/etc/rsyslog.conf
而只修改位于 的特定 rsyslog 配置文件/etc/rsyslog.d/99-myapp.conf
。
我如何告诉 syslog 所有日志myapp
只能发送到/var/log/myapp.log
而不是发送到任何其他文件中?
答案1
选择一条消息并为其提供操作后,您可以通过添加以下stop
操作来停止对该消息的进一步处理:
if( ($programname == $.program_name)) then
{
?log_file;datetime_message
stop
}
如果包含在主配置文件中(例如,使用
$IncludeConfig /etc/rsyslog.d/*.conf
),则可以在您的文件中完成此操作前通常情况下的任何其他操作。查找“丢弃”一词文档。