0

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

4

4 回答 4

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

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

于 2013-08-12T09:32:36.340 回答
1

您可以使用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...')
于 2013-08-12T09:43:04.787 回答
0

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

于 2013-08-12T08:44:10.570 回答
0

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() 将为您记录堆栈跟踪

于 2013-08-12T08:50:30.973 回答