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. 食谱代码保存到名为: “ E:\ Zmani \ Logging \ Logging_to_multiple_destinations_python.org_aaa.py.txt”, 我不知道:

    A。为什么Cookbook代码会这样做?

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

  2. 我不知道如何使日志文件使用以下日期时间格式:

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

  3. 我希望控制台输出包含相同的datetime前缀: “ 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.')

解决方法

对您的代码的快速运行表明,它已经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

basicConfig仅在root记录器中没有任何处理程序的情况下才会生效。如果使用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.')