gpt4 book ai didi

python - 使 logging.LoggerAdapter 可用于其他模块的优雅方式

转载 作者:太空狗 更新时间:2023-10-29 18:26:28 25 4
gpt4 key购买 nike

我使用 LoggerAdapter 让我的 python 日志记录输出 Linux TID,而不是长的唯一 ID。但是这样我就不会修改现有的 logger 而是创建一个新对象:

    new_logger = logging.LoggerAdapter(
logger=logging.getLogger('mylogger'),
extra=my_tid_extractor())

现在我希望这个 LoggerAdapter 被某些模块使用。只要我知道一个全局变量被用作记录器,我就可以做这样的事情:

    somemodule.logger = new_logger

但这并不好——它只在少数情况下有效,您需要知道模块使用的记录器变量。

您是否知道一种使 LoggerAdapter 全局可用的方法,例如通过调用 s.th.喜欢

    logging.setLogger('mylogger', new_logger)

或者:是否有其他方法让 Python logging 输出 Linux 线程 ID,如 ps 打印的那样?

最佳答案

或者,您可以实现自定义记录器,并将其设为默认记录模块。

例子如下:

import logging
import ctypes

SYS_gettid = 186
libc = ctypes.cdll.LoadLibrary('libc.so.6')

FORMAT = '%(asctime)-15s [thread=%(tid)s] %(message)s'
logging.basicConfig(level=logging.DEBUG, format=FORMAT)

def my_tid_extractor():
tid = libc.syscall(SYS_gettid)
return {'tid': tid}

class CustomLogger(logging.Logger):

def _log(self, level, msg, args, exc_info=None, extra=None):
if extra is None:
extra = my_tid_extractor()
super(CustomLogger, self)._log(level, msg, args, exc_info, extra)

logging.setLoggerClass(CustomLogger)


logger = logging.getLogger('test')
logger.debug('test')

输出样本:

2015-01-20 19:24:09,782 [thread=5017] test

关于python - 使 logging.LoggerAdapter 可用于其他模块的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28050451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com