複数のモジュールと複数のハンドラーのロギングをどのように行うべきかについての具体的なアドバイスを探しています。ここに簡略化したコードを追加しましたが、答えにバイアスをかけたくありません。ベストプラクティスを教えてください。
すべてをファイルに記録し、コンソールに警告以上を記録したいと思います。
これは私level0.py
が指定したファイルに記録したいものです:
import logging
from flask import Flask
from level1 import function1
app = Flask(__name__)
logger = logging.getLogger('logger0')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('../logs/logger0','w','utf-8')
file_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d in %(funcName)s]')
file_handler.setFormatter(file_format)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_format = logging.Formatter('%(message)s')
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
@app.route('/', methods=['GET', 'POST'])
def function0(foo):
bar = function1(foo)
logger.debug('function0')
...
また、level1
スクリプトとして呼び出された場合、スタンドアロンモジュールにすることもできます。その場合、別のファイルに記録したいと思います。以下はlevel1.py
(重複したロギングラインがあります):
import logging
logger = logging.getLogger('level0.level1')
from level2 import function2
def function1(foo):
bar = function2(foo)
logger.debug('function1')
...
if __name__ == "__main__":
logger = logging.getLogger('logger0')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('../logs/logger1','w','utf-8')
file_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d in %(funcName)s]')
file_handler.setFormatter(file_format)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_format = logging.Formatter('%(message)s')
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
bar = function1('foo')
logger.info('level1 main')
...
このロギングチャンクをからコピーしましlevel0
た。同じロギングが必要であり、メインに配置するのが直感的であるように思われたためです。level2
スタンドアロンではないため、次の機能のみがあります。
import logging
logger = logging.getLogger('level0.level1.level2')
def function2(foo):
logger.info('function2')
....
私はから始めましlogging.basicSetup
たが、ファイルのエンコーディングを設定できず、UnicodeEncodeError
ASCII以外の文字列をログに記録しようとすると取得し続けました:
logger.warn(u'foo bar {}'.format(NON_ASCII_STR))
(ロガーがその親にメッセージを渡すときに、まだエラーが発生します)
したがって、この場合、またはより一般的には、複数のモジュール(エンコーディングを選択した場合-utf-8が必要)に最適なログ設計は何ですか?