gpt4 book ai didi

Python LoggerAdapter 正在向 STDOUT 生成重复的日志条目

转载 作者:行者123 更新时间:2023-11-28 20:09:09 25 4
gpt4 key购买 nike

我正在尝试将上下文信息添加到我的 python 脚本的日志输出中。本质上,我使用 SocketServer 类来处理传入的网络连接,当客户端向服务器发送消息时,我想在 STDOUT 中创建一个日志条目和一个包含时间、日志级别、客户端 ip 和收到消息。

我已经尝试使用过滤器(我无法开始工作,但我愿意接受建议)和 LoggerAdapter 来实现它:http://pastebin.com/peT0rjA7

class ConnInfo:
def __getitem__(self, name):
if name == "ip":
result = tlocal.ip
if name == "cmd":
result = tlocal.msg
return result
def __iter__(self):
keys = ['ip', 'cmd']
keys.extend(self.__dict__.keys())
return keys.__iter__()

logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(name)-12s %(levelname)-8s %(message)s",
datefmt="%d-%m %H:%M:%S",
filename="distpovadmin.log",
filemode="w")
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
nodeCommsConFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(ip)-4s %(cmd)-8s %(message)s')
console.setFormatter(formatter)

#nodeCommsConLogging = logging.LoggerAdapter(logging.getLogger('NodeCommsConnection').addHandler(console.setFormatter(nodeCommsConFormatter())), ConnInfo())
CommsConConsole = logging.StreamHandler()
CommsConConsole.setLevel(logging.INFO)
CommsConConsole.setFormatter(nodeCommsConFormatter)
nodeCommsConLogging = logging.LoggerAdapter(logging.getLogger('NodeCommsConnection'), ConnInfo())
logging.getLogger('NodeCommsConnection').removeHandler(console)
logging.getLogger('NodeCommsConnection').addHandler(CommsConConsole)

logging.getLogger('').addHandler(console)

当我像这样调用 nodeCommsConLogging 时:

nodeCommsConLogging.info("Message Received")

我在 STDOUT 日志中得到重复的条目

NodeCommsConnection: INFO     192.168.1.8 REQ;     Message Received
NodeCommsConnection: INFO Message Received

在此先感谢您的帮助和建议!

编辑:添加代码示例

最佳答案

记录器是分层的。所以你有一个根记录器(名为 '',即空白)。每个其他记录器最终都是根记录器的子项。

在你的例子中,你有这个层次结构:

 root
+-- NodeCommsConnection

如果你在 child 上记录一些东西,它会尝试处理它,然后将日志消息传递给父记录器除非你将propagate设置为False

由于您向 NodeCommsConnection 添加了一个 appender,它将使用此 appender 记录其消息,然后调用将使用其 appender 进行记录的 root -> 控制台上的两个输出。

因此,要么将您的 appender 添加到根记录器(并删除默认的控制台记录器),要么将 propagate 设置为 False:

logging.getLogger('NodeCommsConnection').propagate = False

关于Python LoggerAdapter 正在向 STDOUT 生成重复的日志条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666566/

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