2010-12-03 8 views
1

私はPythonのロギングモジュールでエラーを記録しています。次のように私は、私のクラスの内部でロガーオブジェクトを作った:Pythonのロギングモジュールでのロギングエラーの問題

self.my_logger = logging.getLogger('my_logger') 
self.my_logger.setLevel(logging.ERROR) 

私のように、後でコードのエラーをログに記録しようとすると:

self.my_logger.error("My error") 

その後、私はエラーを取得する:

AttributeError: FileHandler instance has no attribute 'filters' 

詳細なエラー・ログには、次のとおりです。

File "/lib/python2.6/logging/__init__.py", line 1047, in error 
    self._log(ERROR, msg, args, **kwargs) 
    File "/lib/python2.6/logging/__init__.py", line 1129, in _log 
    self.handle(record) 
    File "/lib/python2.6/logging/__init__.py", line 1139, in handle 
    self.callHandlers(record) 
    File "/lib/python2.6/logging/__init__.py", line 1176, in callHandlers 
    hdlr.handle(record) 
    File "/lib/python2.6/logging/__init__.py", line 658, in handle 
    rv = self.filter(record) 
    File "/lib/python2.6/logging/__init__.py", line 558, in filter 
    for f in self.filters: 
AttributeError: FileHandler instance has no attribute 'filters' 
if self.log_dir != None: 
    self.log_filename = os.path.join(self.log_dir, 'run.%s' \ 
            %(time.strftime("%m-%d-%y_%H:%M:%S"))) 

ch_file = logging.FileHandler(self.log_filename, 
            delay=True) 
ch_file.setLevel(logging.ERROR) 
ch_file.setFormatter(formatter) 
self.my_logger.addHandler(ch_file) 

ch_stream = logging.StreamHandler() 
ch_stream.setLevel(logging.INFO) 

# add formatter to ch 
ch_stream.setFormatter(formatter) 

# add ch to logger 
self.my_logger.addHandler(ch_stream) 
self.my_logger.info("Ready.") 

ここで何が起こっているかを任意のアイデア:この上流には、ここで私はファイルハンドラを設定する方法ですか?ありがとう。

+0

ロガーにおそらくルートロガーのハンドラーを追加する方法があります。このセットアップコードも表示できますか? –

+0

FileHandlerに問題があるようです。 FileHandler設定を投稿できますか? –

+0

編集済みの投稿に投稿しました。ありがとう – user248237dfsf

答えて

5

名前が標準の名前と衝突するモジュールを定義していないことを確認します。以下のわずかに変更されたスクリプトは、私のシステムでエラーなく実行されます。それを試してみて、それがうまくいけば、同じ名前のクラスを再定義していないことをもう一度確認してください。ところで

import logging 
import os 
import time 

class SomeClass: 
    def __init__(self): 
     self.log_dir = os.getcwd() 
     formatter = logging.Formatter('%(asctime)s %(message)s') 
     self.my_logger = logging.getLogger('my_logger') 
     self.my_logger.setLevel(logging.INFO) 

     if self.log_dir != None: 
      self.log_filename = os.path.join(self.log_dir, 'run.log') 

     ch_file = logging.FileHandler(self.log_filename, 'w') 
     ch_file.setLevel(logging.ERROR) 
     ch_file.setFormatter(formatter) 
     self.my_logger.addHandler(ch_file) 

     ch_stream = logging.StreamHandler() 
     ch_stream.setLevel(logging.INFO) 

     # add formatter to ch 
     ch_stream.setFormatter(formatter) 

     # add ch to logger 
     self.my_logger.addHandler(ch_stream) 
     self.my_logger.info("Ready.") 

     self.my_logger.error("My error") 


def main(): 
    SomeClass() 

if __name__ == '__main__': 
    main() 

- 彼らはとにかくシングルトンだとして何のポイントは、ありません - 私はあなたがこのことについて尋ねませんでしたが、それはインスタンス変数としてロガーを格納するための練習をお勧めしません知っています。ほとんどのユーザーにとっての通常のアプローチは、モジュールレベルで単一のモジュールを使用してモジュールレベルで使用することです。モジュールレベルでこれを使用します。もっと細かくする必要がある場合は、__name__をプレフィックスとして使用してロガーの子ロガーを作成してください('%s.detail' % __name__