首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python日志记录-将日期设置为文件名

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

Stack Overflow用户
提问于 2017-08-02 03:22:44
回答 8查看 29K关注 0票数 23

我正致力于在我的Python项目中实现日志记录,但遇到了一些问题。我正在尝试设置我的日志,以便处理程序和Formatters都被组织到一个配置文件中。我现在要做的是设置我的fileHandler,这样它就会创建一个类似这样的日志文件:YYYY_MM_DD.log显然是这样的,Y代表年份,M代表月份,D代表日期。

这是我在我的配置文件中尝试的:

代码语言:javascript
复制
[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

我用来测试配置的文件非常简单:

代码语言:javascript
复制
import logging
import logging.config

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

目前我得到的具体错误是:

代码语言:javascript
复制
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')"

我已经尝试按照错误的说明更改%Y%m%d,但这并不能解决问题。如何设置配置文件,使我的日志文件看起来像我想要的那样?

我需要注意的是,当我将文件名改为test.log时,一切都运行得很好,所以这似乎是我遇到的唯一错误。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2017-08-02 04:25:13

您不能在配置文件中使用datetime,因为它不知道它的含义。但是,您可以在python文件本身中添加Filehandler

代码语言:javascript
复制
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")

这样,您就可以在处理程序中将日期设置为文件名。

这是配置文件,请注意,您在最后一个格式化程序中有一个拼写错误,您输入的是fillname而不是filename,并且您在message中忘记了(

代码语言:javascript
复制
[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

这应该可以很好地工作。

票数 15
EN

Stack Overflow用户

发布于 2018-02-08 13:21:49

这对我很有效。

更新此内容,

代码语言:javascript
复制
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')

有了这个,

代码语言:javascript
复制
args=(\__import__("datetime").datetime.now().strftime('%Y_%m_%d.log'), 'a')

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

票数 5
EN

Stack Overflow用户

发布于 2018-07-03 19:39:16

在格式化字符串中使用双‘%’字符,结合Abhishek建议的方法,在我的例子(Python3.5)中得到了一个可行的解决方案:

然后,配置文件中的文件处理程序应该与下面的文件处理程序类似:

代码语言:javascript
复制
[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')
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45446099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档