如何在 Python Django 的设置中启用每日新文件名登录?
How to enable daily new filename of logging in Python Django's Settings?
我想将每天 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,
},
},
如果服务器启动,例如在 01.01.2018,将创建“2018-01-01.log”并将所有日志写入文件,即使调用是在 15.01,因为 settings.py 是 运行 01.01 开服时只有一次。
Django 如何每天创建一个新的日志文件并使用该文件?
一种方法是在你的 django 应用程序中使用一个守护进程,运行每隔 X 天创建一个新的日志文件供你写入。
我推荐的一个库是 APScheduler,它允许您将函数修饰为 运行 像时间表一样的 crontab。
这可以使用 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',
},
}
...
在
查看更多详细信息
或者,您可以使用外部工具来处理此问题,例如 logrotate 请参阅 daily
作为此工具配置中的选项以满足您的需要。
我现在"PermissionError: [WinError 32] The process cannot access the file because it is being used by another."所以日志文件不能重命名。为什么?
Traceback (most recent call last):
File "C:\Users\E945826\Python\lib\logging\handlers.py", line 72, in emit
self.doRollover()
File "C:\Users\E945826\Python\lib\logging\handlers.py", line 396, in doRollover
self.rotate(self.baseFilename, dfn)
File "C:\Users\E945826\Python\lib\logging\handlers.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:\Users\E945826\Python\lib\threading.py", line 884, in _bootstrap
self._bootstrap_inner()
File "C:\Users\E945826\Python\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\E945826\Python\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\E945826\Python\lib\socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "C:\Users\E945826\Python\lib\socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Users\E945826\Python\lib\socketserver.py", line 696, in __init__
self.handle()
File "C:\Users\E945826\Python\lib\site-packages\django\core\servers\basehttp.py", line 155, in handle
handler.run(self.server.get_app())
File "C:\Users\E945826\Python\lib\wsgiref\handlers.py", line 138, in run
self.finish_response()
File "C:\Users\E945826\Python\lib\wsgiref\handlers.py", line 183, in finish_response
self.close()
File "C:\Users\E945826\scrubbing
Python\lib\wsgiref\simple_server.py", line 35, in close
self.status.split(' ',1)[0], self.bytes_sent
File "C:\Users\E945826\Python\lib\http\server.py", line 536, in log_request
self.requestline, str(code), str(size))
File "C:\Users\E945826\Python\lib\site-packages\django\core\servers\basehttp.py", line 124, in log_message
level(format, *args, extra=extra)
我想将每天 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,
},
},
如果服务器启动,例如在 01.01.2018,将创建“2018-01-01.log”并将所有日志写入文件,即使调用是在 15.01,因为 settings.py 是 运行 01.01 开服时只有一次。
Django 如何每天创建一个新的日志文件并使用该文件?
一种方法是在你的 django 应用程序中使用一个守护进程,运行每隔 X 天创建一个新的日志文件供你写入。
我推荐的一个库是 APScheduler,它允许您将函数修饰为 运行 像时间表一样的 crontab。
这可以使用 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',
},
}
...
在
或者,您可以使用外部工具来处理此问题,例如 logrotate 请参阅 daily
作为此工具配置中的选项以满足您的需要。
我现在"PermissionError: [WinError 32] The process cannot access the file because it is being used by another."所以日志文件不能重命名。为什么?
Traceback (most recent call last):
File "C:\Users\E945826\Python\lib\logging\handlers.py", line 72, in emit
self.doRollover()
File "C:\Users\E945826\Python\lib\logging\handlers.py", line 396, in doRollover
self.rotate(self.baseFilename, dfn)
File "C:\Users\E945826\Python\lib\logging\handlers.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:\Users\E945826\Python\lib\threading.py", line 884, in _bootstrap
self._bootstrap_inner()
File "C:\Users\E945826\Python\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\E945826\Python\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\E945826\Python\lib\socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "C:\Users\E945826\Python\lib\socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Users\E945826\Python\lib\socketserver.py", line 696, in __init__
self.handle()
File "C:\Users\E945826\Python\lib\site-packages\django\core\servers\basehttp.py", line 155, in handle
handler.run(self.server.get_app())
File "C:\Users\E945826\Python\lib\wsgiref\handlers.py", line 138, in run
self.finish_response()
File "C:\Users\E945826\Python\lib\wsgiref\handlers.py", line 183, in finish_response
self.close()
File "C:\Users\E945826\scrubbing
Python\lib\wsgiref\simple_server.py", line 35, in close
self.status.split(' ',1)[0], self.bytes_sent
File "C:\Users\E945826\Python\lib\http\server.py", line 536, in log_request
self.requestline, str(code), str(size))
File "C:\Users\E945826\Python\lib\site-packages\django\core\servers\basehttp.py", line 124, in log_message
level(format, *args, extra=extra)