2016-04-18 7 views
1

プロジェクトにDjangoのロギングを実装しています。私は、ログエントリが私たちの開発環境のファイルと、運用環境のデータベースに挿入されるように動作させました。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' 

答えて

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 """ 
    }) 
関連する問題