2017-09-05 25 views
1

ロギング設定が設定されている場所からlogging.jsonファイルを作成した後、すべてのメソッドがそこに存在するクラスを作成しましたが、クラスそれが投げているエラーNameError: global name 'logger' is not definedNameError:グローバル名 'logger'が定義されていません

app.py

#/usr/bin/python 

import sys 
import logging 
import time 
import json 
import os 
import logging.config 

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) 

class Generic: 

     def __init__(self , file_path): 
       self.file_path = file_path 

     def check_mime(self): 
       logger.info('Generic on file {} starts at {}'.format(file_path , time.time())) 


print 'File path is {}'.format(sys.argv[1]) 
file_path = sys.argv[1] 

def parser(): 
     parser = Generic(file_path) 
     parser.check_mime() 
def main(): 
     print 'This is intended for module purpose only' 
     setup_logging() 
     parser() 

if __name__ == '__main__': 
     main() 

logging.json

{ 
    "version": 1, 
    "disable_existing_loggers": false, 
    "formatters": { 
     "simple": { 
      "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)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": "logs/gp.log", 
      "maxBytes": 10485760, 
      "backupCount": 20, 
      "encoding": "utf8" 
     }, 

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

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

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

問題:

私はプログラムエラーを実行

$ python app.py /home/default/domain.txt 
File path is /home/default/domain.txt 
This is intended for module purpose only 
Traceback (most recent call last): 
    File "app.py", line 44, in <module> 
    main() 
    File "app.py", line 41, in main 
    parser() 
    File "app.py", line 37, in parser 
    parser.check_mime() 
    File "app.py", line 29, in check_mime 
    logger.info('GenericParser 
NameError: global name 'logger' is not defined 

IAMのロガーがグローバルではないとして、このリンク[https://fangpenlin.com/posts/2012/08/26/good-logging-practice-in-python/]

でこれを解決する方法上の任意の提案を次のログの例を使用してそれをグローバルにする方法は?

+1

それがグローバルにする必要がありません どちらかは次のようにロガーを設定します。ロギングを使用するすべてのモジュールの先頭に 'logger = logging.getLogger(__ name __)'を置きます。 –

+0

また、各ログ情報がstdoutに出力されていますか?すべての修正? –

答えて

2

あなたがにリンク例があります。

import logging 
logging.basicConfig(level=logging.INFO) 
logger = logging.getLogger(__name__) #<<<<<<<<<<<<<<<<<<<< 

あなたがlogger定義を逃しました。

self.logger = logging.getLogger(__name__)Generic.__init__()関数に入れるか、例のようにインポート後にグローバルloggerを定義することができます。

+2

メソッド内で 'logger'を再割り当てしないので、ここでは' global'の必要はありません。 –

+0

良い点。私はいつも 'global'キーワードをいつ使用するのか、いつから外すべきかは確信していますが、この場合、' logger'がどこから来るのかを明確にすることは有益です – GPhilo

2

下記これはロガーを使用しているが、あなたはそれを定義していない、あなたのクラスでは、あなたのコード

logger=None 
    def setup(): 
     logger.debug('put some text') 
     return 0 

    def main(): 
     global logger 
     logger = logging.getLogger('give_some_logger_name') 
     logger.setLevel(logging.DEBUG) 

     ret = setup() 
0

に追加する必要があります。

logger = logging.getLogger(__name__) 

またはその代わりに、ロギングを使用します:

logging.info('Generic on file {} starts at {}'.format(file_path , time.time())) 
関連する問題