设置日志记录时出现奇怪的行为。这里是我的 日志记录配置: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)
任何想法为什么发生这种情况?
这个工程!谢谢! – Edwin 2011-03-09 19:51:01
我以前看过慢跑。它非常好,功能全面,但它不使用Python日志记录dictConfig格式(现在Django 1.3出现了不同的日志记录实现)。 – Edwin 2011-03-09 19:57:45