问题描述
我正在尝试学习如何使用日志记录模块。 我想将信息记录到控制台和文件中。 我承认我还没有完成https://docs.python.org/3/library/logging.html#logging.basicConfig和https://docs.python.org/3/howto/logging.html
的学习对于像我这样的新手来说,要学习所有内容都有些令人生畏,但我正在努力。
我正在尝试使用https://docs.python.org/3/howto/logging-cookbook.html中“登录到多个目标”程序的修改版本,我将其称为“ Cookbook_Code”。
Cookbook_Code出现在URL标题下的“登录到多个目的地”下。
但是我有两个问题:
-
食谱代码保存到名为: “ 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”
-
我不知道如何使日志文件使用以下日期时间格式:
“ YYYY-MM-DD_HH-MM-SS-INFO:示例信息。”
而不是以下日期时间格式:“ 2020年10月14日03:00:22-信息:示例信息。” -
我希望控制台输出包含相同的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.B
和2
解决了您的问题。
您提供的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.')