2016-10-05 4 views
4

私は、Pythonフラスコアプリケーションがあり、エントリ・ファイルはアプリのロガーを設定し、そのよう:メインFlaskモジュールの外部にログオンするにはどうしたらいいですか?

app = Flask(__name__) 
handler = logging.StreamHandler(sys.stdout) 
app.logger.addHandler(handler) 
app.logger.setLevel(logging.DEBUG) 

私はその後、正常に動作

app.logger.debug("Log Message")

を使用してロギングの束を行います。しかし、私のようないくつかのAPI関数があります。私はそのServiceモジュール/ Pythonのクラス内でのロギング行うことができますどのように私が知りたいのですがどのような

@app.route('/api/my-stuff', methods=['GET']) 
def get_my_stuff(): 
    db_manager = get_manager() 
    query = create_query(request.args) 

    service = Service(db_manager, query) 
    app.logger.debug("Req: {}".format(request.url)) 

です。私はそれにアプリを渡す必要がありますか?それは悪い習慣のようですが、私はメインのFlaskファイルの外側からapp.loggerへのハンドルを取得する方法を知らない...

+0

可能重複http://stackoverflow.com/questions/22944387/configure-module-logger-to-flask-app-logger – CasualDemon

+0

私はその質問を見ましたが、答えは非常に貧しく、私には意味がありません。 – user4184113

答えて

4

これは重複している可能性がありますが、 Pythonロギング知識の小さなビット。

ロガーを通過させないでください。あなたはいつでも任意のロガーにlogging.getLogger(<log name as string>)でアクセスすることができます。デフォルトでは、フラスコはFlaskクラスに指定した名前を使用します。

メインモジュールの名前が「my_tool」の場合は、モジュールでlogger = logging.getLogger('my_tool')とします。

これを追加するには、私のロガーとパッケージの名前を明示したいので、Flask('my_tool') **とし、他のモジュールでは、サブレベルのロガーが好きです。 logger = logging.getLogger('my_tool.services')はすべて同じルートロガー(およびハンドラー)を使用します。

*他の回答に基づく経験はありません。

**再び、フラスコを使用していない、DKそれは良い習慣である場合

編集:スーパー簡単な愚かな例

メインフラスコアプリ

import sys 
import logging 

import flask 

from module2 import hi 

app = flask.Flask('tester') 

handler = logging.StreamHandler(sys.stdout) 
handler.setFormatter(logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')) 
app.logger.addHandler(handler) 
app.logger.setLevel(logging.DEBUG) 

@app.route("/index") 
def index(): 
    app.logger.debug("TESTING!") 
    hi() 
    return "hi" 

if __name__ == '__main__': 
    app.run() 

モジュール2

import logging 

log = logging.getLogger('tester.sub') 


def hi(): 
    log.warning('warning test') 

出力

127.0.0.1 - - [04/Oct/2016 20:08:29] "GET /index HTTP/1.1" 200 - 
2016-10-04 20:08:29,098 - tester - DEBUG - TESTING! 
2016-10-04 20:08:29,098 - tester.sub - WARNING - warning test 

編集2:ちょうど一般的な知識のために、サブ・ログ

完全に不要ないじり。

子ロガーを定義すると、.somethingをルートロガー名の後にlogging.getLogger('root.something')に追加することで、基本的に別の名前空間を使用できます。

私はそれを使ってログ機能をグループ化するのが個人的に好きです。したがって、ログの種類を知るには、.toolまたは.dbが必要です。しかし、これらの子ロガーには独自のハンドラーを持たせることもできます。したがって、コードの一部をstderrまたはログにのみ印刷する場合は、そうすることができます。以下は変更されたmodule2の例です。

モジュール2

import logging 
import sys 

log = logging.getLogger('tester.sub') 
handler = logging.StreamHandler(sys.stderr) 
handler.setFormatter(logging.Formatter('%(name)s - %(levelname)s - %(message)s')) 
log.addHandler(handler) 
log.setLevel(logging.INFO) 


def hi(): 
    log.warning("test") 

出力

127.0.0.1 - - [04/Oct/2016 20:23:18] "GET /index HTTP/1.1" 200 - 
2016-10-04 20:23:18,354 - tester - DEBUG - TESTING! 
tester.sub - WARNING - test 
2016-10-04 20:23:18,354 - tester.sub - WARNING - test 
+0

1つの質問 - tester.subのサブ部分は何ですか?サブモジュールの名前はサブモジュールですか? – user4184113

+0

いいえ、それはあなたが望むもので、 'module2'の' logging.getLogger( 'tester.sub') 'で設定します。これは文字通り私がランダムに設定した文字列ですが、ルートは '.sub 'の前に' tester'だったので、メインアプリケーションに設定されたハンドラを使用します。ファンシーになるために、 'module2'のサブロガーにのみ影響を与えるハンドラーを追加することもできます。 – CasualDemon

+0

@ user4184113は私の答えに子ロガーに関する情報を追加しました。あなたが探しているものには本当に必要ではなく、単に共有するための楽しい知識です。 – CasualDemon

関連する問題