python
  • file
  • logging
  • console
  • screen
  • 2012-11-20 13 views 35 likes 
    35

    このコードがスクリーンに表示される理由はわかりませんが、ファイルには表示されません。ファイル "example1.log"が作成されますが、そこには何も書き込まれません。PythonのbasicConfigメソッドを使用してコンソールとファイルにログする

    #!/usr/bin/env python3 
    import logging 
    
    logging.basicConfig(level=logging.DEBUG, 
            format='%(asctime)s %(message)s', 
            handlers=[logging.FileHandler("example1.log"), 
               logging.StreamHandler()]) 
    logging.debug('This message should go to the log file and to the console') 
    logging.info('So should this') 
    logging.warning('And this, too') 
    

    私は、ログオブジェクト(example code)を作成することで、この問題を「バイパス」しているが、それはにbasicConfig()のアプローチが失敗した理由私を悩ませ続けて?

    PS。私はにbasicConfig呼び出しを変更する場合:

    logging.basicConfig(level=logging.DEBUG, 
            filename="example2.log", 
            format='%(asctime)s %(message)s', 
            handlers=[logging.StreamHandler()]) 
    

    はその後、すべてのログがファイルにあり、何もコンソールに表示されていない

    +3

    python 2.7では、basicConfigが理解するキーワード引数は、 "filename"、 "filemode"、 "stream"、 "format"、 "datefmt"、および "level"です。 "ハンドラー"は何もしません。 – TocToc

    答えて

    15

    私は、Python 3.3でそれを再現することはできません。メッセージは画面と'example2.log'の両方に書き込まれます。 Python < 3.3でファイルを作成しますが、ファイルは空です。

    コード:

    from logging_tree import printout # pip install logging_tree 
    printout() 
    

    FileHandler()はPython < 3.3のルートロガーに接続されていないことを示しています。

    logging.basicConfig()のドキュメントでは、handlersという引数がPython 3.3で追加されています。 handlers引数は、Python 3.2のドキュメントには記載されていません。

    +0

    あなたは正しいです!ただし、サポートされていない機能を使用しているときに例外が発生することはありませんか?私がこの時間を無駄にしていた時間を認めても恥ずかしいです... – Jovik

    +1

    @ジョヴィック:私は現時点では見えませんが、おそらくいくつかの論理があります。あなたはhttp://bugs.python.orgでそれを報告しようとする可能性があります。 – jfs

    +2

    [報告された](http://bugs.python.org/issue16521) – Jovik

    26

    コンソールの両方のため(のpython 2.7でテスト)この作業罰金を試してみて、以下の例では

    # set up logging to file 
    logging.basicConfig(
        filename='twitter_effect.log', 
        level=logging.INFO, 
        format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', 
        datefmt='%H:%M:%S' 
    ) 
    
    # set up logging to console 
    console = logging.StreamHandler() 
    console.setLevel(logging.DEBUG) 
    # set a format which is simpler for console use 
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
    console.setFormatter(formatter) 
    # add the handler to the root logger 
    logging.getLogger('').addHandler(console) 
    
    logger = logging.getLogger(__name__) 
    
    4

    ファイルには、そのレベルに基づいて、ログの保存先を指定することができます。たとえば、以下のコードでは、のINFOレベルのすべてのログがログファイルに保存され、上記のすべてがERRORレベルになります。

    関連する問題