Python Logging - Set Date as Filename
我正致力于在我的Python项目中实现日志记录,并且遇到了一些障碍。我正在尝试设置日志,以便将处理程序和格式化程序都组织到配置文件中。我现在要做的是建立我的
这是我对配置文件的尝试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [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 |
我用来测试配置的文件非常简单:
1 2 3 4 5 6 | import logging import logging.config logging.config.fileConfig('logging.conf') logger = logging.getLogger('MainLogger') logger.debug("TEST") |
目前我遇到的具体错误是:
1 | configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found:"%Y_%m_%d.log'), 'a')" |
我试过按错误所说的更改
当我将文件名改为
这对我很有用。
更新此:args=(datetime.now().strftime("%y_uum_ud.log"),'a')
到
args=(u import_uuuu("datetime").datetime.now().strftime("%y_uum_ud.log"),'a')
参考(示例3):http://python-reference.readthedocs.io/en/latest/docs/functions/eval.html
在配置文件中不能使用
1 2 3 4 5 6 7 8 9 10 11 12 | 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") |
这样就可以在处理程序中将日期设置为文件名。
这是配置文件,注意您在最后一个格式化程序中输入了错误,您把
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [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 |
这应该很管用。
也许您可以使用python的
文件——
- python 2:https://docs.python.org/2/library/logging.handlers.html timedrotatingfilehandler
- python 3:https://docs.python.org/3/library/logging.handlers.html timedrotatingfilehandler
请注意,当前日志文件没有日期。此文件处理程序仅在新的一天开始时添加日期后缀。
另外,它使用的后缀是"%y-%m-%d",这与您想要的略有不同。但是这里有一个关于如何改变它的问题。
在格式字符串中使用双"%"-字符,结合Abhishek建议的方法,在我的例子中得到了一个有效的解决方案(python 3.5):
然后,配置文件中的文件处理程序应类似于此处理程序:
1 2 3 4 5 | [handler_fileHandler] class=FileHandler level=DEBUG formatter=defaultFormatter args=(__import__("datetime").datetime.now().strftime('/your_path/your_file_name_%%Y-%%m-%%d_%%H-%%M-%%S.log'), 'a') |
可能在加载配置文件后尝试更改名称:
1 2 3 4 | from datetime inport datetime logging.config.fileConfig('logging.conf') logging.basicConfig(filename = datetime.now().strftime('%Y_%m_%d.log')) |
这也起作用。
1 2 3 | from dateime import datetime log_file = str(datetime.utcnow().strftime('%m_%d_%Y_%I_%M_%S')) + '.log' logging.basicConfig(filename=log_file, format='%(levelname)s | %(asctime)s | %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.DEBUG) |
日志文件名:04__2018_10_03_01.log
这将使用配置文件中的内容,但不会直接访问该文件。您创建自己的文件处理程序,然后将其添加到记录器中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) |
注意,EDOCX1(append)是文件处理程序的默认