Skip to main content
 首页 » 编程设计

python之Django 一致的自定义日志格式

2025年05月04日34txw1958

我正在尝试为 Django 配置日志记录,以便在日志的每一行(如果设置)中都有 session_key。我想我找到了一个方法:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
        'request': { 
            'format': '%(asctime)s %(levelname)-8s [%(sessid)s] %(message)s', 
        }, 
    }, 
    'filters': { 
        'request': { 
            '()': 'yellowballs.yblogging.RequestFilter' 
        }, 
    }, 
    'handlers': { 
        'console': { 
            'level': 'DEBUG', 
            'class': 'logging.StreamHandler', 
            'filters': ['request'], 
            'formatter': 'request', 
        } 
    }, 
    'loggers': { 
        'django': { 
            'handlers': ['console'], 
            'level': 'DEBUG', 
            'propagate': True, 
        }, 
    }, 
} 

像这样定义过滤器:

class RequestFilter(logging.Filter): 
    def filter(self, record): 
        session_store = SessionStore() 
        record.sessid = session_store.session_key 
        return True 

它似乎运行良好,但 Django 以其默认格式记录其消息:

2013-03-01 08:44:41,359 WARNING  [None] Not Found: / 
[01/Mar/2013 08:44:41] "GET / HTTP/1.1" 200 1962 

如何让行 [01/Mar/2013 08:44:41] "GET/HTTP/1.1"200 1962 以与日志其余部分相同的格式显示?

是否有一种简单而漂亮的方法来覆盖所有 Django 的默认格式,以便日志消息在整个项目中保持一致?

请您参考如下方法:

覆盖对我有用的默认日志格式。 需要停止传播。

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
        "verbose": { 
            "format": ( 
                "%(levelname)s %(name)s %(message)s [PID:%(process)d:%(threadName)s]" 
            ) 
        }, 
    }, 
    'handlers': { 
        'console': { 
            'class': 'logging.StreamHandler', 
            'formatter': 'verbose', 
        }, 
    }, 
    'loggers': { 
        'django.server': { 
            'handlers': ['console'], 
            'level': 'DEBUG', 
            'propagate': False, ### NOTE HERE !!! 
        } 
    } 
}