我想每天将 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)