2017-09-27 12 views
0

私はロギングモジュールを使い遊んできましたが、私にはそれほど明確ではないものがいくつか見つかりました。json設定ファイルを使ったPythonログ

まず第一に、私はできるだけシンプルなコードを望んでいたので、json設定ファイルを使用してください。

{ 
"version": 1, 
"disable_existing_loggers": false, 
"formatters": { 
    "simple": { 
     "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s" 
    }, 
    "extra": {"format":"%(asctime)-16s %(name)-8s %(filename)-12s %(lineno)-6s %(funcName)-30s %(levelname)-8s %(message)s", 
      "datefmt":"%m-%d %H:%M:%S"} 
}, 

"handlers": { 
    "console": { 
     "class": "logging.StreamHandler", 
     "level": "DEBUG", 
     "formatter": "simple", 
     "stream": "ext://sys.stdout" 
    }, 

    "info_file_handler": { 
     "class": "logging.handlers.RotatingFileHandler", 
     "level": "INFO", 
     "formatter": "simple", 
     "filename": "info.log", 
     "maxBytes": 10485760, 
     "backupCount": 40, 
     "encoding": "utf8" 
    }, 

    "error_file_handler": { 
     "class": "logging.handlers.RotatingFileHandler", 
     "level": "ERROR", 
     "formatter": "simple", 
     "filename": "errors.log", 
     "maxBytes": 10485760, 
     "backupCount": 40, 
     "encoding": "utf8" 
    } 
}, 


"loggers": { 
    "my_module": { 
     "level": "ERROR", 
     "handlers": ["console"], 
     "propagate": "no" 
    } 
}, 

"root": { 
    "level": "INFO", 
    "handlers": ["console", "info_file_handler", "error_file_handler"] 
} 

}

このJSONファイルをインポートして使用されます。それはうまくいくようです。 残念ながら、いくつかの問題があります。 コードを終了しても(まだ動作中)、ロガーはファイルを閉じません。そして、次回の実行で、新しいログを古いログファイルに追加します。それを削除したり、問題なく切り捨て()する可能性はありません。 このようにして、ファイルを記述するハンドラを削除したかったのです。残念ながら、logger.handlersは空であると思われますので、どこでも見つけることができません。おそらく考えがありますか?

また、ログファイルに大きな問題があります。ロガーは、新しい行を始めることなく、すべて新しいものを追加しています。これは無限の1行ログに終わる。

メインテストプログラム:

import sys 
import os 
import json 
import logging.config 

import my_module 

def setup_logging(
    default_path='logging.json', 
    default_level=logging.INFO, 
    env_key='LOG_CFG' 
): 
    """Setup logging configuration 

    """ 
    path = default_path 
    value = os.getenv(env_key, None) 
    if value: 
     path = value 
    if os.path.exists(path): 
     with open(path, 'rt') as f: 
      config = json.load(f) 
     logging.config.dictConfig(config) 
    else: 
     logging.basicConfig(level=default_level) 





def main(): 

    setup_logging()  
    logger = logging.getLogger(__name__) 
    logger.info('Startlogging:') 


    my_module.foo()  
    b = my_module.Bar() 
    b.bar() 

    print logger.handlers 

if __name__ == '__main__': 
    main() 
+0

実際のロギングを行うコードを表示できますか?あなたもここで見ましたか? https://docs.python.org/3/library/logging.html – sietse85

+0

'インポートログ
デフfooの():
ロガー= logging.getLogger(__ name__)
logger.info( 'こんにちは、FOO - 情報 ')
logger.debug(' こんにちは、FOO - デバッグ ')
logger.error(' こんにちは、FOO - エラー ')
クラスバー(オブジェクト):
デフ__init __(自己、ロガー=なし):
self.logger = loggerまたはlogging.getLogger(__ name__)
def bar(self):
(ハイ、バーエラー)
self.logger.debug( 'こんにちは、bar - デバッグ')
self.logger.error( 'こんにちは、バーエラー')
' – RandomMario

+0

だから今、basiucally全体のコードを得た。最大の問題は最後にハンドラを閉じることではないと考えてください。 logger.handlersが[]を返すように手動で閉じる方法がわかりません – RandomMario

答えて

0

プログラムが終了するが、ログファイルのデフォルトのモードは'a'(APPEND)であるとき、ファイルが閉じられます。各実行時にログファイルを切り捨てたい場合は、"mode": "w"を指定し、"filename": "XXX.log"を指定します。

なぜ改行がログファイルにないのかよく分かりません。問題を示す小さな自己完結型のテストスクリプトを投稿する必要があります。

+0

残念ながらこれも完全には機能しません。それはまだ古いファイルにアポペンディングしています。しかし、私はこれがおそらくコードの最後にファイルハンドラを閉じることで解決できると思います。ここでの問題は、logger.handlersが[]を返すことです。これを閉じることはできないと思いますので、最後に問題が発生します。したがって、私はatexit.register(...)のようなものを使用して最後にファイルハンドラを閉じる最善の方法を探しています。 – RandomMario

+0

また、 "Logger"オブジェクトには属性 'shutdown'がないため、logger.shutdown()が見つかりません。しかし、logger.info()などは完璧に動作しています。 – RandomMario

関連する問題