Django 日志记录,在开发中记录到文件,而无需在生产中创建文件
Django logging, log to file in development without needing to create the file in production
我正在一个项目中实现 Django 日志记录。我让它正常工作,以便将日志条目插入到我们开发环境中的文件中,并插入到我们生产环境中的数据库中。
我遇到的问题是 Django 需要创建日志文件,即使在非开发环境中它是空的。
是否有更好的方法来实现这一点,以便在非开发环境中不创建空日志文件?
我的代码:
settings.py
日志配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
},
'is_not_dev_environment': {
'()': 'lib.log.log.IsNotDevEnvironment'
},
'is_dev_environment': {
'()': 'lib.log.log.IsDevEnvironment'
}
},
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
'custom': {
'format': CUSTOM_LOGGING_FORMAT,
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'db': {
'level': LOGGING_LEVEL,
'filters': ['is_not_dev_environment'],
'class': 'lib.log.log.DBLogHandler',
'formatter': 'custom'
},
'file': {
'level': LOGGING_LEVEL,
'filters': ['is_dev_environment'],
'filename': /var/log/django.log,
'class': 'lib.log.log.FileLogHandler',
'formatter': 'custom',
},
},
'loggers': {
'django': {
'handlers': ['mail_admins'],
'level': LOGGING_LEVEL,
'propagate': True,
}
}
}
LOGGING['loggers'].update({app: copy.deepcopy(LOCAL_APP_LOGGER) for app in LOCAL_APPS})
lib/log/log.py
包含过滤 类:
class IsNotDevEnvironment(logging.Filter):
def filter(self, record):
return settings.ENVIRONMENT != 'DEV'
class IsDevEnvironment(logging.Filter):
def filter(self, record):
return settings.ENVIRONMENT == 'DEV'
我选择了另一个符合我要求的选项。我遇到的主要问题是,在我们的测试环境中,我们无法创建日志文件(无法在 CI 提供商的系统上使用 sudo 操作文件)。我通过添加逻辑来根据测试环境中的环境变量禁用日志记录来解决这个问题。
tests/config.py
:
from logging.config import dictConfigClass
from django.conf import settings
def logging_config(config):
disable_logging = getattr(settings, 'DISABLE_LOGGING', False)
if not disable_logging:
dictConfigClass(config).configure()
另一种方法是根据某些逻辑设置处理程序:
if ENVIRONMENT == 'DEV':
LOGGING['handlers'].update({
""" Dict specifying dev handler """
})
else:
LOGGING['handlers'].update({
""" Dict specifying production handler """
})
我正在一个项目中实现 Django 日志记录。我让它正常工作,以便将日志条目插入到我们开发环境中的文件中,并插入到我们生产环境中的数据库中。
我遇到的问题是 Django 需要创建日志文件,即使在非开发环境中它是空的。
是否有更好的方法来实现这一点,以便在非开发环境中不创建空日志文件?
我的代码:
settings.py
日志配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
},
'is_not_dev_environment': {
'()': 'lib.log.log.IsNotDevEnvironment'
},
'is_dev_environment': {
'()': 'lib.log.log.IsDevEnvironment'
}
},
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
'custom': {
'format': CUSTOM_LOGGING_FORMAT,
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'db': {
'level': LOGGING_LEVEL,
'filters': ['is_not_dev_environment'],
'class': 'lib.log.log.DBLogHandler',
'formatter': 'custom'
},
'file': {
'level': LOGGING_LEVEL,
'filters': ['is_dev_environment'],
'filename': /var/log/django.log,
'class': 'lib.log.log.FileLogHandler',
'formatter': 'custom',
},
},
'loggers': {
'django': {
'handlers': ['mail_admins'],
'level': LOGGING_LEVEL,
'propagate': True,
}
}
}
LOGGING['loggers'].update({app: copy.deepcopy(LOCAL_APP_LOGGER) for app in LOCAL_APPS})
lib/log/log.py
包含过滤 类:
class IsNotDevEnvironment(logging.Filter):
def filter(self, record):
return settings.ENVIRONMENT != 'DEV'
class IsDevEnvironment(logging.Filter):
def filter(self, record):
return settings.ENVIRONMENT == 'DEV'
我选择了另一个符合我要求的选项。我遇到的主要问题是,在我们的测试环境中,我们无法创建日志文件(无法在 CI 提供商的系统上使用 sudo 操作文件)。我通过添加逻辑来根据测试环境中的环境变量禁用日志记录来解决这个问题。
tests/config.py
:
from logging.config import dictConfigClass
from django.conf import settings
def logging_config(config):
disable_logging = getattr(settings, 'DISABLE_LOGGING', False)
if not disable_logging:
dictConfigClass(config).configure()
另一种方法是根据某些逻辑设置处理程序:
if ENVIRONMENT == 'DEV':
LOGGING['handlers'].update({
""" Dict specifying dev handler """
})
else:
LOGGING['handlers'].update({
""" Dict specifying production handler """
})