【问题标题】:How to set source host address in Python Logging?如何在 Python Logging 中设置源主机地址?
【发布时间】:2012-08-15 18:23:54
【问题描述】:

有一个用 Python 编写的脚本,它通过 IPMI 解析来自多个服务器的传感器数据和事件。然后它将图形数据发送到一台服务器,并将错误日志发送到另一台服务器。日志服务器为 Syslog-ng+Mysql

所以任务是按所有者存储日志,而不是按脚本宿主。

一些代码示例:

import logging
import logging.handlers

loggerCent = logging.getLogger(prodName + 'Remote')
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
formatter = logging.Formatter('%(name)s: %(levelname)s: %(message)s')
loggerCent.setLevel(logging.INFO)

loggerCent.addHandler(ce)

loggerCent.warning('TEST MSG')

所以我需要扩展代码,以便告诉 syslog-ng,该日志属于另一台主机。或其他设计。

有什么想法吗?

更新:

所以看起来有使用 LogAdapter 的方法。但是如何使用它:

loggerCent = logging.getLogger(prodName + 'Remote')
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)-15s %(name)-5s %(levelname)-8s host: %(host)-15s %(message)s')
loggerCent.addHandler(ce)
loggerCent2 = logging.LoggerAdapter(loggerCent,
                               {'host': '123.231.231.123'})
loggerCent2.warning('TEST MSG')

通过 TcpDump 查找消息我在 LoggerAdapter 中看不到有关主机的任何信息 我做错了什么?

UPD2:

好吧,我没有找到将主机发送到 syslog-ng 的方法。虽然可以在链中发送第一个主机,但我真的找不到通过 Python Logging 发送它的方法。

无论如何,我在 syslog-ng 中制作了解析器: CSV Parser

parser ipmimon_log {
        csv-parser(
    columns("LEVEL", "UNIT", "MESSAGE")
    flags(escape-double-char,strip-whitespace)
        delimiters(";")
        quote-pairs('""[](){}')
    );
};

log {
    source(s_net);
    parser(ipmimon_log);
    destination(d_mysql_ipmimon);
};

log {
    source(s_net);
    destination(d_mysql_norm);
    flags(fallback);
};

然后我将日志发送到由 ; 分隔的 syslog-ng

【问题讨论】:

  • 因此您需要修改日志服务器以了解通过网络推送的日志消息中的事件发起者标识符。但是在我们到达那里之前,您实际上在哪里记录这些消息?有多种方法可以为日志消息添加上下文,但根据您在哪里进行日志记录,其中一种可能更有意义。
  • 听起来不错。事实上,我需要在不同的字段中记录不同的主机或某种标签。
  • 接收方从消息中获取数据的唯一方法是解析消息字符串。 SysLogHandler 只是将带有Formatted 消息的字符串推送到远程机器的末端,该字符串前面带有一个系统日志特定标记,该标记编码严重性和设施以及一个终止符“/000”。您需要自己定义格式以将元数据序列化到消息中(Format)。您可以通过LoggerAdapter 或其他机制获得它。
  • 好的,看起来它可以提供帮助。但是看不懂SysLogHandler和LogAdapter的使用方法。

标签: python logging syslog-ng


【解决方案1】:

编辑-重写

您错过了将Formatter 实际添加到Handler 的关键步骤。试试:

loggerCent = logging.getLogger(prodName + 'Remote')
loggerCent.setLevel(logging.DEBUG)
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
formatter = logging.Formatter('%(host)s;%(message)s')
ce.setFormatter(formatter)
loggerCent.addHandler(ce)
loggerCent2 = logging.LoggerAdapter(loggerCent, {'host': '123.231.231.123'})
loggerCent2.warning('TEST MSG')

请注意,您将不再运行basicConfig,因此您将负责附加Handler 并自己为根记录器设置日志级别(否则您将收到“无处理程序”错误)。

【讨论】:

  • 哦,等等,我重读了几次你的帖子,我认为这不对……你将所有消息记录到同一个日志服务器,但基本上需要能够提供自定义将日志消息的元数据发送到日志服务器(聚合服务器从中接收 IPMI 信息的源计算机)。那正确吗?您是否有权访问日志服务器上的消息解析器?
  • 是的,正确的。而且我确实可以访问记录器机器。 Syslog-ng 和 Mysql。如果可以解析消息,请获取服务器 ID 或地址并将其放在单独的字段中 - 这会很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2013-01-10
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多