将自定义函数输出添加到Python日志处理程序

时间:2014-10-26 15:57:36

标签: python logging error-handling formatting

使用logging来处理模拟框架内多个模块的日志记录,并使用它自己的“时间”。

基本上,我得到的结论是:

WARNING:Node[n0].App:RoutingTest:No Packet Count List set up yet; fudging it with an broadcast first
INFO:Node[n0].Layercake.ALOHA:Transmit to Any
INFO:Node[n0].Layercake.ALOHA:The timeout is 16.0910738255
WARNING:Node[n1].App:RoutingTest:No Packet Count List set up yet; fudging it with an broadcast first
INFO:Node[n1].Layercake.ALOHA:Transmit to Any

虽然这些在“实际”时间或多或少地瞬间发生,但很难说出机器时间意味着什么。

在框架内,有一个全局可访问的Sim.now(),它返回当前的运行时间。

虽然我可以完成所有日志记录使用并将其添加为附加尾部字段,但我宁愿将其添加为基本logging处理程序的一部分,但是扫描相关文档并在此处搜索谷歌没有发现任何直接相关的东西。有一个人几乎要求the same question,但没有得到适当的回应

本质上,我希望通过调用此函数来使基本处理程序更新为所有日志调用的前缀,实际上

logline="[{T}]:{msg}".format(T=Sim.now(), msg=logmsg)

任何指针?

1 个答案:

答案 0 :(得分:1)

您可以撰写自定义Formatter

import logging
from sim import Sim

class SimNowPrefixFormatter(logging.Formatter):
    def format(self, record):
        log_message = super(SimNowPrefixFormatter, self).format(record)
        return "[{}]:{}".format(Sim.now(), log_message)

# Your base logging handler
handler = logging.StreamHandler()
handler.setFormatter(SimNowPrefixFormatter("%(levelname)s:%(message)s"))
root_logger = logging.getLogger()
root_logger.addHandler(handler)