2016-08-30 7 views
1

私はlithoxylの外観が好きで、徐々に私の現在の使用法をflask.loggerと交換したいと思います。フリル・ロガーにリチオキシルを組み込むうまい方法はありますか?

2つのロギングフレームワークを共存させる良い方法はありますか?

は、これまでのところ私は、次があります。

from flask import current_app 
from werkzeug.local import LocalProxy 

logger = LocalProxy(lambda: current_app.logger) 

class LogAdaptor(object): 
    """file-like object that will write messages to the logger""" 
    def write(self, msg): 
     if msg.strip(): 
      logger.info(msg) 

from lithoxyl import StreamEmitter, SensibleFormatter 

emtr = StreamEmitter(LogAdaptor()) 

fmtr = SensibleFormatter('{level_name_upper} {module_name} {end_message}') 

# ... the rest is basically the same as http://lithoxyl.readthedocs.io/en/latest/overview.html#logging-sensibly 

この多かれ少なかれ作品が、ログレベルは、例えば、出力では失われている:私は必要なものを推測している

DEBUG backend: log message from app.logger.debug 
INFO logger: CRITICAL "backend" "critical action failed" 
INFO logger: DEBUG "backend" "action succeeded" 
DEBUG backend: log message from app.logger.debug 

がありますより複雑なエミッタ、またはFlask.loggerハンドラの基になるストリームの.writeにアクセスする方法(書式設定を迂回するなど)

またはこれはすべて間違ったツリーを吠えています。すべてがリファクタリングされるまで、分割ログファイルを使用して生きていますか?

私は https://github.com/mahmoud/lithoxyl/blob/master/lithoxyl/_syslog_emitter.pyを発見し、類似したクラスを作成したとして、私はいくつかの改善を行うことができた

答えて

1

import logging 
from lithoxyl.common import DEBUG, INFO, CRITICAL, get_level 

class LoggerEmitter(object): 
    priority_map = {DEBUG: {'success': logging.DEBUG, 
          'failure': logging.INFO, 
          'warn': logging.INFO, 
          'exception': logging.WARNING}, 
        INFO: {'success': logging.INFO, 
          'failure': logging.WARNING, 
          'warn': logging.WARNING, 
          'exception': logging.ERROR}, 
        CRITICAL: {'success': logging.WARNING, 
           'failure': logging.ERROR, 
           'warn': logging.ERROR, 
           'exception': logging.CRITICAL}} 

    def __init__(self, logger): 
     self.logger = logger 

    def on_begin(self, begin_event, entry): 
     level = self._get_level('begin', begin_event) 
     self.logger.log(level, entry) 

    def on_warn(self, warn_event, entry): 
     level = self._get_level('warn', warn_event) 
     self.logger.log(level, entry) 

    def on_end(self, end_event, entry): 
     level = self._get_level('end', end_event) 
     self.logger.log(level, entry) 

    def _get_level(self, event_name, action): 
     level = get_level(action.level) 

     if event_name == 'warn': 
      status = 'warn' 
     elif event_name == 'begin': 
      status = 'begin' 
     else: 
      status = action.status 

     return self.priority_map[level][status] 

emtr = LoggerEmitter(logger) 

出力は、今のようなものです:優れている

DEBUG backend: log message from app.logger.debug 
ERROR logger: "backend" "critical action failed" 
DEBUG logger: "backend" "action succeeded" 
DEBUG backend: log message from app.logger.debug 

が、それは希望モジュール名が適切に渡されていればいいと思います。

関連する問題