如何在Python日志记录中设置源主机地址?
有一个用Python编写的脚本,通过IPMI解析来自多个服务器的传感器数据和事件。然后,它将图形数据发送到一台服务器,并将错误日志发送到另一台服务器。日志服务器是Syslog ng+Mysql 因此,任务是按所有者存储日志,而不是按脚本主机存储日志 一些代码示例: 因此,我需要扩展代码,以便能够告诉syslog ng,日志属于另一个主机。或者其他的设计 有什么想法吗 UPD: 看来有办法使用LogAdapter。但如何使用它: 通过TcpDump查找消息,我在LoggerAdapter中看不到任何关于主机的信息 我做错了什么 UPD2: 嗯,我没有找到将主机发送到syslog ng的方法。虽然可以发送链中的第一个主机,但我确实找不到通过Python日志发送的方法 无论如何,我在syslog ng中创建了解析器: 然后,我将日志发送到由分隔的syslog ng 编辑重写 您缺少将如何在Python日志记录中设置源主机地址?,python,logging,syslog-ng,Python,Logging,Syslog Ng,有一个用Python编写的脚本,通过IPMI解析来自多个服务器的传感器数据和事件。然后,它将图形数据发送到一台服务器,并将错误日志发送到另一台服务器。日志服务器是Syslog ng+Mysql 因此,任务是按所有者存储日志,而不是按脚本主机存储日志 一些代码示例: 因此,我需要扩展代码,以便能够告诉syslog ng,日志属于另一个主机。或者其他的设计 有什么想法吗 UPD: 看来有办法使用LogAdapter。但如何使用它: 通过TcpDump查找消息,我在LoggerAdapter中看不
格式化程序
实际添加到处理程序
的关键步骤。尝试:
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
,因此您将负责附加处理程序
,并自行设置根日志记录器的日志级别(否则将出现“无处理程序”错误)。哦,等等,我重新阅读了几次您的帖子,我认为这不对。。。将所有消息记录到同一个日志服务器,但基本上需要能够为日志服务器(聚合服务器从中接收IPMI信息的源计算机)提供日志消息的自定义元数据。是这样吗?您有权访问日志服务器上的消息分析器吗?是,正确。我有权使用记录器。Syslog-ng和Mysql。如果可以解析消息,请获取服务器id或地址并将其放在单独的字段中-这将非常好。因此,您需要修改日志服务器,以了解通过网络推送的日志消息中的事件发起人标识符。但在我们到达之前,你到底在哪里记录这些信息?有许多方法可以为日志消息添加上下文,但根据您在哪里进行日志记录,另一种方法可能更有意义。听起来不错。事实上,我需要记录不同的主机或不同字段中的某种标记。在接收方从消息中获取数据的唯一方法是解析消息字符串SysLogHandler
只需推出一个带有Format
ted消息的字符串,该消息前面有一个syslog特定的标记,该标记对严重性和设备进行编码,并在远端向远程计算机发送一个终止符'/000'。您需要自己定义将元数据序列化到消息中的格式(格式为格式
)。您可以使用LoggerAdapter
或其他机制将其放到那里。好的,看起来它可以帮助您。但是我不明白如何使用SysLogHandler和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')
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);
};
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')