首页 > 解决方案 > Python 日志记录;[1] 无法设置日志文件目录路径;和 [2] 日期时间格式问题

问题描述

我正在尝试学习如何使用日志记录模块。我想将信息记录到控制台和文件中。我承认我还没有完成对https://docs.python.org/3/library/logging.html#logging.basicConfighttps://docs.python.org/3/howto/logging.html的学习

对于像我这样的新手来说,学习所有这些有点令人生畏,但我正在努力。

我正在尝试使用来自https://docs.python.org/3/howto/logging-cookbook.html的“记录到多个目的地”程序的修改版本,我将其称为“Cookbook_Code”。

Cookbook_Code 出现在该URL的标题“登录到多个目的地”下。

但是我有两个问题:

  1. Cookbook 代码保存到一个名为:“E:\Zmani\Logging\Logging_to_multiple_destinations_python.org_aaa.py.txt”的文件中,我无法弄清楚:

    A. 为什么食谱代码会这样做,也不是

    B. 如何使日志记录模块保存到以下文件路径(我存储在 var 中,“logfile_fullname”):“e:\zmani\Logging\2020-10-14_14_14_os.walk_script.log”

  2. 我无法弄清楚如何让日志文件使用以下日期时间格式:

    “YYYY-MM-DD_HH-MM-SS - 信息:样本信息。”
    而不是以下日期时间格式:“10/14/2020 03:00:22 PM - INFO:示例信息。”

  3. 我希望控制台输出包含相同的日期时间前缀:“YYYY-MM-DD_HH-MM-SS -”

任何建议将不胜感激。

谢谢,

                         Marc

这是我一直在运行的代码:

log_file_fullname = "e:\zmani\Logging\2020-10-14_14_14_os.walk_script.log"

# https://docs.python.org/3/howto/logging-cookbook.html#logging-cookbook

import logging
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d_%H-%M-%S',
                    filename=log_file_fullname,
                    filemode='w')


console = logging.StreamHandler()
console.setLevel(logging.INFO)

formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')

console.setFormatter(formatter)

logging.getLogger('').addHandler(console)

  logging.info('Sample info.')
    
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

标签: python-3.xloggingpython-datetime

解决方案


快速运行您的代码表明它已经解决1.B2您的问题。

您提供的 URL 没有显示Logging_to_multiple_destinations_python.org_aaa.py.txt正在使用的任何地方。反正也没关系。它只是一个文本文件的路径,前提是它的父文件夹存在。所以1.A只是一个示范。

如果你添加%(asctime)s到控制台的formatter,它会给你3.

formatter = logging.Formatter('%(asctime)s %(name)-12s: %(levelname)-8s %(message)s', datefmt='%Y-%m-%d_%H-%M-%S')

basicConfig当您不需要添加任何记录器或进行复杂设置时才应使用。

basicConfigroot只有在记录器中没有任何处理程序时才会生效。如果您使用filename参数,它会创建一个FileHandler. 如果您使用stream参数,它会创建一个StreamHandler. 而且你不能同时使用这两个参数。

所以你说你需要输出到文件和控制台,只需为它们每个创建一个处理程序。

import logging

log_file_fullname = "2020-10-14_14_14_os.walk_script.log"

# config file handler
file_handler = logging.FileHandler(log_file_fullname)
file_handler.setLevel(logging.DEBUG)
fmt_1 = logging.Formatter('%(asctime)s %(name)-12s: %(levelname)-8s %(message)s', 
                          datefmt='%Y-%m-%d_%H-%M-%S')
file_handler.setFormatter(fmt_1)

# config console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
fmt_2 = fmt_1                               # you could add console only formatter here
console_handler.setFormatter(fmt_2)

# retrieve a root logger and add handlers
root_logger = logging.getLogger()
root_logger.setLevel(logging.NOTSET)        # change from default WARNING to NOTSET,
root_logger.addHandler(file_handler)        # this allows root_logger to take all propagated
root_logger.addHandler(console_handler)     # messages from other child loggers.


# this line use root logger by default
logging.info('Sample info.')

# create module loggers
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

# logging by module loggers
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

推荐阅读