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 / 问题 / 1158073
Accepted
Noel Nemeth
Noel Nemeth
Asked: 2024-04-17 17:31:33 +0800 CST2024-04-17 17:31:33 +0800 CST 2024-04-17 17:31:33 +0800 CST

syslog-ng 为 syslog 消息添加前缀

  • 772

我有一个鱿鱼代理将访问日志记录到文件中,syslog-ng 读取这些日志,并根据鱿鱼的操作设置严重性(信息或通知)并将其作为系统日志消息转发到 NetXMS 服务器。问题是 NetXMS 服务器收到如下消息:

1 2024-04-17T11:13:11+02:00 vvsrv-proxy1 1713345191.357 - - [meta sequenceId="5336"]     69 10.30.108.14 TCP_TUNNEL/200 3530 CONNECT api.github.com:443 - HIER_DIRECT/140.82.121.5 -

(空行不是格式错误。)我想将文件中的行按原样转发到 NetXMS,如下所示:

1713345191.357 69 10.30.108.14 TCP_TUNNEL/200 3530 CONNECT api.github.com:443 - HIER_DIRECT/140.82.121.5 -

当前 syslog-ng 配置(不包括默认部分):

source s_squid {
    file ("/var/log/squid/access.log");
};

filter f_squid_denied {
        message ("TCP_DENIED");
};

destination d_squid {
        syslog ("10.0.0.254" transport("udp") port(514) template("${MSG}"));
};

log {
    source (s_squid);
    filter (f_squid_denied);
    rewrite { set_severity("notice"); };
    destination (d_squid);
};

log {
    source (s_squid);                                                                          
    rewrite { set_severity("info"); };
    destination (d_squid);                                                                   
};

版本信息:

syslog-ng 4 (4.1.1)
Config version: 4.0

当我尝试自己解决这个问题时,我发现源中不正确的 syslog 标头可能会导致中继 syslog-ng 服务器添加它自己的标头,但在我的情况下,源是本地文件。我还尝试切换到旧的网络驱动程序 - 而不是系统日志 - 但它仍然是一样的。

当我使用 rsyslog 将系统日志转发到 NetXMS 时,它没有任何额外的数据,因此 NetXMS 会按其应有的方式解析和处理系统日志消息。

更新#1

在深入研究 NetXMS 源代码后,我从日期解析方法中发现它只能解析RFC 3164系统日志消息。在阅读有关使用旧协议的syslog-ng 文档后,我尝试了以下操作:

destination d_squid {
        network ("10.0.0.254" transport(udp) port(514));
};

但它仍然使用新的RFC 5424格式。

更新#2

我正在使用service syslog-ng reload这还不够,重新启动服务后它开始使用 BSD syslog 格式。经过一些调整后,我的目的地现在看起来像这样:

destination d_squid {                                                               
        network ("10.0.0.254" transport(udp) port(514) flags(no-multi-line) template(": ${MSG}"));
};

我没有更改配置的任何其他部分,但现在所有日志条目都具有“通知”严重性,而不是包含TCP_DENIED子字符串的条目。

syslog
  • 2 2 个回答
  • 65 Views

2 个回答

  • Voted
  1. Noel Nemeth
    2024-04-18T16:59:17+08:002024-04-18T16:59:17+08:00

    正确的配置如下所示:

    source s_squid {
        file ("/var/log/squid/access.log" flags(no-parse));
    };
    
    destination d_squid_info {
            network ("10.0.0.254" transport(udp) port(514) flags(no-multi-line) template ("<30> : ${MSG}") persist_name("squid-info"));
    };
    
    destination d_squid_notice {
            network ("10.0.0.254" transport(udp) port(514) flags(no-multi-line) template ("<29> : ${MSG}") persist_name("squid-notice"));
    };
    
    log {
        source (s_squid);
        filter {message("TCP_DENIED")};
        destination (d_squid_notice);
    };
    
    log {
        source (s_squid);
        filter {not message ("TCP_DENIED")};
        destination (d_squid_info);
    };
    

    解决方案是使用模板来格式化整个消息(包括 RFC 3164 标头),但这需要两个“相同”的目的地,因此我必须添加persist_name两个目的地以使其唯一。

    更新:我必须创建两个过滤器,一个匹配的过滤器和一个不匹配的过滤器,TCP_DENIED因为之前的配置为拒绝的消息发送了重复的条目。

    • 1
  2. Best Answer
    bazsi77
    2024-04-18T19:12:20+08:002024-04-18T19:12:20+08:00

    这是一个更紧凑的版本,与我对上一个答案给出的评论一致。

    @version: current
    
    
    source s_squid {
        file ("access.log" flags(no-parse));
    };
    
    destination d_squid {
            network ("10.0.0.254" transport(udp) port(514) flags(no-multi-line) template ("<$PRI> : ${MSG}"));
    };
    
    log {
        source (s_squid);
        rewrite { set-facility("daemon"); };
    
        if (message("TCP_DENIED")){
            rewrite { set-severity("notice"); };
        } else {
            rewrite { set-severity("info"); };
        };
        destination (d_squid);
    };
    

    笔记:

    • 我在这里使用 if() 语句,但这只是围绕过滤器 + flags(final); 的语法糖;
    • 我为两个用例重复使用了相同的文件目标,这更简单。
    • 您现在发送的格式“<$PRI> : $MSG”既不是 RFC3164 也不是 RFC5424 syslog,只是指出它。不幸的是,有很多使用非标准格式的东西。
    • syslog-ng 中的 syslog() 驱动程序专用于 RFC5424 样式输出,这不是您的目的地所期望的。network() 驱动程序基本上是一种传输您想要的任何内容的方法,因为您可以使用 template() 自定义整个消息
    • file() 源通常假定消息格式也与 syslog 格式匹配,您可以使用 flags(no-parse) 正确禁用该格式
    • 1

相关问题

  • 如何将 Windows Server 2008 事件日志发送到 syslog 服务器?

  • 有没有办法过滤系统日志条目?

  • 生成模拟日志消息

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