Python日志记录 - 将日期设置为文件名

问题描述:

我正在实施我的Python项目中的日志记录,并且遇到了一些障碍。我正在尝试设置日志记录,以便将处理程序和格式化程序全部组织到配置文件中。我现在想要做的是设置我的fileHandler,这样它会创建一个类似如下的日志文件:YYYY_MM_DD.log显然,Y代表年份,M代表月份,D代表当天。Python日志记录 - 将日期设置为文件名

这就是我试图用我的配置文件:

[loggers] 
keys=root,MainLogger 

[handlers] 
keys=fileHandler, consoleHandler 

[formatters] 
keys=logFormatter, consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=fileHandler 

[logger_MainLogger] 
level=DEBUG 
handlers=fileHandler, consoleHandler 
qualname=MainLogger 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=consoleFormatter 
args=(sys.stdout,) 

[handler_fileHandler] 
class=FileHandler 
level=DEBUG 
formatter=logFormatter 
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a') 

[formatter_logFormatter] 
format=%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s 

[formatter_consoleFormatter] 
format=%(asctime)s | %(levelname)-8s | %(fillname)s-%(funcName)s-%(lineno)04d | %message)s 

我使用的测试配置文件很简单:

import logging 
import logging.config 

logging.config.fileConfig('logging.conf') 
logger = logging.getLogger('MainLogger') 
logger.debug("TEST") 

特定的错误,我在得到时刻是:

configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')" 

我试过改变%Y%m%d,正如错误所述,但这并不能解决问题。我如何去设置配置文件,以便我的日志文件看起来像我想要的那样?

我应该注意,当我改变文件名为test.log一切正常,所以这是我似乎与此唯一的错误。

+0

你怎么导入日期时间?这可能是由于使用'datetime.now()'而不是'datetime.datetime.now()'的常见错误而导致错误无法正确处理的错误。 –

+0

......我想我没有导入日期时间。虽然我只是改变我的配置文件为'datetime.datetime.now()',仍然有相同的错误。我会将它导入到我的Python脚本中吗? – Skitzafreak

+0

是的,尝试在脚本的顶部放置'from datetime import datetime'。 –

你不能在配置文件中使用datetime,因为它不知道这意味着什么。

import logging.config 
from datetime import datetime 

logging.config.fileConfig('aaa.conf') 
logger = logging.getLogger('MainLogger') 

fh = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) 
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fh.setFormatter(formatter) 

logger.addHandler(fh) 
logger.debug("TEST") 

这样你就可以设置日期作为处理程序的文件名:但是,您可以在Python文件本身添加Filehandler

这是配置文件,请注意,您必须在最后格式化一个错字,你把fillname而不是filename,你在message忘记(

[loggers] 
keys=root,MainLogger 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_MainLogger] 
level=DEBUG 
handlers=consoleHandler 
qualname=MainLogger 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=consoleFormatter 
args=(sys.stdout,) 

[formatter_consoleFormatter] 
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s 

这应该工作得很好。

这使用来自配置文件的内容,但不直接访问该文件。您创建自己的文件处理程序,然后将其添加到记录器。

import logging 
from datetime import datetime 

# Create logger. 
logger = logging.getLogger('MainLogger') 
logger.setLevel(logging.DEBUG) 

# Create filehandler with desired filename. 
fh = logging.FileHandler('{}.log'.format(datetime.now().strftime('%Y_%m_%d'))) 
fh.setLevel(logging.DEBUG) 
log_formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fh.setFormatter(log_formatter) 

# Add filehandler to logger. 
logger.addHandler(fh) 

注意a(追加)是一个文件处理器默认mode参数。

+0

我假设导入是假设在Python脚本中?我仍然得到相同的错误:\ – Skitzafreak

也许你可以使用Python的TimedRotatingFileHandler来代替。您可以设置时间间隔以每天创建一个新日志文件,并以日期作为后缀。

Documentation--

注意,当天的日志文件中不会有约会。此文件处理程序仅在新的一天开始时添加日期后缀。

此外,它使用的后缀是“%Y-%m-%d”,这与你想要的有些不同。但是有一个关于如何改变这个问题的问题here

+0

不知道他们是否以我需要的方式工作。根据我的理解,查看您提供的'TimedRotatingFileHandler'的链接是为了让您计划让一个程序运行多天,并且每天需要单独的日志文件。在我的情况下,我的程序可能每次使用30分钟到1小时,但我仍然需要能够跟踪使用日期。 – Skitzafreak

也许尝试加载了配置文件后更改名称

from datetime inport datetime 

logging.config.fileConfig('logging.conf') 
logging.basicConfig(filename = datetime.now().strftime('%Y_%m_%d.log')) 
+1

不幸的是,这不起作用。一旦配置文件加载,我似乎无法修改文件名 – Skitzafreak

+0

是的,这只是一个猜测,试试nofinator的建议如下:* timedrotatingfilehandler * –

+0

我一直在看看它,我会如果它有帮助,将其标记为答案。感谢您的帮助。 – Skitzafreak

这对我有效。

更新此: ARGS =(。datetime.now()的strftime( '%Y_%M_%d.log'), 'A')

ARGS =(__进口__(” 。日期时间“)datetime.now()的strftime( '%Y_%M_%d.log'), 'A')

参考(例无3):http://python-reference.readthedocs.io/en/latest/docs/functions/eval.html