首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -使用structlog从多个模块进行日志记录

Python -使用structlog从多个模块进行日志记录
EN

Stack Overflow用户
提问于 2017-10-08 19:31:10
回答 1查看 1.3K关注 0票数 3

我尝试使用Structlog将日志记录到一个文件,然后使用filebeat将日志发送到我的日志服务。

我已经让一切正常工作,但我希望能够在多个模块中使用相同的记录器,就像Python默认记录器一样(请参阅https://docs.python.org/2/howto/logging.html小节“从多个模块进行日志记录”)。

其中一个原因是,我希望将一个sessionID绑定到我的日志输出,该日志输出应该被记录在从该会话调用的所有模块中。

可能需要一些关于如何使用structlogger的基础知识,但在他们的文档或其他帖子中还没有找到答案。

敬请指教……

举个例子:

main.py

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
#!/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_dict

otherModule.py

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-09-26 22:59:12

您需要使用包装的字典作为上下文类,如structlog documentation中所述

所以你最终会得到这样的结果:

代码语言:javascript
复制
structlog.configure(
    processors=[
        structlog.stdlib.filter_by_level,
        # other processors
    ],
    context_class=structlog.threadlocal.wrap_dict(dict),
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46630610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档