将转发的 rsyslog 写入 journald 以便能够按 SYSLOG_IDENTIFIER 过滤它们?
Writing forwarded rsyslogs to journald to be able to filter them by SYSLOG_IDENTIFIER?
你好 Whosebug Gods/Regulars/Users !
我目前正在为我的服务器上的两个应用程序运行开发一个日志系统。
这是上下文:
- 服务器 dev1 : Ubuntu 服务器 18.04(全新安装)
- 是运行一个systemd.service算法-ep
[Unit]
Description="Algo EP"
[Service]
Type=simple
User=me
WorkingDirectory=/home/me/bin
ExecStart=/home/me/bin/AlgoEp
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=dev1_algo_ep
[Install]
WantedBy=multi-user.target
- 是运行另一个systemd.service算法-mdw
[Unit]
Description="Algo MDW"
[Service]
Type=simple
User=me
WorkingDirectory=/home/me/bin
ExecStart=/home/me/bin/AlgoMdw
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=dev1_algo_mdw
[Install]
WantedBy=multi-user.target
- 服务器 dev2 : Ubuntu 服务器 18.04(全新安装)
- 是运行一个systemd.service算法-ep
[Unit]
Description="Algo EP"
[Service]
Type=simple
User=me
WorkingDirectory=/home/me/bin
ExecStart=/home/me/bin/AlgoEp
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=dev2_algo_ep
[Install]
WantedBy=multi-user.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
。
所以,我的问题是:有没有神奇的或显而易见的方法
- 使用特定 SYSLOG_IDENTIFIER 从 dev2 导出日志到 dev1 ?
- 或者在 dev1 上接收日志并在将其发送到 journald 之前设置特定的 SYSLOG_IDENTIFIER ?
- 或者只是为了这样做?
提前感谢您的建议、帮助和信息!
[编辑]
rsyslog + journald 的组合似乎鲜为人知。我在手册页中没有找到任何内容(除了可以创建模板以在 dev1 的接收处重建日志,但对我来说看起来很奇怪)。
选项1
因为你已经从 journalctl 获得日志,你可以使用 json 格式来检查你想要的行的字段,例如检查 SYSLOG_IDENTIFIER
字段中的值。
下一行显示SYSLOG_IDENTIFIER
是nginx
,所以你可以使用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 输入模块文档。 imfile
有tag
参数,所以可以用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
文档,omjournal
有一个参数叫做tempalte
,你可以指定你发送给journald
的格式
检查以下文档。
- www.rsyslog.com/doc/v8-stable/configuration/modules/omjournal.html
- www.rsyslog.com/doc/v8-stable/configuration/templates.html
- www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
希望对您有所帮助。
你好 Whosebug Gods/Regulars/Users !
我目前正在为我的服务器上的两个应用程序运行开发一个日志系统。
这是上下文:
- 服务器 dev1 : Ubuntu 服务器 18.04(全新安装)
- 是运行一个systemd.service算法-ep
[Unit] Description="Algo EP" [Service] Type=simple User=me WorkingDirectory=/home/me/bin ExecStart=/home/me/bin/AlgoEp StandardOutput=syslog StandardError=syslog SyslogIdentifier=dev1_algo_ep [Install] WantedBy=multi-user.target
- 是运行另一个systemd.service算法-mdw
[Unit] Description="Algo MDW" [Service] Type=simple User=me WorkingDirectory=/home/me/bin ExecStart=/home/me/bin/AlgoMdw StandardOutput=syslog StandardError=syslog SyslogIdentifier=dev1_algo_mdw [Install] WantedBy=multi-user.target
- 服务器 dev2 : Ubuntu 服务器 18.04(全新安装)
- 是运行一个systemd.service算法-ep
[Unit] Description="Algo EP" [Service] Type=simple User=me WorkingDirectory=/home/me/bin ExecStart=/home/me/bin/AlgoEp StandardOutput=syslog StandardError=syslog SyslogIdentifier=dev2_algo_ep [Install] WantedBy=multi-user.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
。
所以,我的问题是:有没有神奇的或显而易见的方法
- 使用特定 SYSLOG_IDENTIFIER 从 dev2 导出日志到 dev1 ?
- 或者在 dev1 上接收日志并在将其发送到 journald 之前设置特定的 SYSLOG_IDENTIFIER ?
- 或者只是为了这样做?
提前感谢您的建议、帮助和信息!
[编辑] rsyslog + journald 的组合似乎鲜为人知。我在手册页中没有找到任何内容(除了可以创建模板以在 dev1 的接收处重建日志,但对我来说看起来很奇怪)。
选项1
因为你已经从 journalctl 获得日志,你可以使用 json 格式来检查你想要的行的字段,例如检查 SYSLOG_IDENTIFIER
字段中的值。
下一行显示SYSLOG_IDENTIFIER
是nginx
,所以你可以使用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 输入模块文档。 imfile
有tag
参数,所以可以用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
文档,omjournal
有一个参数叫做tempalte
,你可以指定你发送给journald
的格式
检查以下文档。
- www.rsyslog.com/doc/v8-stable/configuration/modules/omjournal.html
- www.rsyslog.com/doc/v8-stable/configuration/templates.html
- www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
希望对您有所帮助。