如何告诉 syslog 将自定义应用程序的日志发送到单独的文件而不是发送到 /var/log/syslog 而不更改 /etc/syslog-ng/syslog-ng.conf?

如何告诉 syslog 将自定义应用程序的日志发送到单独的文件而不是发送到 /var/log/syslog 而不更改 /etc/syslog-ng/syslog-ng.conf?

如何告诉 syslog 将自定义应用程序的日志发送到单独的文件而不是发送到 /var/log/syslog 而不更改 /etc/syslog-ng/syslog-ng.conf?

我有一个自定义应用程序,用于将消息发送到 syslog 的 local3 设施。由于此应用程序发送的每条消息都以“[myapp]”开头,因此我编写了此配置以登录到单独的文件中:

/etc/syslog-ng/conf.d/myapp.conf 的内容:

filter f_myapp { facility(local3) and match("[myapp]"); };

destination d_myapp {
    file("/var/log/myapp/myapp.log" create_dirs(yes));
};

log {
    source(s_src);
    filter(f_myapp);
    destination(d_myapp);
};

而且它运行良好:消息进入 /var/log/myapp/myapp.log

,它们还会进入 /var/log/syslog 和 /var/log/messages

为了避免这种情况,我们可以编辑 /etc/syslog-ng/syslog-ng.conf 并添加“and not filter(f_myapp)”到 filter f_messages {...} 和 filter f_syslog3 {...}

好的,但这是手动任务。假设我们想自动执行许多应用程序的日志配置...

有没有办法在不改变 /etc/syslog-ng/syslog-ng.conf 中的任何内容的情况下进行这种排除,仅使用 /etc/syslog-ng/conf.d/ ?

答案1

在 syslog-ng 中,日志路径决定消息的处理方式。

默认情况下,每个日志路径都会接收来自日志路径中包含的源的每条消息,并且 syslog-ng 会按照它们在配置文件中出现的顺序处理每个日志路径。

您可以使用日志路径中的 flags() 选项来更改此行为(有关详细信息,请参阅syslog-ng 日志标志)。

要仅在特定的日志路径中处理消息,您必须:

  • 使用日志路径中的最后一个标志

    log {
    source(s_src);
    filter(f_myapp);
    destination(d_myapp);
    flags(final)
    };
    
  • 确保在你的 syslog-ng.conf 文件中,这是处理此消息的第一个日志路径。你的 syslog-ng.conf 配置文件中可能存在如下一行:

    @include "/etc/syslog-ng/conf.d/*.conf"
    

    确保它出现在其他日志路径之前。(如果 conf.d 目录中还有其他文件,这可能会干扰其他文件,在这种情况下,请将 myapp.conf 文件移到其他位置,并仅在顶部包含此文件。)

相关内容