如何在Python Django的设置中启用日志记录的每日新文件名?



我想每天将 restful api 的调用记录到 yyyy-mm-dd.log 中。在 settings.py 我写道:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,  
'formatters': {
    'standard': {
        'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
    },
},
'handlers': {
    'infofile': {
        'level': 'INFO',
        'class': 'logging.FileHandler',
        'filename': 'C://mydoc/logs/'+str(datetime.date.today())+'.log',
        'formatter':'standard',
    },        
},
'loggers': {      
    'django': {
        'handlers': ['infofile'],
        'propagate': True,
    },        
},

如果服务器在 2018 年 1 月 1 日启动,则将创建"2018-01-01.log",并将所有日志写入文件,即使调用也在 15.01 上,因为 settings.py 仅在服务器启动时的 01.01 运行一次。

Django 如何每天创建一个新的日志文件并使用它?

可以使用TimedRotatingFileHandler轻松实现

...
'handlers': {
    'infofile': {
        'level': 'INFO',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': 'yourlogbasename.log',
        'when': 'D', # daily, you can use 'midnight' as well
        'backupCount': 100, # 100 days backup
        'formatter': 'verbose',
    },
}
...

查看更多详细信息,请参阅 Django 按日期或小时记录到文件

或者,您可以使用外部工具来解决此问题,例如在此工具的配置中将 logrotate 请参阅daily作为选项以满足您的需求。

一种方法是在 django 应用程序中使用一个守护进程,该进程每 X 天运行一次,并制作新的日志文件供您写入。

我推荐的一个库是APScheduler,它允许您装饰要在类似crontab的调度上运行的函数。

我现在有"权限错误:[WinError 32]进程无法访问该文件,因为它正被另一个进程使用。因此,无法重命名日志文件。为什么?

Traceback (most recent call last):
  File "C:UsersE945826Pythonliblogginghandlers.py", line 72, in emit
    self.doRollover()
  File "C:UsersE945826Pythonliblogginghandlers.py", line 396, in doRollover
    self.rotate(self.baseFilename, dfn)
  File "C:UsersE945826Pythonliblogginghandlers.py", line 113, in rotate
    os.rename(source, dest)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another: 'C:\logs\apicalls' -> 'C:\logs\apicalls.2018-01-17_11-01'
Call stack:
  File "C:UsersE945826Pythonlibthreading.py", line 884, in _bootstrap
    self._bootstrap_inner()
  File "C:UsersE945826Pythonlibthreading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:UsersE945826Pythonlibthreading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:UsersE945826Pythonlibsocketserver.py", line 639, in process_request_thread
    self.finish_request(request, client_address)
  File "C:UsersE945826Pythonlibsocketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:UsersE945826Pythonlibsocketserver.py", line 696, in __init__
    self.handle()
  File "C:UsersE945826Pythonlibsite-packagesdjangocoreserversbasehttp.py", line 155, in handle
    handler.run(self.server.get_app())
  File "C:UsersE945826Pythonlibwsgirefhandlers.py", line 138, in run
    self.finish_response()
  File "C:UsersE945826Pythonlibwsgirefhandlers.py", line 183, in finish_response
    self.close()
  File "C:UsersE945826scrubbing
Pythonlibwsgirefsimple_server.py", line 35, in close
    self.status.split(' ',1)[0], self.bytes_sent
  File "C:UsersE945826Pythonlibhttpserver.py", line 536, in log_request
    self.requestline, str(code), str(size))
  File "C:UsersE945826Pythonlibsite-packagesdjangocoreserversbasehttp.py", line 124, in log_message
    level(format, *args, extra=extra)

最新更新