我正在尝试将上下文信息添加到我的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
提前感谢您的任何帮助和建议!
编辑:添加了代码示例
答案 0 :(得分:9)
记录器是分层的。所以你有一个根记录器(名为''
,即空白)。每个其他记录器都是根记录器的子项 - 最终。
在您的情况下,您拥有以下层次结构:
root
+-- NodeCommsConnection
如果您在孩子身上记录某些内容,它会尝试处理它,然后将日志消息传递给父记录器,除非您将propagate
设置为False
。< / p>
由于您向NodeCommsConnection
添加了一个appender,它将使用此appender记录其消息,然后调用root,它将使用其appender进行记录 - &gt;控制台上的两个输出。
所以要么将appender添加到根记录器(并删除默认的控制台记录器),要么将propagate
设置为False
:
logging.getLogger('NodeCommsConnection').propagate = False