如何让django告诉我我的代码在哪里

时间:2013-08-12 08:33:29

标签: django

我现在开始登录我的django项目(一次一步),我想知道是否有办法将我在我的代码中的位置放入使用python的错误消息中。即如果我在something.views.something_view,如何获取此类/功能位置,然后将其标记为logging.error("something went wrong in "+???)

4 个答案:

答案 0 :(得分:1)

您应该使用字典在应用程序级别(在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__)

这样,您的记录器将使用完全限定的类名自动解析!

答案 1 :(得分:1)

您可以使用Python 2.3附带的logging module

您必须为记录器设置适当的格式化程序才能获得所需内容,因此必须设置

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文件设置器。我修好了。您必须为要使用的每个日志文件执行此操作。如果要将所有活动记录到单个日志文件中。然后,您只需要设置一次logger对象。然后你将导入它并使用它。如果您有多个日志文件,则必须单独设置每个日志文件,然后您可以随意使用它:

my_log = logging.getLogger('my_first_logger')
my_log.info('Blah blah blah...')

答案 2 :(得分:0)

python inspect模块应该为您提供您所需的信息。

答案 3 :(得分:0)

记录器还可以选择记录进行日志调用的行号。您需要将%(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()将为您记录堆栈跟踪