2016-03-25 18 views
0

私は自分のプロジェクトでどのようにロギングをセットアップするかというタスクに取り組んでいます。 myApp。いくつかのモジュールとファイルで構成されており、ロギングの基本パターンをいくつか作成したいと思います。すべてのログは/var/log/myAppにある必要があります。このディレクトリは、 user_errors.logおよびerrors.log。主なアプローチは、例外の種類に応じて異なるファイルに違反しているすべての例外をログに記録されいくつかのモジュールにまたがっていくつかのファイルにPythonがログインします

# a.py: 
class A(object): 
    def __init__(self): 
    self.c = my_app.C() 
    ... 
    def some_method(self) 
    raise MyUserError(...) 

# b.py 
class B(object): 
    ... 
    raise MyException(...) 

# c.py 
class C(object): 
    ... 
    raise MyException(...) 


# d.py which has instances of A and B 
class D(object): 
    ... 
    def some_method(self): 
    ... 
    except MyUserError as ue: 
     # log into user_error.log 
    except MyException as e: 
     # log into error.log 

:両方のファイルがLINENOなど、日付、ファイルと同じフォーマットパターンに今すぐご検討ください次のような構造を持っています。また、例外と違反した場所の名前と行番号を記録することが重要です。私は何とかloggingモジュールを拡張するいくつかのmyLoggerクラスを作成すると思っていましたが、どのように良い例が見つかりませんでした。私はチュートリアルを読んだので、出力をフォーマットする方法などを知っています。ヘルプのために事前にありがとう!

答えて

1

いくつかの集中管理された場所(またはいくつかの集中管理された場所)ですべてのエラーをキャッチしている場合は、2つの別々のロガーを別々のハンドラーで使用できます。

あなたが処理するためのさまざまな例外とたくさんのファイルがある場合、あなたは例外hanlderコードに続いて、この

LOGGERS = {} 

def create_loggers(): 
    logdir = '/var/log/appData' 
    exceptions = [ 
     (MyError, 'errors.log'), 
     (MyUserError, 'user_errors.log'), 
     (OtherError, 'other.log') 
    ] 
    for exc, fn in exceptions: 
     logger = logging.getLogger(exc.__name__) 
     hdlr = logging.FileHandler(os.path.join(logdir, fn)) 
     logger.addHandler(hdlr) 
     LOGGERS[exc] = logger 

create_loggers() 

のようにそれらを作成することができ

log = logging.getLogger('errors') 
userlog = logging.getLogger('user_errors') 

error_handler = logging.FileHandler('/var/log/myApp/errors.log') 
usererror_handler = logging.FileHandler('/var/log/myApp/user_errors.log') 

log.addHandler(error_handler) 
userlog.addHandler(usererror_handler) 

def some_method(self): 
    ... 
    except MyUserError as ue: 
     # log into user_error.log 
     userlog.exception('User Error') 
    except MyException as e: 
     # log into error.log 
     log.exception('Error') 

except OtherException: 
    LOGGERS[OtherException].exception('Error') 
+0

が存在することになる場合にはどのようなログを記録する別の10個のファイル?ファイルごとに別の3行を書くことは、私にとってはうまく見えません。この場合、設定ファイルを使用する方が良いでしょうか? – marthin23

+0

私は、モジュールがハンドラを構成してはならないと思います。モジュール内のハードコードされたハンドラ設定は、後で他のコードから使用すると管理が非常に難しくなります(モジュールを作成する場合は非常に期待されます)。モジュールは単にロガーを作成してログレコードを出力します。ハンドラはそれらのモジュールの外部で構成されなければならない。 –

+0

例外に基づいてロガーとハンドラーを作成する必要がある場合は、ファイルの先頭にあるループ内で例外のインデックスを作成してください。その後、例外ハンドラで、例外を参照して正しいロガーを取得します。 –

関連する問題