2017-06-30 8 views
2

これはPython 2.7のためのものです....python logging:FileHandlerの出力ファイルを置き換えるには?

私はDjangoプロジェクトを持っていますが、私はlogging.config.dictConfig(CONFIG)を使ってDjangoアプリケーションをサーバーとして実行するときに必要なログを取得します。 mycore.loggingに独自のモジュールがあり、インポート時にロガーオブジェクトが作成されます。これはすべて素晴らしいです。

しかし、Djangoは独立した '管理コマンド'を持っており、それぞれの管理コマンドを別々のファイルに記録したいと思います。ログファイル名は、管理コマンドの名前+ ".log"になります。

私は検索して、Google検索し、これの例は見つかりませんでした。それは本当に珍しいですか?あるいは私は先行技術を見つけていないのですか?

私は、既存のFileHandlerを削除し、希望する出力ファイルで新しいインスタンスをインスタンス化し、それをロガーオブジェクトのハンドラとして追加する方法を知っていると思います。

しかし、それはやっかいなことのようです。どんなアドバイスも歓迎されます。

import logging 
import logging.config 
from logutils.colorize import ColorizingStreamHandler 
from django.conf import settings 

class ColorHandler(ColorizingStreamHandler): 
    def __init__(self, *args, **kwargs): 
     super(ColorHandler, self).__init__(*args, **kwargs) 
     self.level_map = { 
       # Provide your custom coloring information here 
       logging.DEBUG: (None, 'blue', False), 
       logging.INFO: (None, 'green', False), 
       logging.WARNING: (None, 'yellow', False), 
       logging.ERROR: (None, 'red', False), 
       logging.CRITICAL: ('red', 'white', True), 

     } 

try: 
    CONSOLE_LOG_LEVEL = settings.CONSOLE_LOG_LEVEL 
except AttributeError as ae: 
    CONSOLE_LOG_LEVEL = logging.INFO 
try: 
    FILE_LOG_LEVEL = settings.FILE_LOG_LEVEL 
except AttributeError as ae: 
    FILE_LOG_LEVEL = logging.DEBUG 

CONFIG = { 
    'version':1, 
    'disable_existing_loggers': True, 
    'handlers':{ 
     'console': { 
      '()':ColorHandler, 
      'level': CONSOLE_LOG_LEVEL, 
      'formatter': 'simplest', 
      'stream': 'ext://sys.stdout', 
     }, 
     'file': { 
      'class': 'logging.handlers.RotatingFileHandler', 
      'level': FILE_LOG_LEVEL, 
      'formatter': 'simplest', 
      'filename': './log-oxfam.txt', 
      'mode': 'a', 
      'maxBytes': 10485760, 
      'backupCount': 5, 
     }, 
    }, 
    'formatters': { 
     'simplest': { 
      'format': '%(levelname)-8s %(message)s', 
     }, 
     'time_level_message': { 
      'format': '%(asctime)s %(levelname)-8s %(message)s', 
     }, 
     'detailed': { 
      'format': '%(asctime)s %(module)s line:%(lineno)-4d %(levelname)-8s %(message)s', 
     }, 
    }, 
    'loggers': { 
     'myDjangoApp': { 
      'level':'DEBUG', 
      'handlers':['console', 'file'], 
      ###'handlers':['console'], 
     }, 
    }, 
} 

logging.config.dictConfig(CONFIG) 
logger = logging.getLogger("myDjangoApp") 

答えて

1

私はlogging.handlers.QueueHandlerの周りに解決策を設定します。それは、倉庫に縛られていない唯一のものです。あなたのリスナーは、実行時に物事をどこに置くかを決めることができます。

+0

私の悪いです。私はPython 2.7で解決策が必要です。私はそうするための説明を明確にした。 –

+0

簡単な解決方法はありません。あなたは、何とかMemoryViewにQueueを持たない古いスレッディング・ライブラリをスレッドするように教えなければならないでしょう(幸いなことに、コレクション・デクはありますが、まだあります)。私は今なぜ私が3.xに移行したかを覚えています:) – Melvyn

+0

私は私が望むことについてはっきりしていないと思います。ここに要約があります: - インポート時に、私のユーティリティコードはログオブジェクトをインスタンス化します。それは私が必要とするものです。 - __main __()時には、選択された独立したコマンドで、私のロガーオブジェクト内に存在するFileHandlerを、元のファイルと同じ属性を持つ新しいFileHandlerオブジェクトに置き換えたいファイル。 –

関連する問題