我想在我的一个项目中实现一些日志。存在两个问题。
第一:如何设置我的日志系统?
第二:我当前的设置日志显示在控制台中,但未写入文件中(它创建文件,但文件始终为空)
我当前的设置是:
dictConifg
功能配置日志记录getLogger(__name__)
为每个文件启动记录器此设置正确且是最佳实践吗?
为什么日志记录创建文件但不将日志写入其中?
这是我的文件:
主.py
import logging.config
from time import sleep
from legging_config import LOGGING_CONFIGS
from something import Something
logging.config.dictConfig(LOGGING_CONFIGS)
logger = logging.getLogger(__name__)
if __name__ == "__main__":
logger.info("Application started.")
nothing_1 = Something()
sleep(1)
nothing_2 = Something()
logger.warning("Application finished.")
某事.py
import logging
from time import sleep
logger = logging.getLogger(__name__)
class Something:
def __init__(self) -> None:
logger.debug("Create something.")
sleep(1)
legging_config.py
LOGGING_CONFIGS = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"format": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "format",
"stream": "ext://sys.stdout",
},
"file": {
"class": "logging.FileHandler",
"filename": "data/logs/main.log",
"mode": "a",
"formatter": "format",
},
},
"loggers": {
"logger": {
"handlers": ["console", "file"],
"level": "DEBUG",
"propagate": False,
}
},
"root": {"handlers": ["console"], "level": "DEBUG"},
}
控制台输出
2024-04-21 09:35:53,469 - __main__ - INFO - Application started.
2024-04-21 09:35:53,470 - something - DEBUG - Create something.
2024-04-21 09:35:55,471 - something - DEBUG - Create something.
2024-04-21 09:35:56,473 - __main__ - WARNING - Application finished.
主.日志
您在配置字典中配置了一个名为
logger
的记录器,但您使用 getLogger(__name__)
按模块名称获取记录器。这意味着您对 logger
的特定配置不会被使用,除非您实际上明确调用 getLogger("logger")
。
您的根记录器配置为仅在其
console
级别使用 DEBUG
处理程序。这意味着根记录器捕获的任何日志或传播到根的任何记录器都不会发送到文件处理程序。
这些问题一起导致您的日志文件为空,因为您的记录器依赖于传播(默认行为,除非您明确将
propagate
设置为 False
),并且由于根记录器没有附加 file
处理程序,日志不会写入文件。