2

プロジェクトに 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'
4

1 に答える 1

0

私は自分の要件を満たす別のオプションに落ち着きました。私が抱えていた主な問題は、テスト環境でログ ファイルを作成できなかったことです (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 """
    })
于 2016-04-19T19:02:56.077 に答える