1

我想在我的程序中添加一个日志记录机制。我的项目目录的基本结构是这样的:

.
├── README.md
└── src
    ├── cli.py
    ├── module1.py
    ├── module2.py
    └── module3.py

cli.py导入所有其他module[1-3].py的,但是,我也使用所有其他模块作为独立的可执行文件(即使在这个项目的上下文之外)。即我使用所有这些命令:

$ python3 cli.py <args>
$ python3 module1.py
$ python3 module2.py <args>

文件的基本结构:

# cli.py
import logging
from rich.logging import RichHandler
import module1

formatter = logging.Formatter('[%(asctime)s] %(levelname)s %(message)s')
file_handler = logging.FileHandler('cli.log')
file_handler.setFormatter(formatter)
console_handler = RichHandler()
log = logging.getLogger() # root handler
log.addHandler(file_handler)
log.addHandler(console_handler)

if __name__ == '__main__':
    log.error('Hi from cli.py')
    module1.foo()
# module1.py
import logging

log = logging.getLogger(__name__)
formatter = logging.Formatter('[%(asctime)s] %(levelname)s %(message)s')
file_handler = logging.FileHandler('module1.log')
file_handler.setFormatter(formatter)
log.addHandler(file_handler)


def foo():
    log.error('Hi from module1.py')

if __name__ == '__main__':
    foo()

运行结果:

$ python3 cli.py
[12/14/21 11:29:05] ERROR    Hi from cli.py
                    ERROR    Hi from module1.py
$ python3 module1.py
Hi from module1.py

我很想知道如何配置日志记录,所以即使我将执行$ python3 module1.py,我仍将具有与根 ( RichHandler) 中定义的相同格式。当我试图在里面设置一个额外的格式module1.py时,它导致了一个重复的处理程序。
所以基本上我想实现这种行为:

$ python3 cli.py
[12/14/21 11:29:05] ERROR    Hi from cli.py      # also logged to cli.log
                    ERROR    Hi from module1.py  # also logged to cli.log and module1.log 
$ python3 module1.py
[12/14/21 11:29:05] ERROR    Hi from module1.py  # also logged to module1.log
4

1 回答 1

0

我相信我最近遇到了同样的问题。在您的导入文件中,不要定义“日志”。

相反,只需导入日志记录并使用,例如:

logging.error('Hi from module1.py')

然后这将从 cli.py 中的日志对象按预期输出。

于 2021-12-14T11:24:25.600 回答