如何在 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)