2011-03-09 79 views
1

設置日誌記錄時出現奇怪的行爲。這裏是我的 日誌記錄配置:Django日誌記錄中的奇怪行爲(Django 1.3 RC)

LOGGING = 
{ 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'admin_configuration': { 
      'format': '%(asctime)s %(levelname)s %(category)s % (sub_category)s %(type_id)s %(message)s', 
      'datefmt': LOG_DATE_FORMAT, 
     }, 
    }, 
    'handlers': { 
     'admin_console': { 
      'level':'DEBUG', 
      'class':'logging.StreamHandler', 
      'formatter': 'admin_configuration' 
     }, 
     'db': { 
      'level':'DEBUG', 
      'class':'apps.history.handlers.DatabaseHandler', 
      'formatter': 'admin_configuration' 
     }, 
    }, 
    'loggers': { 
     'db_logger': { 
      'handlers': [ 'admin_console', 'db' ], 
      'level': 'DEBUG', 
      'propagate': False, 
     }, 
    }  
} 

然後,我創建了一個數據庫日誌處理程序和日誌記錄將 使用信號生成(如型號保存/刪除),因爲我想 跟蹤模式的轉變。從您的配置中可以看到, 記錄器有2個處理程序,1個用於DB,1個用於stdout(流處理程序)。

我使用記錄是這樣的:

logging.getLogger('db_logger').log(level, msg, extra=extras) 

哪裏換車,我傳遞給記錄額外的屬性。

現在奇怪的是,當我在「db_logger」改變「處理」 定義爲['db', 'admin_console'],記錄器 提高我的數據庫處理器內部的這個錯誤(參見下面的定義):

LogRecord instance has no attribute 'asctime' 

檢查記錄實例後,'消息'屬性也不會生成 ,但我所有的額外屬性都在那裏。 如果我刪除'admin_console'處理程序,則會發生同樣的錯誤。唯一 辦法可以記錄儀工作是處理程序必須在 原來的順序:「處理」:[ 'admin_console', 'db' ]

回溯:

File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/ 
base.py" in get_response 
    89.      response = middleware_method(request) 
File "/home/user/projects/django/../django/common/middleware.py" in 
process_request 
    27.    return login(request, **defaults) 
File "/usr/local/lib/python2.6/dist-packages/django/utils/ 
decorators.py" in _wrapped_view 
    93.      response = view_func(request, *args, 
**kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/views/decorators/ 
cache.py" in _wrapped_view_func 
    79.   response = view_func(request, *args, **kwargs) 
File "/home/user/projects/django/../django/apps/django_extra_auth/ 
views.py" in login 
    57.    auth_login(request, form.get_user()) 
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/ 
__init__.py" in login 
    85.  user_logged_in.send(sender=user.__class__, request=request, 
user=user) 
File "/usr/local/lib/python2.6/dist-packages/django/dispatch/ 
dispatcher.py" in send 
    172.    response = receiver(signal=self, sender=sender, 
**named) 
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/ 
models.py" in update_last_login 
    50.  user.save() 
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py" 
in save 
    460.   self.save_base(using=using, force_insert=force_insert, 
force_update=force_update) 
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py" 
in save_base 
    570.     created=(not record_exists), raw=raw, 
using=using) 
File "/usr/local/lib/python2.6/dist-packages/django/dispatch/ 
dispatcher.py" in send 
    172.    response = receiver(signal=self, sender=sender, 
**named) 
File "/home/user/projects/django/apps/history/audit.py" in 
post_save_handler 
    102.    logging.log_to_db(logging.INFO, msg, log_type) 
File "/home/user/projects/django/apps/history/__init__.py" in 
log_to_db 
    61.   db_logger.log(level, msg, extra=extras) 
File "/usr/lib/python2.6/logging/__init__.py" in log 
    1119.    self._log(level, msg, args, **kwargs) 
File "/usr/lib/python2.6/logging/__init__.py" in _log 
    1173.   self.handle(record) 
File "/usr/lib/python2.6/logging/__init__.py" in handle 
    1183.    self.callHandlers(record) 
File "/usr/lib/python2.6/logging/__init__.py" in callHandlers 
    1220.      hdlr.handle(record) 
File "/usr/lib/python2.6/logging/__init__.py" in handle 
    679.     self.emit(record) 
File "/home/user/projects/django/apps/history/handlers.py" in emit 
    11.   timestamp = datetime.strptime(record.asctime, 
settings.LOG_DATE_FORMAT) 

DB記錄器包裝

def log_to_db(self, level, msg, log_type, extra={}): 
    db_logger = logging.getLogger('db_logger') 
    extras = { 
     'category': log_type.category.name, 
     'sub_category': log_type.sub_category.name, 
     'type_id': log_type.type_id, 
    } 
    extras.update(extra) 
    db_logger.log(level, msg, extra=extras) 

DB處理程序

class DatabaseHandler(logging.Handler): 
    def emit(self, record): 
     user = getattr(record, 'user', None) 
     category = getattr(record, 'category', None) 
     sub_category = getattr(record, 'sub_category', None) 
     type_id = getattr(record, 'type_id', None) 
     timestamp = datetime.strptime(record.asctime, settings.LOG_DATE_FORMAT) 
     from history.models import LogRecord 
     LogRecord.objects.create(timestamp=timestamp, level=record.levelname, 
      category=category, sub_category=sub_category, type_id=type_id, 
      message=record.message, user=user) 

任何想法爲什麼發生這種情況?

回答

1

你必須在DatabaseHandler.emit()中調用self.format(record),格式化程序會爲你設置這些變量。

你可能想要檢查這個程序:https://github.com/zain/jogging

+0

這個工程!謝謝! – Edwin 2011-03-09 19:51:01

+0

我以前看過慢跑。它非常好,功能全面,但它不使用Python日誌記錄dictConfig格式(現在Django 1.3出現了不同的日誌記錄實現)。 – Edwin 2011-03-09 19:57:45