Python 记录; [1] 无法设置日志文件目录路径;和 [2] 日期时间格式问题
Python logging; [1] cannot set log file dirpath; and [2] datetime formatting problems
我正在尝试学习如何使用日志记录模块。
我想将信息记录到控制台和文件中。
我承认我两个都没学完https://docs.python.org/3/library/logging.html#logging.basicConfig and 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",
我想不通:
一个。为什么 Cookbook 代码会那样做,也不
乙。如何使日志记录模块保存到以下文件路径(我存储在 var 中,“logfile_fullname”):“e:\zmani\Logging20-10-14_14_14_os.walk_script.log”
我不知道如何让日志文件使用以下日期时间格式:
"YYYY-MM-DD_HH-MM-SS - 信息:示例信息。"
而不是以下日期时间格式:“10/14/2020 03:00:22 PM - 信息:示例信息。”
我希望控制台输出包含相同的日期时间前缀:
"YYYY-MM-DD_HH-MM-SS -"
如有任何建议,我们将不胜感激。
谢谢,
Marc
这是我的代码 运行:
log_file_fullname = "e:\zmani\Logging20-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
您的问题。
您提供的网址没有显示 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.')
我正在尝试学习如何使用日志记录模块。 我想将信息记录到控制台和文件中。 我承认我两个都没学完https://docs.python.org/3/library/logging.html#logging.basicConfig and 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", 我想不通:
一个。为什么 Cookbook 代码会那样做,也不
乙。如何使日志记录模块保存到以下文件路径(我存储在 var 中,“logfile_fullname”):“e:\zmani\Logging20-10-14_14_14_os.walk_script.log”
我不知道如何让日志文件使用以下日期时间格式:
"YYYY-MM-DD_HH-MM-SS - 信息:示例信息。"
而不是以下日期时间格式:“10/14/2020 03:00:22 PM - 信息:示例信息。”我希望控制台输出包含相同的日期时间前缀: "YYYY-MM-DD_HH-MM-SS -"
如有任何建议,我们将不胜感激。
谢谢,
Marc
这是我的代码 运行:
log_file_fullname = "e:\zmani\Logging20-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
您的问题。
您提供的网址没有显示 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.')