後
/package_name
__main__.py <- where I put my logging configuration
__init__.py <- conveniance for myself, not necessary
/tests
/package_name <- Actual flask app
__init__.py
/views
/static
/templates
/lib
のように構成されている...
我々はに着陸モジュールですflask.logging.py
は、create_logger(app)
という名前の関数を定義しています。その機能を調べることで、Flaskでログの問題をトラブルシューティングする際に潜在的な犯人についての手がかりを得ることができます。
その関数における紛争の最初の原因は、この行です:
変数app.logger_name
が自身であるimport_name
の値にFlask.__init__()
方法、に設定されている:
logger = getLogger(app.logger_name)
理由を見てみましょう受信パラメータはFlask(__name__)
です。つまり、app.logger_name
には__name__
の値が割り当てられます。これは主パッケージの名前になります。この例では「awesomeapp」としましょう。
これで、独自のロガーを手動で設定して作成することにしたとします。もしあなたのプロジェクトの名前が "awesomeapp"であれば、その名前を使ってロガーを設定する可能性もあると思いますが、それはかなり可能性が高いと思います。
my_logger = logging.getLogger('awesomeapp') # doesn't seem like a bad idea
fh = logging.FileHandler('/tmp/my_own_log.log')
my_logger.setLevel(logging.DEBUG)
my_logger.addHandler(fh)
いくつかの問題を除いて、これを行うことは理にかなっています。
Flask.logger
プロパティが初めて呼び出されたとき、それは順番に機能flask.logging.create_logger()
呼び出すと、次のアクションが続いて起こる:
logger = getLogger(app.logger_name)
を、プロジェクトの後にあなたのロガーの命名方法を覚えているとどのようにapp.logger_name
共有しています名前も?上記のコード行では、関数logging.getLogger()
が以前に作成されたロガーを取得したので、後であなたの頭を傷つけるような方法でそれを混乱させることになります。例えば、
ポーフォー、以前にロガーに登録していたハンドラーをすべて失っただけです。
その他の事項は、機能の中で起こりますが、細かいことはありません。sys.stderr
および/またはResponse
オブジェクトに吐き出される2つのlogging.StreamHandler
オブジェクトを作成して登録します。 1つはログレベル 'デバッグ'用で、もう1つは 'プロダクション'用です。私たちの手で構成されたロガーがフラスコに巻き込ま時に動作が異常なようだなぜそれが明確になるはずです点灯する上記の詳細と
class DebugLogger(Logger):
def getEffectiveLevel(self):
if self.level == 0 and app.debug:
return DEBUG
return Logger.getEffectiveLevel(self)
class DebugHandler(StreamHandler):
def emit(self, record):
if app.debug and _should_log_for(app, 'debug'):
StreamHandler.emit(self, record)
class ProductionHandler(StreamHandler):
def emit(self, record):
if not app.debug and _should_log_for(app, 'production'):
StreamHandler.emit(self, record)
debug_handler = DebugHandler()
debug_handler.setLevel(DEBUG)
debug_handler.setFormatter(Formatter(DEBUG_LOG_FORMAT))
prod_handler = ProductionHandler(_proxy_stream)
prod_handler.setLevel(ERROR)
prod_handler.setFormatter(Formatter(PROD_LOG_FORMAT))
logger.__class__ = DebugLogger
logger.addHandler(debug_handler)
logger.addHandler(prod_handler)
。新しい情報は私達に新しいオプションを与えます。別のロガーを保持したい場合は、プロジェクトとは別の名前(例:my_logger = getLogger('awesomeapp_logger')
)にするのが最も簡単な方法です。別のオプションとして、Flaskのログ記録プロトコルと一貫性を持たせたい場合は、Flaskと同様の方法でFlask.logger
にlogging.FileHandler
オブジェクトを登録することです。
def enable_file_logging(app):
import logging
from flask.logging import _should_log_for
logging_path = app.config['LOGGING_PATH']
class DebugFileHandler(logging.FileHandler):
def emit(self, record):
if app.debug and _should_log_for(app, 'debug'):
logging.FileHandler.emit(self, record)
debug_file_handler = DebugFileHandler('/tmp/my_own_log.log')
app.logger.addHandler(debug_file_handler)
app = Flask(__name__)
enable_file_logging(app)
'app.debug = True'を設定するとどうなりますか? – dAnjou
何も変更はありません – fleshgolem