我现在开始登录我的 django 项目(一次一步),我想知道是否有办法使用 python 将我在代码中的位置放入错误消息中。即,如果我在something.views.something_view
如何获取此类/函数位置然后将其标记到logging.error("something went wrong in "+???)
?
4 回答
您应该使用字典在应用程序级别(在 settings.py 中)配置日志记录,方式如下:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '[%(levelname)s] [%(asctime)s] [%(name)s:%(lineno)s] %(message)s',
'datefmt': '%d/%b/%Y %H:%M:%S'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'logfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOGS_DIR, 'application.log'),
'maxBytes': 5242880, # 5MB
'backupCount': 10,
'formatter': 'standard',
},
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers':['console'],
'level':'DEBUG',
'propagate': False,
},
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'DEBUG',
'propagate': False,
},
'com.mysite': {
'handlers': ['console', 'logfile'],
'level': 'DEBUG',
'propagate': True,
},
}
}
该行:
'format': '[%(levelname)s] [%(asctime)s] [%(name)s:%(lineno)s] %(message)s'
将产生如下日志输出:
[DEBUG] [11/Aug/2013 12:34:43] [com.mysite.apps.myapp.middleware.MyMiddleware:28] My log message
在哪里:
com.mysite.apps.myapp.middleware.MyMiddleware
是记录您的消息和 :28 代码中的行的类。在模块级别以这种方式配置记录器:
import logging
logger = logging.getLogger(__name__)
这样,您的记录器将使用完全限定的类名自动解析!
您可以使用Python 2.3 附带的日志记录模块
你必须为你的记录器设置一个适当的格式化程序来获取你想要的,所以你必须设置,
import logging
my_logger = logging.getLogger('my_first_logger')
my_logger.setLevel('INFO') # You can check docs for more info about levels
formatter = logging.Formatter(
"%(asctime)s %(levelname)s %(name)s %(process)d %(threadName)s %(module)s:%(lineno)d %(funcName)s() %(message)s\n\n\n" # You set your logger debug information here. Check docs for detailed info about what information you can log
filename = 'logs/my_first_log.log'
handler = logging.FileHandler(filename, mode='a')
handler.setFormatter(formatter)
my_logger.addHandler(handler)
)
和用法:
import logging
my_log = logging.getLogger('my_first_logger')
my_log.info('Your log goes here...)
输出将如下所示:
2013-08-12 12:43:34,070 INFO my_code_file 26924 MainThread my_module:72 myFunc() 你的日志在这里...
更新:我忘了添加FileHandler
文件设置器。我修好了。您必须对您将使用的每个日志文件执行此操作。如果您将所有活动记录到一个日志文件中。然后您只需要设置一次记录器对象。然后你只需导入它并使用它。如果您有多个日志文件,则必须单独设置每个日志文件,然后您可以在任何您想要的地方使用它:
my_log = logging.getLogger('my_first_logger')
my_log.info('Blah blah blah...')
python检查模块应该为您提供所需的信息。
Logger 还可以选择记录进行日志调用的行号。您需要将 %(lineno)d 添加到格式化程序。但是要记录任意行号,您可以尝试以下行:
import inspect
info = inspect.getframeinfo(inspect.currentframe())
lineno = info.lineno
print info
print lineno
编辑:
看到alecxe的评论后得到了上下文。您可以使用 process_exception 中间件或 django 信号 got_request_exception https://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception logger.exception() 将为您记录堆栈跟踪