Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python日志记录中设置源主机地址?_Python_Logging_Syslog Ng - Fatal编程技术网

如何在Python日志记录中设置源主机地址?

如何在Python日志记录中设置源主机地址?,python,logging,syslog-ng,Python,Logging,Syslog Ng,有一个用Python编写的脚本,通过IPMI解析来自多个服务器的传感器数据和事件。然后,它将图形数据发送到一台服务器,并将错误日志发送到另一台服务器。日志服务器是Syslog ng+Mysql 因此,任务是按所有者存储日志,而不是按脚本主机存储日志 一些代码示例: 因此,我需要扩展代码,以便能够告诉syslog ng,日志属于另一个主机。或者其他的设计 有什么想法吗 UPD: 看来有办法使用LogAdapter。但如何使用它: 通过TcpDump查找消息,我在LoggerAdapter中看不

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

因此,任务是按所有者存储日志,而不是按脚本主机存储日志

一些代码示例:

因此,我需要扩展代码,以便能够告诉syslog ng,日志属于另一个主机。或者其他的设计

有什么想法吗

UPD:

看来有办法使用LogAdapter。但如何使用它:

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

UPD2:

嗯,我没有找到将主机发送到syslog ng的方法。虽然可以发送链中的第一个主机,但我确实找不到通过Python日志发送的方法

无论如何,我在syslog ng中创建了解析器:

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

编辑重写

您缺少将
格式化程序
实际添加到
处理程序
的关键步骤。尝试:

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')