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

Ski*_*eak 11 python logging

我正在努力在我的Python项目中实现日志记录,并且遇到了一些障碍.我正在尝试设置我的日志记录,以便处理程序和格式化程序都组织到一个配置文件中.我现在要做的是设置我fileHandler将创建一个看起来像这样的日志文件:YYYY_MM_DD.log显然Y代表年份,M代表月份,D代表当天.

这是我尝试使用我的配置文件:

[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
Run Code Online (Sandbox Code Playgroud)

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

import logging
import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('MainLogger')
logger.debug("TEST")
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试更改了%Y,%m并且%d正如错误所说,但这并不能解决问题.我如何设置配置文件,以便我的日志文件看起来像我想要的那样?

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

nof*_*tor 7

也许您可以改用 Python TimedRotatingFileHandler。您可以设置间隔,以日期为后缀每天创建一个新的日志文件。

文档--

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

此外,它使用的后缀是“%Y-%m-%d”,这与您想要的有点不同。但是有一个问题,SO这里你可以如何改变这一点。


Dro*_*Av. 7

您无法datetime在配置文件中使用,因为它不知道这意味着什么。不过,您可以Filehandler在python文件本身中添加:

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")
Run Code Online (Sandbox Code Playgroud)

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

这是配置文件,请注意,您在最后一个格式化程序中输入了错字,您输入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
Run Code Online (Sandbox Code Playgroud)

这应该工作正常。


小智 6

在格式字符串中使用双“%”字符并结合Abhishek建议的方法在我的案例中得到了一个可行的解决方案(Python 3.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')
Run Code Online (Sandbox Code Playgroud)


Abh*_*hek 5

这对我有用。

更新这个,

args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')
Run Code Online (Sandbox Code Playgroud)

有了这个,

args=(\__import__("datetime").datetime.now().strftime('%Y_%m_%d.log'), 'a')
Run Code Online (Sandbox Code Playgroud)

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