Python日志输出到标准输出和日志文件

27

我在学习Python并开始接触日志记录模块。我希望将消息记录到日志文件并输出到控制台。下面的代码将消息打印到控制台,但如何将所有消息记录到文件中呢?

Logger对象没有用于记录到文件的函数调用(basicConfig(filename=))。如何添加此功能?

提前感谢您的帮助。

import logging

# create logger
logger = logging.getLogger(_name_)
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

2
logger = logging.getLogger(name) - mujjiga
在这里找到答案:https://dev59.com/h2Yr5IYBdhLWcg3wXJEK - JinSnow
4个回答

21

你只需要添加另一个处理程序,比如logging.FileHandler

fh = logging.FileHandler(r'/path/to/log.txt')
logger.addHandler(fh)

10

在 @Brendan 的回答上进行扩展。

你的记录器目前使用 StreamHandler 将日志输出到控制台。

通过添加一个 FileHandler,你可以将日志记录到文件中。

每个处理程序实例可以自定义其自己的格式和日志记录级别。

如果你想使用相同的格式进行记录,那么你需要在新的 FileHandler 上设置相同的格式。

fh = logging.FileHandler(r'/path/to/log.txt')
fh.setFormatter(formatter)
logger.addHandler(fh)

阅读更多:Python日志记录手册


感谢详细的解释! - Zen

4

如果您对于streamfilehandler记录器具有相同的配置,那么可以通过将处理程序列表传递给处理程序来简化它,如下所示:

import logging
import sys


logger = logging.getLogger(__name__)

logging.basicConfig(
    handlers=[
        logging.StreamHandler(sys.stdout),
        logging.FileHandler("your_log_file_name.log", mode="w"),
    ],
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)

1

在多个Python包中反复使用Waterboy的代码来同时记录控制台和文件(请参见this thread),我终于将其转化为一个微小的独立Python包,您可以在此处找到:

https://github.com/acschaefer/duallog

代码文档充分,易于使用。只需下载.py文件并将其包含在您的项目中,或通过python setup.py install安装整个软件包即可使用。
使用该软件包,您的代码应如下所示:
# Set up logging to console and file.
import duallog
duallog.setup(logdir='my_logs')

# Generate log messages.
import logging    
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接