【问题标题】:Django log to file by date or hourDjango 按日期或时间记录到文件
【发布时间】:2015-11-30 02:41:26
【问题描述】:

我知道 django 可以登录到一个文件,但我想知道如何在不同的时间打印到不同的文件。文件名如20150101.log20150102.log

两个问题:

  1. 我可以通过LOGGING->filename config 来实现吗?
  2. 如果Q1不能,如何动态更改handlers

换句话说,我怎样才能使 django 拆分文件不是按文件大小而是按日期时间。

【问题讨论】:

    标签: django


    【解决方案1】:

    TimedRotatingFileHandler

    要根据日期或时间记录到不同的文件,您可以使用logging.handlers.TimedRotatingFileHandler 类。

    TimedRotatingFileHandler 将所有消息记录到具有您指定名称的文件中。在指定的时间间隔过后,它会将当前文件旋转为具有给定名称并附加日期和时间的文件。

    如果您的文件名是myproject.log,那么在每个间隔结束时,它将将该文件轮换为myproject.log.2015-01-01,然后继续将当前消息记录到myproject.log

    不幸的是,这个类的行为并不像你想象的那样。它不是根据实际日期和时间旋转,而是根据时间间隔旋转。

    如果您选择的时间间隔是 1 天,并且您恰好在 1 月 1 日中午启动 Django,它将不会在午夜轮换并将 1 月 1 日的所有消息放入名为 myproject.log.2015-01-01 的文件中。相反,它将在 1 月 2 日中午轮换,即您开始后 1 天。它将所有消息旋转到一个名为myproject.log.2015-01-02 的文件中。因此,此文件将包含 1 月 1 日和 2 日的消息。

    如果您希望类根据实际时间运行,那么重写该类并专门重写名为 shouldRollover 的方法将是相当简单的。

    至少课程会给你每天的时间间隔,这样你就可以快速找到你需要的日志文件。您只需查看两个文件。

    要在 Django 中进行设置,请执行以下操作:

    LOGGING = { 
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
                'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
                'datefmt' : "%d/%b/%Y %H:%M:%S"
            },
            'simple': {
                'format': '%(levelname)s %(message)s'
            },
        },  
        'handlers': {
            'file': {
                'level': 'INFO',
                'class': 'logging.handlers.TimedRotatingFileHandler',
                'filename': 'myproject.log',
                'when': 'D', # this specifies the interval
                'interval': 1, # defaults to 1, only necessary for other values 
                'backupCount': 10, # how many backup file to keep, 10 days
                'formatter': 'verbose',
            },
    
        },  
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
            },
            '': {
                'handlers': ['file'],
                'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
            }
        },  
    }
    

    【讨论】:

    • 在较新版本的 Python 中,您可以将 'midnight' 指定为 'when',它会按预期翻转
    • @Noah 你为什么不在记录器部分包含`'level': 'DEBUG', 'propagate': True,`?我可能无法理解处理程序和记录器部分之间的区别
    • @Noah logging.handlers.TimedRotatingFileHandler 文件处理程序无法在多进程(请求持续到来的 Web 应用程序)中按预期工作。在轮换时,它会截断日志。请建议哪些适用于 Web 应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2014-06-24
    • 2018-12-27
    • 1970-01-01
    • 2018-01-25
    • 2018-03-28
    相关资源
    最近更新 更多