6

Pythonロギングを多用するさまざまなモジュールがあります。Pythonのドキュメントのようにメインモジュールにインポートして実行しようとすると、ログから出力が得られません。誰かが何が起こっているのか考えていますか?

以下にインポートされたモジュールによってインポートされたモジュールでロギングが呼び出されpublicます(コードの一部が大きすぎてここに配置できません)。以下のコードは、プログラム全体が実行され、ロギングが初期化される場所です。

import logging
from bottle import run, debug
import public

logging.basicConfig(level=logging.DEBUG)

if __name__ == '__main__':
   logging.info('Started')
   debug(mode=True)
   run(host='localhost', port = 8080, reloader=True)
   logging.info('Finished')
4

3 に答える 3

9

あなたの問題はおそらく、import publicステートメントが呼び出しを行っているか、logging.debug(...)または同様のものが原因で発生しています。次に何が起こるかはこれです:

  1. あなたimport public。副作用として、これはeglogging.debugまたは同様のものを呼び出します。これは自動的にを呼び出します。これはルートロガーにbasicConfigを追加しますStreamHandlerが、レベルは変更しません。
  2. 次に、を呼び出しますbasicConfigが、ルートロガーには既にハンドラーがあるため、(文書化されているように)何もしません。
  3. デフォルトのログレベルはWARNING、であるため、infoおよびdebug呼び出しは出力を生成しません。

インポートの副作用を実際に回避する必要があります。たとえば、への呼び出しは句にbasicConfig含める必要があります。if __name__ == '__main__'これでpublic.py

import logging

def main():
    logging.debug('Hello from public')

そしてこれmain.py

import logging
from bottle import run, debug
import public

def main():
    logging.basicConfig(level=logging.DEBUG)
    logging.info('Started')
    debug(mode=True)
    public.main()
    run(host='localhost', port = 8080, reloader=True)
    logging.info('Finished')

if __name__ == '__main__':
    main()

次の出力が得られます。

$ python main.py
INFO:root:Started
DEBUG:root:Hello from public
INFO:root:Started
DEBUG:root:Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^CINFO:root:Finished
$ Shutdown...
INFO:root:Finished

このことから、Bottleは実際には別のプロセスでスクリプトを再実行し、メッセージの倍増を説明していることがわかります。これは、プロセスIDを示すフォーマット文字列を使用して説明できます。

logging.basicConfig(level=logging.DEBUG,
                    format='%(process)s %(levelname)s %(message)s')

次に、次のような出力が得られます

$ python main.py
13839 INFO Started
13839 DEBUG Hello from public
13840 INFO Started
13840 DEBUG Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^C13839 INFO Finished
$ Shutdown...
13840 INFO Finished

次のように副作用を生成するステートメントを追加する場合は注意してくださいpublic.py

logging.debug('Side-effect from public')

モジュールレベルでは、ログ出力はまったく得られません。

$ python main.py
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^C$ Shutdown...

これは、上記の分析を確認するように見えます。

于 2011-12-24T18:30:46.603 に答える
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import logging.handlers
from logging.config import dictConfig

logger = logging.getLogger(__name__)

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
    """
    Initialize logging defaults for Project.

    :param logfile_path: logfile used to the logfile
    :type logfile_path: string

    This function does:

    - Assign INFO and DEBUG level to logger file handler and console handler

    """
    dictConfig(DEFAULT_LOGGING)

    default_formatter = logging.Formatter(
        "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
        "%d/%m/%Y %H:%M:%S")

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
    file_handler.setLevel(logging.INFO)

    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)

    file_handler.setFormatter(default_formatter)
    console_handler.setFormatter(default_formatter)

    logging.root.setLevel(logging.DEBUG)
    logging.root.addHandler(file_handler)
    logging.root.addHandler(console_handler)



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module

私は自分のプロジェクトでこのコードを試しました。メインでconfigure_loggint(logpath)を実行します。

そしてあなたは使うことができます

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

logger = logging.getLogger(__name__)

def hello():
    logger.debug("this is logger infomation from hello module")
于 2015-10-31T14:12:34.150 に答える
-1

編集1:

以下は、OPのコードの誤解(コメントから)と私の側の誤った仮定に基づいていました。そのため、それは無効です。

提供したコードに少なくとも1つのエラーがありました。 debug(mode=True)2つの理由で間違っています:

  1. 定義したメソッドとして、まだ呼び出されていません。
  2. mode=True割り当てであり、平等のテストではありません

以下は、補助的なモジュールとコードを取り除いたもので、実行され、ログに記録されます。

import logging

mode = False

logging.basicConfig(level=logging.DEBUG)
logging.info('Started')
logging.debug(mode is True)
# ... other code ...
logging.info('Finished')

コマンドラインから実行します。

$ python my_logger.py
INFO:root:Started
DEBUG:root:False
INFO:root:Finished
于 2011-12-24T05:35:27.647 に答える