代码之家  ›  专栏  ›  技术社区  ›  Joe

python.logging:为什么我的非basicconfig设置不起作用?

  •  1
  • Joe  · 技术社区  · 8 年前

    我想从主模块和所有子模块登录到单个日志文件。

    从主文件发送的日志消息(我在其中定义了记录器)工作正常。但是从调用发送到导入函数的函数丢失了。

    如果我使用logging.basicconfig,它是有效的,如下面的示例1所示。 但第二个允许更多自定义设置的示例不起作用。

    你知道为什么吗?

    # in the submodule I have this code
    import logging
    logger = logging.getLogger(__name__)
    

    示例1-工作

    在这里,我创建两个处理程序并将它们传递给 basicConfig 以下内容:

    # definition of root looger in main module
    
    formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S")   
    
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(formatter)
    handler.setLevel(logging.DEBUG)
    
    handler2 = logging.StreamHandler(stream=None)
    handler2.setFormatter(formatter)
    handler2.setLevel(logging.DEBUG)
    
    logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG)
    logger = logging.getLogger(__name__)
    

    示例2-不工作

    在这里,我创建两个处理程序和 addHandler() 它们发送到根记录器:

    # definition of root looger in main module
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(formatter)
    handler.setLevel(logging.DEBUG)
    #handler.setLevel(logging.ERROR)
    logger.addHandler(handler)
    
    handler = logging.StreamHandler(stream=None)
    handler.setFormatter(formatter)
    handler.setLevel(logging.DEBUG)
    logger.addHandler(handler)
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Joe    8 年前

    您需要在软件的主模块中配置(一个且仅一个)根记录器。这是通过调用

    logger = logging.getLogger() #without arguments
    

    而不是

    logger = logging.getLogger(__name__)
    

    (Python doc on logging)

    第二个示例使用脚本的名称创建一个单独的子记录器。

    如果子模块中没有定义处理程序,则日志消息将被传递给根日志记录器来处理它。

    这里有一个相关问题: Python Logging - How to inherit root logger level & handler