我尝试使用Structlog将日志记录到一个文件,然后使用filebeat将日志发送到我的日志服务。
我已经让一切正常工作,但我希望能够在多个模块中使用相同的记录器,就像Python默认记录器一样(请参阅https://docs.python.org/2/howto/logging.html小节“从多个模块进行日志记录”)。
其中一个原因是,我希望将一个sessionID绑定到我的日志输出,该日志输出应该被记录在从该会话调用的所有模块中。
可能需要一些关于如何使用structlogger的基础知识,但在他们的文档或其他帖子中还没有找到答案。
敬请指教……
举个例子:
main.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import uuid
from mylogger import myLogger
import otherModule
myLogger = myLogger()
myLogger.log.warning('working', error='test')
myLogger.log = myLogger.log.bind(sessionID=str(uuid.uuid4()))
myLogger.log.warning('Event where sessionID is bound to logger', error='test')
otherModule = otherModule.otherModule()myLogger.py
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import datetime, logging
from structlog import wrap_logger, get_logger
from structlog.processors import JSONRenderer
from structlog.stdlib import filter_by_level, add_log_level
class myLogger():
def __init__(self, loggername="root", logLevel='INFO', logFile='test2.log'):
self.log = wrap_logger(
logging.getLogger('root'),
processors=[
filter_by_level,
add_log_level,
self.add_timestamp,
JSONRenderer(indent=1, sort_keys=True)
]
)
logging.basicConfig(format='%(message)s', level=logLevel, filename=logFile)
def my_get_logger(self, loggername="AnyLogger"):
log = get_logger(loggername)
return log
def add_timestamp(self, _, __, event_dict):
event_dict['timestamp'] = datetime.datetime.utcnow().isoformat()
return event_dictotherModule.py
import structlog
from mylogger import myLogger
class otherModule():
def __init__(self):
logger = structlog.get_logger('root')
## This logger does not have the processors nor the bound sessionID
logger.warning('In other module')
## This logmessage is printed to console
logger2 = myLogger();
## This logger has all the processors but not the bund sessionID
logger2.log.warning('In other module')
## This log is written to my logfile, but without the sessionID发布于 2018-09-26 22:59:12
您需要使用包装的字典作为上下文类,如structlog documentation中所述
所以你最终会得到这样的结果:
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
# other processors
],
context_class=structlog.threadlocal.wrap_dict(dict),
)https://stackoverflow.com/questions/46630610
复制相似问题