66

OK、すべてをセットアップするコードは次のとおりです。

if __name__ == '__main__':
    app.debug = False

    applogger = app.logger

    file_handler = FileHandler("error.log")
    file_handler.setLevel(logging.DEBUG)

    applogger.setLevel(logging.DEBUG)
    applogger.addHandler(file_handler)

    app.run(host='0.0.0.0')

何が起こるかは

  1. error.log が作成される
  2. そこには何も書かれていません
  3. StreamHandler を追加せず、デバッグを false に設定しているにもかかわらず、すべてを STDOUT に取得します (これは正しいかもしれませんが、それでも奇妙に思えます)。

私はどこかで完全に離れているのでしょうか、それとも何が起こっているのでしょうか?

4

7 に答える 7

119

なぜこのようにしないのですか:

if __name__ == '__main__':
    init_db()  # or whatever you need to do

    import logging
    logging.basicConfig(filename='error.log',level=logging.DEBUG)

    app.run(host="0.0.0.0")

ここでアプリケーションを起動すると、error.log に次の内容が含まれていることがわかります。

INFO:werkzeug: * Running on http://0.0.0.0:5000/

詳細については、http://docs.python.org/2/howto/logging.html をご覧ください

さて、私が示した方法では 2 つのハンドラーを持つことはできないと主張しているので、これを明確にする例を追加します。まず、このロギング コードをメインに追加します。

import logging, logging.config, yaml
logging.config.dictConfig(yaml.load(open('logging.conf')))

ここで、セットアップが機能することを確認するために、いくつかのデバッグ コードも追加します。

logfile    = logging.getLogger('file')
logconsole = logging.getLogger('console')
logfile.debug("Debug FILE")
logconsole.debug("Debug CONSOLE")

残っているのは「logging.conf」プログラムだけです。それを使用しましょう:

version: 1
formatters:
  hiformat:
    format: 'HI %(asctime)s - %(name)s - %(levelname)s - %(message)s'
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: hiformat
    stream: ext://sys.stdout
  file:
    class: logging.FileHandler
    level: DEBUG
    formatter: simple
    filename: errors.log
loggers:
  console:
    level: DEBUG
    handlers: [console]
    propagate: no
  file:
    level: DEBUG
    handlers: [file]
    propagate: no
root:
  level: DEBUG
  handlers: [console,file]

この構成は必要以上に複雑ですが、logging モジュールのいくつかの機能も示しています。

ここで、アプリケーションを実行すると、次の出力が表示されます (werkzeug-および console-logger):

HI 2013-07-22 16:36:13,475 - console - DEBUG - Debug CONSOLE
HI 2013-07-22 16:36:13,477 - werkzeug - INFO -  * Running on http://0.0.0.0:5000/

また、「HI」を使用したカスタム フォーマッタが使用されていることにも注意してください。

「errors.log」ファイルを見てください。を含む:

2013-07-22 16:36:13,475 - file - DEBUG - Debug FILE
2013-07-22 16:36:13,477 - werkzeug - INFO -  * Running on http://0.0.0.0:5000/
于 2013-07-22T10:15:32.233 に答える
10

アプリのコンソールに表示される出力は、基礎となる Werkzeug ロガーからのもので、logging.getLogger('werkzeug') を通じてアクセスできます。

ロギングは、そのロガーと Flask のロガーにもハンドラーを追加することで、開発とリリースの両方で機能できます。

詳細とコード例:アクセス ログへの Flask リクエストの書き込み

于 2014-04-19T18:20:58.743 に答える
5

これは機能します:

if __name__ == '__main__':
    import logging
    logFormatStr = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s'
    logging.basicConfig(format = logFormatStr, filename = "global.log", level=logging.DEBUG)
    formatter = logging.Formatter(logFormatStr,'%m-%d %H:%M:%S')
    fileHandler = logging.FileHandler("summary.log")
    fileHandler.setLevel(logging.DEBUG)
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setLevel(logging.DEBUG)
    streamHandler.setFormatter(formatter)
    app.logger.addHandler(fileHandler)
    app.logger.addHandler(streamHandler)
    app.logger.info("Logging is set up.")
    app.run(host='0.0.0.0', port=8000, threaded=True)
于 2015-11-17T13:13:10.933 に答える