AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1165289
Accepted
CornBouyed
CornBouyed
Asked: 2024-09-16 18:03:01 +0800 CST2024-09-16 18:03:01 +0800 CST 2024-09-16 18:03:01 +0800 CST

为什么 rsyslog 会记录来自 systemd 日志的重复消息?

  • 772

为什么 rsyslog 可能会记录来自 systemd 日志的重复消息?

我知道有关 systemd 日志损坏的已知问题(请参阅此处“目的”部分下的警告: https: //www.rsyslog.com/doc/configuration/modules/imjournal.html),但我不认为这是我遇到的问题。我正在运行 Ubuntu 24.04、rsyslog 8.2312.0-3ubuntu9 和 systemd 255.4-1ubuntu8.4。

我有多个主机运行名为“foobar”的应用程序作为 systemd 服务,并记录到 systemd 日志中。我还运行 rsyslog 作为 systemd 服务,它配置为将 JSON 格式的 foobar 日志从 systemd 日志转发到中央日志服务器。每个主机上的 rsyslog 配置如下:

module(load="imjournal" StateFile="journalState" IgnorePreviousMessages="on")
module(load="mmjsonparse")
    
template(name="foobarJSON" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" )

if $syslogfacility-text == "user" and $programname == "foobar" then {
    user.* action(type="omfwd" target="central-logs.server" port="514" protocol="tcp" template="foobarJSON")
}

我还在中央日志服务器上将 rsyslog 作为 systemd 服务运行,并将来自每个服务器的 foobar 日志写入每个主机单独子目录内的本地文件。此主机上的 rsyslog 配置如下:

module(load="imtcp")
input(type="imtcp" address="123.456.789.0" port="514")

template(name="foobarHostLogs" type="string" string="/var/logs/%PROGRAMNAME%/%HOSTNAME%/%$year%/%$month%/%$day%.log")

module(load="builtin:omfile" DirCreateMode="0755")

if $fromhost-ip != '127.0.0.1' then {
    action(type="omfile" dynaFile="foobarHostLogs")

    & stop
}

在任何 foobar 主机上运行 journalctl -u foobar 时,我都看不到任何重复的消息。但是,在查看中央日志服务器上的日志文件时,我发现每条消息都是重复的:至少有一条消息仅包含来自 systemd 日志的“msg”字段(尽管有时我会看到两行相同的消息仅包含“msg”),紧接着是一行具有完全相同的时间戳和“msg”值以及来自 systemd 日志的所有其他元数据字段。

例如(我从下面的第二行删除了几个多余的字段,但希望您明白我的意思):

2024-09-15T00:00:00+00:00 host-a foobar[123456]: @cee: { "msg": "Hello, world!" }
2024-09-15T00:00:00+00:00 host-a foobar[123456]: @cee: { "_TRANSPORT": "journal", "_PID": "123456", "_UID": "1000", "_GID": "1000", "_COMM": "foobar", "_EXE": "\/usr\/local\/bin\/foobar", "_CMDLINE": ".\/foobar", "_CAP_EFFECTIVE": "0", "_SELINUX_CONTEXT": "unconfined\n", "MESSAGE": "Hello, world!", "msg": "Hello, world!" }
rsyslog
  • 2 2 个回答
  • 65 Views

2 个回答

  • Voted
  1. u1686_grawity
    2024-09-16T22:06:02+08:002024-09-16T22:06:02+08:00

    听起来你可能在客户端主机上配置了两种syslog 转发方法——除了通过 imjournal 读取日志(提供所有元数据)之外,它还可能通过 /run/systemd 中的 imuxsock 接收相同的日志(没有元数据的传统转发方法)。确保ForwardToSyslog=在你的 journald.conf 中禁用。

    • 0
  2. Best Answer
    CornBouyed
    2024-10-18T15:46:30+08:002024-10-18T15:46:30+08:00

    好的,我能够弄明白。@u1686_grawity 是正确的,根本原因是 rsyslog 使用imuxsock和imjournal输入模块从 systemd 日志读取消息,但简单地禁用并ForwardtoSyslog不足以journald阻止重复。

    相反,我必须通过将条件添加到原始 if 子句来配置 rsyslog 以仅将从imjournal中央日志服务器收到的消息转发,即:$inputname == "imjournal"

    module(load="imjournal" StateFile="journalState" IgnorePreviousMessages="on")
    module(load="mmjsonparse")
        
    template(name="foobarJSON" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" )
    
    if $inputname == "imjournal" and $syslogfacility-text == "user" and $programname == "foobar" then {
        action(type="mmjsonparse")
        user.* action(type="omfwd" target="central-logs.server" port="514" protocol="tcp" template="foobarJSON")
    }
    

    另外,我弄清楚了为什么我会收到这些空消息:我忘记实际调用mmjsonparse操作来解析结构化日志消息并从日志消息中获取所有单独的字段,所以我也将该行添加到上面的工作配置示例中。

    • 0

相关问题

  • rsyslog 会从不可用的 unix 域套接字中恢复吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve