如何以DRY方式为不同设置配置不同的日志文件位置?

4 投票
2 回答
1839 浏览
提问于 2025-04-15 12:59

我在一个Django项目中使用Python的logging模块。我在settings.py文件中进行基本的日志配置,差不多是这样的:

import logging   
import logging.handlers
logger = logging.getLogger('project_logger')
logger.setLevel(logging.INFO)

LOG_FILENAME = '/path/to/log/file/in/development/environment'
handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, when = 'midnight')
formatter = logging.Formatter(LOG_MSG_FORMAT)
handler.setFormatter(formatter)
logger.addHandler(handler)

我有一个单独的设置文件用于生产环境。这个文件(production.py)会从settings中导入所有内容,并覆盖一些选项(比如把DEBUG设置为False)。我想在生产环境中使用一个不同的LOG_FILENAME。我该怎么做呢?我可以在production.py中重复整个配置部分,但如果/path/to/log/file/in/development/environment在生产机器上不存在,就会出现问题。而且这样做看起来也不太“干净”。

有没有人能建议一个更好的办法呢?

2 个回答

1

你为什么不把这些语句放在settings.py的最后面,并在开发时使用DEBUG标志呢?

像这样:

import logging   
import logging.handlers
logger = logging.getLogger('project_logger')
logger.setLevel(logging.INFO)

[snip]
if DEBUG:
    LOG_FILENAME = '/path/to/log/file/in/development/environment'
else:
    LOG_FILENAME = '/path/to/log/file/in/production/environment'

handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, when = 'midnight')
formatter = logging.Formatter(LOG_MSG_FORMAT)
handler.setFormatter(formatter)
logger.addHandler(handler)
1

找到了一个相对“干净”的解决方案,效果不错。感谢 Django中的Python日志记录

我现在有一个 log.py 文件,内容大致如下:

import logging, logging.handlers
from django.conf import settings

LOGGING_INITIATED = False
LOGGER_NAME = 'project_logger'

def init_logging():
    logger = logging.getLogger(LOGGER_NAME)
    logger.setLevel(logging.INFO)
    handler = logging.handlers.TimedRotatingFileHandler(settings.LOG_FILENAME, when = 'midnight')
    formatter = logging.Formatter(LOG_MSG_FORMAT)
    handler.setFormatter(formatter)
    logger.addHandler(handler)

if not LOGGING_INITIATED:
    LOGGING_INITIATED = True
    init_logging()

我的 settings.py 文件现在包含:

LOG_FILENAME = '/path/to/log/file/in/development/environment

production.py 文件包含:

from settings import *
LOG_FILENAME = '/path/to/log/file/in/production/environment'

撰写回答