Python记录器未输出到文件

问题描述 投票:0回答:1

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

Python运行此main.py

# 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()

具有定制方法的另一个文件

# 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文件,并且可以正常工作

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文件

[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=

被这样执行

python main.py

这次程序运行正常,没有错误。但是没有登录display_info.log。有人可以帮我解决这个问题吗?谢谢!

python logging output ini
1个回答
0
投票

这是因为您试图通过__name__获取记录器,该记录器不是"__main__",而是“ my_module”。您没有密钥,因此未配置记录器。更改您的getLogger来调用适当的质量名称sLogger,它会抓住正确的名称:

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文件应如下所示:

# 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
© www.soinside.com 2019 - 2024. All rights reserved.