首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python记录器未输出到文件

Python记录器未输出到文件
EN

Stack Overflow用户
提问于 2020-03-08 02:25:05
回答 1查看 315关注 0票数 0

我的logging.ini文件可能有问题。我的python代码适用于另一个文件,但不适用于这个文件。

Python运行此main.py

代码语言:javascript
运行
AI代码解释
复制
# main.py
import logging
from logging.config import fileConfig

import my_module

# load the logging configuration
fileConfig('logging.ini')

my_module.foo()
bar = my_module.Bar()
bar.bar()

另一个具有自定义方法的文件

代码语言:javascript
运行
AI代码解释
复制
# my_module.py
import logging

def foo():
    logger = logging.getLogger(__name__)
    logger.info('Hi, foo')

class Bar(object):
    def __init__(self, logger=None):
        self.logger = logger or logging.getLogger(__name__)

    def bar(self):
        self.logger.info('Hi, bar')
        self.logger.debug('Testing')

我尝试了这个logging.ini文件,它工作正常

代码语言:javascript
运行
AI代码解释
复制
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

然后,我想将一些日志保存到文件中,并将一些日志打印到控制台,因此在这里我尝试了另一个logging.ini文件

代码语言:javascript
运行
AI代码解释
复制
[loggers]
keys=root,sLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=consoleFormatter,fileFormatter


[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=sLogger
propagate=0


[handler_consoleHandler]
class=StreamHandler
level=WARNING
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=fileFormatter
args=('display_info.log','w')


[formatter_consoleFormatter]
format=%(levelname)s - %(message)s
datefmt=

[formatter_fileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

它是这样执行的

代码语言:javascript
运行
AI代码解释
复制
python main.py

这一次,程序运行良好,没有错误。但是display_info.log中没有日志。有人能帮我解决这个问题吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-03-08 03:15:56

这是因为您试图通过__name__获取记录器,它不是"__main__",而是"my_module“。您没有对应的键,因此记录器未配置。更改您的getLogger以调用正确的限定名sLogger,它将获取正确的限定名:

代码语言:javascript
运行
AI代码解释
复制
import logging

def foo():
    # here
    logger = logging.getLogger("sLogger")
    logger.info('Hi, foo')

class Bar(object):
    def __init__(self, logger=None):
        # or here
        self.logger = logger or logging.getLogger("sLogger")

    def bar(self):
        self.logger.info('Hi, bar')
        self.logger.debug('Testing')

这将按照您指定的名称(在.ini文件中它所指向的key )调用记录器。现在,您的display_info.log文件应该如下所示:

代码语言:javascript
运行
AI代码解释
复制
# display_info.log

2020-03-07 22:14:45,351 - sLogger - INFO - Hi, foo
2020-03-07 22:14:45,351 - sLogger - INFO - Hi, bar
2020-03-07 22:14:45,351 - sLogger - DEBUG - Testing

原因是每个记录器都有一个名称,所以当您调用logging.getLogger(<some_name>)时,该记录器实际上就是您给它命名的那个名称。然后,当您从其他模块调用该记录器时,它已经可用。

__name__属性不是记录器的名称,而是您正在运行的脚本的名称。当您调用python somescript.py时,somescript.__name____main__,因为它是被调用的主要模块。但是通过导入,__name__是模块的名称,因为它没有被执行。所以,实际上,发生的事情是这样的:

代码语言:javascript
运行
AI代码解释
复制
import logging

''' these two are created when you load the .ini file '''
# this is aliased as root
main_logger = logging.getLogger("__main__")
~ some logging configuration ~

# the other logger you configured
sLogger = logging.getLogger("sLogger")
~ some logging configuration ~
''' and are in global scope in the main script '''

# and the logger you were getting by mistake
logger = logging.getLogger("my_module")


# when you really meant to do this
# which is the same thing as sLogger
logger = logging.getLogger("sLogger")

或者,如果您希望保留__name__语法并具有特定于模块的记录器,则只需添加模块的名称作为限定名:

代码语言:javascript
运行
AI代码解释
复制
# logging.ini
~ snip ~

[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=my_module
propagate=0

~ rest of file ~

您可以保留logging.getLogger(__name__)调用:

代码语言:javascript
运行
AI代码解释
复制
# my_module.py
import logging

def foo():
    logger = logging.getLogger(__name__)
    logger.info('Hi, foo')

class Bar(object):
    def __init__(self, logger=None):
        self.logger = logger or logging.getLogger(__name__)

    def bar(self):
        self.logger.info('Hi, bar')
        self.logger.debug('Testing')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60583991

复制
相关文章

相似问题

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