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

2024-04-20 07:42:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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时:

^{pr2}$

在STDOUT日志中有重复的条目

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

提前感谢您的帮助和建议!在

编辑:添加代码示例


Tags: nameselfipinfocmdloggingresultkeys
1条回答
网友
1楼 · 发布于 2024-04-20 07:42:59

伐木工人是分等级的。所以您有一个根记录程序(名为'',即blank)。每个其他的记录器最终都是根记录器的子级。在

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

 root
   +  NodeCommsConnection

如果您在子日志中记录了某些内容,它将尝试处理它,然后将日志消息传递给父记录器,除非propagate设置为False。在

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

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

^{2}$

相关问题 更多 >