【问题标题】:Writing forwarded rsyslogs to journald to be able to filter them by SYSLOG_IDENTIFIER?将转发的 rsyslogs 写入 journald 以便能够通过 SYSLOG_IDENTIFIER 过滤它们?
【发布时间】:2019-08-16 15:18:19
【问题描述】:

您好 StackOverflow 大神/常客/用户!

我目前正在为我的服务器上运行的两个应用程序开发一个日志系统。

这里是上下文:

  • 服务器 dev1:Ubuntu 服务器 18.04(新安装)
    • 正在运行 systemd.service algo-ep
[单元] 说明="算法 EP" [服务] 类型=简单 用户=我 工作目录=/home/me/bin ExecStart=/home/me/bin/AlgoEp 标准输出=系统日志 标准错误=系统日志 SyslogIdentifier=dev1_algo_ep [安装] WantedBy=多用户.target
  • 正在运行另一个 systemd.service algo-mdw
[单元] 描述="算法 MDW" [服务] 类型=简单 用户=我 工作目录=/home/me/bin ExecStart=/home/me/bin/AlgoMdw 标准输出=系统日志 标准错误=系统日志 SyslogIdentifier=dev1_algo_mdw [安装] WantedBy=多用户.target
  • 服务器 dev2:Ubuntu 服务器 18.04(新安装)
    • 正在运行 systemd.service algo-ep
[单元] 说明="算法 EP" [服务] 类型=简单 用户=我 工作目录=/home/me/bin ExecStart=/home/me/bin/AlgoEp 标准输出=系统日志 标准错误=系统日志 SyslogIdentifier=dev2_algo_ep [安装] WantedBy=多用户.target

当我使用 journalctl (systemd-journal) 在 dev1 上 ssh 时,我希望能够读取每个服务的日志。

像这样:journalctl -t dev1_algo_ep -t dev1_algo_mdw -t dev2_algo_ep

所以,我在 dev2 上添加了 rsyslog.d/algo-ep.conf

if $programname == 'dev2_algo_ep' then {          
        action(type="omfwd"                       
           queue.type="linkedlist"                
           queue.filename="algo_fwd"              
           queue.saveOnShutdown="on"              
           action.resumeRetryCount="-1"           
           target="dev1" port="514" protocol="tcp"
        )
}

并在 dev1 上添加了rsyslog.d/algo.conf

module(load="imtcp")
module(load="omjournal")

ruleset(name="remote-dev2") {
        action(type="omjournal")
}

input(type="imtcp" port="514" ruleset="remote-dev2")

此时,没问题,我在journalctl中得到了journalctl -r的行:

Nov 23 13:27:47 dev1 dev2_algo_ep[3142]:[15246]:  Ep Server listening on localhost:10001...
Nov 23 13:27:47 dev1 dev2_algo_ep[2421]:[15246]:  Ep Server stops...
[...]

但是当我尝试journalctl -t dev2_algo_ep:

me@dev1:~$ journalctl -t dev2_algo_ep
-- Logs begin at Fri 2018-06-01 13:54:11 CEST, end at Fri 2018-11-23 13:27:47 CET. --
me@dev1:~$

因为收到日志的 SYSLOG_IDENTIFIER 设置为 dev2_algo_ep[3142]: 而不是 dev2_algo_ep

所以,我的问题:有没有办法,神奇或明显

  1. 使用特定的 SYSLOG_IDENTIFIER 将日志从 dev2 导出到 dev1?
  2. 还是在 dev1 上接收日志并在将其发送到 journald 之前设置特定的 SYSLOG_IDENTIFIER?
  3. 或者只是为了这样做?

提前感谢您的建议、帮助和信息!

[编辑] 似乎混合 rsyslog + journald 鲜为人知。我在手册页中没有找到任何内容(除了可以在 dev1 的接待处创建模板来重建日志的可能性,但对我来说看起来很奇怪)。

【问题讨论】:

    标签: logging systemd ubuntu-server rsyslog systemd-journald


    【解决方案1】:

    选项1 由于您已经从 journalctl 获得了日志,因此您可以使用 json 格式来检查您想要的行的字段,例如检查SYSLOG_IDENTIFIER 字段中的值。

    下面一行显示SYSLOG_IDENTIFIERnginx,所以你可以使用journalctl -t nginx

    journalctl -o json
    { "__CURSOR" : "s=00000000000000000000000000000000;i=146c8;b=170127f0cd5441a3bea76fe326915bd0;m=bb5bba879;t=590367fad5ace;x=33cdab5cd2077705", "__REALTIME_TIMESTAMP" : "1565938628254414", "__MONOTONIC_TIMESTAMP" : "50293614713", "_BOOT_ID" : "170127f0cd5441a3bea76fe326915bd0", "_SELINUX_CONTEXT" : "unconfined\n", "_SYSTEMD_SLICE" : "system.slice", "_MACHINE_ID" : "4211ff3f594041f3966d836585a11a05", "_HOSTNAME" : "VM-0-4-ubuntu", "_TRANSPORT" : "journal", "_CAP_EFFECTIVE" : "0", "PRIORITY" : "5", "_UID" : "102", "_GID" : "106", "_COMM" : "rsyslogd", "_EXE" : "/usr/sbin/rsyslogd", "_CMDLINE" : "/usr/sbin/rsyslogd -n", "_SYSTEMD_CGROUP" : "/system.slice/rsyslog.service", "_SYSTEMD_UNIT" : "rsyslog.service", "_PID" : "3280", "_SYSTEMD_INVOCATION_ID" : "270801fdff7943bc83cd7cef242b3271", "CODE_FILE" : "omjournal.c", "CODE_LINE" : "270", "CODE_FUNC" : "send_non_template_message", "SYSLOG_FACILITY" : "16", "SYSLOG_IDENTIFIER" : "nginx", "MESSAGE" : "36.24.73.111 - - [16/Aug/2019:14:57:08 +0800] \"GET /favicon.ico HTTP/1.1\" 200 946 \"http://111.231.88.233/todo\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36\"", "_SOURCE_REALTIME_TIMESTAMP" : "1565938628254404" }
    

    选项2 如果找不到SYSLOG_IDENTIFIER,请检查 rsyslog 输入模块文档。 imfiletag 参数,所以你可以使用journalctl -t nginx 来获取日志。 检查以下示例

    module(load="imfile")
    module(load="omjournal")
    
    ruleset(name="nginx") {
        action(type="omjournal")
    }
    
    input(
        type="imfile"
        File="/var/log/nginx/access.log"
        tag="nginx"
        ruleset="nginx")
    

    选项3

    你需要检查omjournal doc,omjournal有一个参数叫tempalte,你可以指定你发送给journald的格式 检查以下文档。

    1. www.rsyslog.com/doc/v8-stable/configuration/modules/omjournal.html
    2. www.rsyslog.com/doc/v8-stable/configuration/templates.html
    3. www.freedesktop.org/software/systemd/man/systemd.journal-fields.html

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答!您的 option2 正是我所需要的。
    猜你喜欢
    • 2021-08-12
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多