gpt4 book ai didi

linux - 使用 rsyslog 捕获 journald 属性

转载 作者:行者123 更新时间:2023-12-05 08:10:32 26 4
gpt4 key购买 nike

我正在努力研究如何将 systemd-journald 属性捕获到 rsyslog 文件中。

我的设置

  • ubuntu inside docker on arm (raspberrypi):FROM arm64v8/ubuntu:20.04

  • docker 命令(在运行的 docker 容器内执行的所有后续操作)

     $ docker run --privileged -ti --cap-add SYS_ADMIN --security-opt seccomp=unconfined --cgroup-parent=docker.slice --cgroupns private --tmpfs /tmp --tmpfs /run --tmpfs /run/lock systemd:origin
  • rsyslog $ sytemctl status rsyslog

     ● rsyslog.service - System Logging Service
    Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor prese>
    Active: active (running)
    ...
    [origin software="rsyslogd" swVersion="8.2001.0" x-pid="39758" x-info="https://www.rsyslog.com"] start
    ...

我的计划

有一个小的 c 程序将一些信息放入日志中:

    #include <systemd/sd-journal.h>
#include <stdio.h>
#include <unistd.h>

int main(int arcg, char** args) {
char buffer [50];

sprintf (buffer, "%lu", (unsigned long)getpid());

printf("writing to journal\n");

sd_journal_print(LOG_WARNING, "%s", "a little journal test message");
sd_journal_send("MESSAGE=%s", "there shoud be a text", "SYSLOG_PID=%s", buffer, "PRIORITY=%i", LOG_ERR, "DOCUMENTATION=%s", "any doc link", "MESSAGE_ID=%s", "e5e4132e441541f89bca0cc3e7be3381", "MEAS_VAL=%d", 1394, NULL);

return 0;
}

编译它:$ gcc joutest.c -lsystemd -o jt

执行它:$ ./jt

日志中的结果为 $ journalctl -r -o json-pretty:

    {
"_GID" : "0",
"MESSAGE" : "there shoud be a text",
"_HOSTNAME" : "f1aad951c039",
"SYSLOG_IDENTIFIER" : "jt",
"_TRANSPORT" : "journal",
"CODE_FILE" : "joutest.c",
"DOCUMENTATION" : "any doc link",
"_BOOT_ID" : "06a36b314cee462591c65a2703c8b2ad",
"CODE_LINE" : "14",
"MESSAGE_ID" : "e5e4132e441541f89bca0cc3e7be3381",
"_CAP_EFFECTIVE" : "3fffffffff",
"__REALTIME_TIMESTAMP" : "1669373862349599",
"_SYSTEMD_UNIT" : "init.scope",
"CODE_FUNC" : "main",
"_MACHINE_ID" : "5aba31746bf244bba6081297fe061445",
"SYSLOG_PID" : "39740",
"PRIORITY" : "3",
"_COMM" : "jt",
"_SYSTEMD_SLICE" : "-.slice",
"MEAS_VAL" : "1394",
"__MONOTONIC_TIMESTAMP" : "390853282189",
"_PID" : "39740",
"_SOURCE_REALTIME_TIMESTAMP" : "1669373862336503",
"_UID" : "0",
"_SYSTEMD_CGROUP" : "/init.scope",
"__CURSOR" : "s=63a46a30bbbb4b8c9288a9b12c622b37;i=6cb;b=06a36b314cee46>
}

现在作为测试,通过 rsyslog 从该日志条目中提取所有属性; rsyslog 的行话中的属性原则上是格式化的 json 条目中的键的名称。但是,如果一个属性(或键名)匹配,则应捕获整个字典项(键和值)

首先,我将 rsyslog 配置为:

    module(load="imjournal")
module(load="mmjsonparse")

action(type="mmjsonparse")

if $programname == 'jt' and $syslogseverity == 3 then
action(type="omfile" file="/var/log/jt_err.log" template="RSYSLOG_DebugFormat")

此配置位于 /etc/rsyslog.d/filter.conf 并自动包含在 /etc/rsyslog.conf 中:

    # /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

#module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

应用此配置:$ systemctl restart rsyslog

结果如下:$ cat/var/log/jt_err.log

    Debug line with all properties:
FROMHOST: 'f1aad951c039', fromhost-ip: '127.0.0.1', HOSTNAME:
'f1aad951c039', PRI: 11,
syslogtag 'jt[39765]:', programname: 'jt', APP-NAME: 'jt', PROCID:
'39765', MSGID: '-',
TIMESTAMP: 'Nov 25 11:47:50', STRUCTURED-DATA: '-',
msg: ' there shoud be a text'
escaped msg: ' there shoud be a text'
inputname: imuxsock rawmsg: '<11>Nov 25 11:47:50 jt[39765]: there
shoud be a text'
$!:{ "msg": "there shoud be a text" }
$.:
$/:

我的问题

查看生成的 rsyslog,我错过了大部分(如果不是全部)源自日记条目的项目。确实没有属性(键)匹配。不应该所有属性都匹配,因为它是调试输出?

具体来说,我专注于我的自定义属性 MEAS_VAL,它不存在。出现的唯一属性是“msg”,顺便说一句,它是否与日志匹配是值得怀疑的,因为附加到结果内容的原始属性名称 “应该有一个文本”消息

所以感觉完全没有打到整个journal捕获机制,为什么?

我们能确定 imjournal 被正确加载了吗?

我会说是,因为 systemd 的 启动消息:

    Nov 28 16:27:38 f1aad951c039 rsyslogd[144703]: imjournal: Journal indicates no msgs when positioned at head.  [v8.2212.0.master try https://www.rsyslog.com/e/0 ]
Nov 28 16:27:38 f1aad951c039 rsyslogd[144703]: imjournal: journal files changed, reloading... [v8.2212.0.master try https://www.rsyslog.com/e/0 ]
Nov 28 16:27:38 f1aad951c039 rsyslogd[144703]: imjournal: Journal indicates no msgs when positioned at head. [v8.2212.0.master try https://www.rsyslog.com/e/0 ]

编辑 2022-11-29

与此同时,我编译了自己的版本 8.2212.0.master。但这种现象仍然存在。

最佳答案

您丢失了大部分源自日志的项目,因为模板 RSYSLOG_DebugFormatRSYSLOG_TraditionalFileFormat 都没有所需的属性(参见 Reserved template names )。但是,RSYSLOG_DebugFormat 至少包含一些字段,例如procidmsgidstructured-data - 可以在您提供的输出中看到。

这意味着,如果您想包含所有字段,则必须创建自己的模板。

日志字段存储在键值对中。 imjournal 模块能够解析这些键值对并生成 jsonf 属性,然后可用于访问日志消息的字段,就好像它们是 JSON 对象中的字段一样。

# load imjournal module
module(load="imjournal")

# specify journal as input source
input(type="imjournal")

template(name="journalTemplate" type="list") {
property(name="timestamp" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag")
constant(value=": {")
property(name="jsonf")
constant(value="}")
}

if $programname == 'jt' and $syslogseverity == 3 then {
action(type="omfile" file="/var/log/jt_err.log" template="journalTemplate")
stop
}

所提供日志的输出将如下所示:

YYYY-MM-DDTHH:mm:ss myHostname syslogtag: {"_GID" : "0", "MESSAGE" : "there shoud be a text", ... }

如上面的日志所示,提供的属性的输出将采用 JSON 格式。通过使用 json 属性解析器可以避免这种情况,因为可以根据需要调整输出。但是,如果使用它,则必须专门定义每个属性。

template(name="journalTemplate" type="list") {
property(name="timestamp" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag")
constant(value=": _GID=")
property(name="$._GID" format="json")
constant(value=" MESSAGE=")
property(name="$.MESSAGE" format="json")
constant(value=" _HOSTNAME=")
property(name="$._HOSTNAME" format="json")
...
}

关于linux - 使用 rsyslog 捕获 journald 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74575135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com