【问题标题】:Python logging; [1] cannot set log file dirpath; and [2] datetime formatting problemsPython 日志记录; [1] 无法设置日志文件目录路径;和 [2] 日期时间格式问题
【发布时间】:2020-10-14 22:53:29
【问题描述】:

我正在尝试学习如何使用日志记录模块。 我想将信息记录到控制台和文件中。 我承认我还没有完成对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.为什么食谱代码会这样做,也不是

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

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

    “YYYY-MM-DD_HH-MM-SS - INFO:样本信息。”
    而不是以下日期时间格式:“10/14/2020 03:00:22 PM - INFO: Sample 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.x logging python-datetime


    【解决方案1】:

    快速运行您的代码表明它已经解决了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.')
    

    【讨论】:

    • 非常感谢!但没有善行不受惩罚。我从您的代码中创建了一个函数,带有参数“msg”和“msg_type”。我插入了以下 2 行: [LINE1: "if msg_type.lower() == 'error':"] AND [LINE2: "logging.error(msg)"] 由于某种我无法弄清楚的原因,错误消息在控制台和日志文件中出现两次。你能解释一下为什么会这样吗?
    • @MarcB.Hankin 您能否将新代码附加到您的问题中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多