これは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")
私の悪いです。私はPython 2.7で解決策が必要です。私はそうするための説明を明確にした。 –
簡単な解決方法はありません。あなたは、何とかMemoryViewにQueueを持たない古いスレッディング・ライブラリをスレッドするように教えなければならないでしょう(幸いなことに、コレクション・デクはありますが、まだあります)。私は今なぜ私が3.xに移行したかを覚えています:) – Melvyn
私は私が望むことについてはっきりしていないと思います。ここに要約があります: - インポート時に、私のユーティリティコードはログオブジェクトをインスタンス化します。それは私が必要とするものです。 - __main __()時には、選択された独立したコマンドで、私のロガーオブジェクト内に存在するFileHandlerを、元のファイルと同じ属性を持つ新しいFileHandlerオブジェクトに置き換えたいファイル。 –