关于Python日志记录:将日期设置为文件名

Python Logging - Set Date as Filename

我正致力于在我的Python项目中实现日志记录,并且遇到了一些障碍。我正在尝试设置日志,以便将处理程序和格式化程序都组织到配置文件中。我现在要做的是建立我的fileHandler,这样它将创建一个类似这样的日志文件:YYYY_MM_DD.log,显然y代表年,m代表月,d代表日。

这是我对配置文件的尝试:

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')"

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

当我将文件名改为test.log时,我应该注意到一切都很好,所以这是我在这方面唯一的错误。


这对我很有用。

更新此: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


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

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")

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

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

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的TimedRotatingFileHandler。您可以设置每天以日期作为后缀创建新日志文件的间隔。

文件——

  • 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)是文件处理程序的默认mode参数。