我的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
中没有日志。有人能帮我解决这个问题吗?谢谢!
发布于 2020-03-08 03:15:56
这是因为您试图通过__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
原因是每个记录器都有一个名称,所以当您调用logging.getLogger(<some_name>)
时,该记录器实际上就是您给它命名的那个名称。然后,当您从其他模块调用该记录器时,它已经可用。
__name__
属性不是记录器的名称,而是您正在运行的脚本的名称。当您调用python somescript.py
时,somescript.__name__
是__main__
,因为它是被调用的主要模块。但是通过导入,__name__
是模块的名称,因为它没有被执行。所以,实际上,发生的事情是这样的:
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__
语法并具有特定于模块的记录器,则只需添加模块的名称作为限定名:
# logging.ini
~ snip ~
[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=my_module
propagate=0
~ rest of file ~
您可以保留logging.getLogger(__name__)
调用:
# 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')
https://stackoverflow.com/questions/60583991
复制相似问题