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 / 问题 / 837585
Accepted
olivierg
olivierg
Asked: 2017-03-11 14:27:00 +0800 CST2017-03-11 14:27:00 +0800 CST 2017-03-11 14:27:00 +0800 CST

无法过滤 syslog-ng 中格式错误的消息

  • 772

我正在就 syslog-NG 的问题与您联系。我们的一些设备(主要是 HP 交换机和 SAN)正在发送似乎不遵守 syslog RFC 5424 的 syslog 消息。

举几个例子:

如果我嗅探服务器的网络接口,我们可以看到这些“错误”消息(如您​​所见,在 PRI 之后,我们可以看到 PROGRAM,然后是时区和用逗号分隔的字段。简而言之,混合字段,缺少字段等不是标准的系统日志消息):

<190>raslogd: 2017/03/08-16:03:20, [SEC-1203], 53642, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4

因此,我目前无法过滤这些消息。我尝试定义一个常规过滤器并尝试打印 MSGHDR、MSG、PRI 等字段,但什么也看不到。

过滤此消息的唯一方法是仅定义外部接口和一个文件作为输出,而无需任何模板。

例如,如果我做这样的过滤器:

destination d_INCOMING_ALL   { file("/app/syslog-ng/logs/incoming_all.log"); };

log {
  source(s_EXTERNAL);
  destination(d_INCOMING_ALL);
};

我可以在日志文件中看到消息,但以某种方式格式化(我想 syslog-NG 重新格式化它们):

[root@xxxxxxxxxxxx logs]# grep -i cswc incoming_all.log
Mar  9 09:44:20 cswc-mo8x-hpsan01 raslogd: 2017/03/09-08:34:50, [SEC-1203], 53647, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
[root@xm1p1034vmo logs]#

问题是我无法像那样过滤这些消息(我们收到来自 1000 多个设备的日志),我需要过滤来自这些设备的消息!我能做到的唯一方法是使用主机名(cswc- )或程序名(raslogd)

所以我尝试通过向该文件添加模板来显示字段,例如:

destination d_test { 
    file ("/app/syslog-ng/logs/test_olivier.log" 
    template("pri=${priority} date=${ISODATE} host=${HOST} program=${PROGRAM} message=${MSG}\n") 
    ); 
};

但没有任何效果,没有显示任何内容。我尝试了所有字段,MSG、MESSAGE、MSGHDR 等。无法管理显示任何内容。唯一有效的是没有过滤器或模板的解析。

自然,如果我尝试了所有类型的过滤器,如下面的这些,它就不起作用(因为字段是混合的):

filter f_is_SAN     {
    host("cswc.*" flags(ignore-case));
};

相同的:

filter f_is_SAN     {
    match(".*cswc.*" flags(ignore-case));
};

关于如何为来自这些设备(主机名或程序名)的这些消息创建过滤器的任何提示?

感谢和问候,

syslog syslog-ng filter
  • 2 2 个回答
  • 1264 Views

2 个回答

  • Voted
  1. iwaseatenbyagrue
    2017-03-25T01:15:14+08:002017-03-25T01:15:14+08:00

    实际上,syslog-ng 并没有重新格式化它们,而是添加了一个适当的 syslog 标头:

    3 月 9 日 09:44:20 cswc-mo8x-hpsan01 raslogd:2017/03/09-08:34:50,[SEC-1203],53647,WWN 10:00:50:eb:1a:6c:21:38 | FID 128,INFO,cswc-mo8x-SAN01,登录信息:TELNET/SSH/RSH登录成功。IP 地址:1.2.3.4

    以下是 syslog 添加的:

    3 月 9 日 09:44:20 cswc-mo8x-hpsan01

    其余的是原始消息:

    raslogd:2017/03/09-08:34:50,[SEC-1203],53647,WWN 10:00:50:eb:1a:6c:21:38 | FID 128,INFO,cswc-mo8x-SAN01,登录信息:TELNET/SSH/RSH登录成功。IP 地址:1.2.3.4

    因此 syslog-ng 同意您的观点,即这些消息不符合 RFC。

    在设置过滤器方面,这意味着您没有太多可玩的了。

    我个人更习惯于 rsyslog(您可以在其中使用正则表达式检查消息,例如寻找raslogd- 尽管这不一定有效)。

    但是,标题 syslog-ng 能够添加给您一些事情要做:

    • 似乎 syslog-ng 能够报告一个主机名,我倾向于假设它是从源 IP 解析的。因此,您至少可以使用主机或网络掩码过滤源 IP :

      filter hp_hosts { (host(192.168.0.25)) };

    • 您当前的主机过滤器失败,因为消息中没有 HOST 字段 -host过滤器状态的文档:

      也就是说,syslog-ng OSE 会将过滤器表达式与 ${HOST} 宏的内容进行比较。

    • 但是,您确实在消息中有一个主机名(至少在您的示例中),因此您可以考虑使用消息过滤器。

    话虽如此 - 对我来说,如果有可能获得所有这些设备的源 IP 列表(我只能为了你的缘故希望这是可能的),那么我会使用网络掩码过滤器 - 它似乎很可能是比其他选项更有效。

    • 1
  2. Best Answer
    olivierg
    2017-03-28T06:45:20+08:002017-03-28T06:45:20+08:00

    嗯,我找到了一个似乎有效的解决方案

    我正在重用“本地副本”目标作为源

    例如:

    我有一个常规的日志过滤器,保留所有内容的副本:

    destination d_INCOMING_ALL       { file("/app/syslog-ng/logs/incoming_all.log"); };
    log {
      source(s_EXTERNAL);
      destination(d_INCOMING_ALL); 
    };
    

    该消息保存在正在重新格式化的“本地副本”中。然后我可以从源中的这个文件重新读取并将过滤器应用到它。它很脏,但它有效:

    source s_NON_RFC_COMPLIANT {   # new source
        file("/app/syslog-ng/logs/incoming_all.log" follow-freq(10));
    };
    
    ....
    
    destination d_INCOMING_ALL {
        file("/app/syslog-ng/logs/incoming_all.log");    # old destination where we keep a local copy of EVERYTHING
    };
    
    ....
    
    log {      # local copy of everything
      source(s_EXTERNAL);
      destination(d_INCOMING_ALL);
    };
    
    ....
    
    other filters here
    
    ....
    
    filter f_is_Network     {
      host("cswc.*" flags(ignore-case))       # we want to filter on hosts called cswc-something or program raslogd
      or program("raslogd" flags(ignore-case));
    };
    
    log {    # new source for HP stuff here
      source(s_NON_RFC_COMPLIANT);
      filter(f_is_Network);              # add the filters you need
      destination(<your_final_destination_here>);
      flags(final);
    };
    
    • 1

相关问题

  • 解释dmesg的输出

  • 您将如何通过公共互联网*安全地*发送系统日志?

  • 如何将 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