現在、django プロジェクトにログインし始めています (一度に 1 ステップずつ)。Python を使用して、コードのどこにいるかをエラー メッセージに表示する方法があるかどうか疑問に思っていました。つまりsomething.views.something_view
、このクラス/関数の場所を取得してタグ付けするにはどうすればよいlogging.error("something went wrong in "+???)
ですか?
4 に答える
Python 2.3 に付属のlogging モジュールを使用できます。
ロガーが必要なものを取得するには、適切なフォーマッターを設定する必要があるため、設定する必要があります。
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
更新:ファイル セッターを追加するのを忘れていました。私はそれを修正しました。これは、使用するログ ファイルごとに行う必要があります。すべてのアクティビティを 1 つのログ ファイルに記録する場合。次に、ロガー オブジェクトを 1 回だけ設定する必要があります。次に、それをインポートして使用します。複数のログ ファイルがある場合は、各ログ ファイルを個別に設定する必要があります。その後、必要な場所で使用できます。
my_log = logging.getLogger('my_first_logger')
my_log.info('Blah blah blah...')
次のように、辞書を使用してアプリケーション レベル (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__)
このようにして、ロガーは完全修飾クラス名を使用して自動的に解決されます!
ロガーには、ログ呼び出しが行われた行番号をログに記録するオプションもあります。%(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() はスタック トレースをログに記録します