簡體   English   中英

使用Python的日志記錄模塊記錄錯誤

[英]Problem logging errors with Python's logging module

我正在使用python的日志記錄模塊記錄錯誤。 我在我的課程中創建了一個logger對象,如下所示:

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.")

知道這里發生了什么嗎? 謝謝。

檢查您是否未定義任何名稱與標准名稱沖突的模塊。 下面稍加修改的腳本在我的系統上運行而沒有錯誤。 嘗試使用它,如果它有效,請仔細檢查您是否重新定義了具有相同名稱的任何類。

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()

順便說一下 - 我知道你沒有問過這個問題,但是不建議將記錄器存儲為實例變量 - 沒有意義,因為他們無論如何都是單身人士。 大多數用戶的正常方法是擁有一個

logger = logging.getLogger(__name__)

在模塊級別,並在整個模塊中使用它。 如果需要更多粒度,請使用__name__作為前綴創建記錄器的子記錄器(例如'%s.detail' % __name__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM