1. ホーム
  2. パイソン

Djangoの設定ロギング出力、ロギング設定最も詳しい本、コンソールのログをファイルにすべて出力、ロギング/コンソールのファイルへのリダイレクト

2022-03-02 20:55:34
<パス

django オンライン環境でのログ出力は、全てのエラー、警告、デバッグ、その他の重要な情報をログに出力し、メンテナンスと問題のトラブルシューティングを容易にするために、かなり重要な役割を担っています。
次回は、django のロギング設定とその意味や動作について詳しく説明します。
この記事では、何が使われているのかについても詳しくお答えしていこうと思います。
まずは実際の設定から。settings.pyを設定します。

一番上に書く
python manage.py runserver >> /home/aea/log/test.log は、django を実行するとすべてのコンソールが /home/aea/log/test.log にリダイレクトされることを意味します。
注意: django のコンソール出力は /home/aea/log/test.log にリダイレクトされたため、常に空白になります。
すべてのログファイルを正しいアドレスで設定し、ファイルが存在することを確認してください。
DEBUG = False #Debug should be turned off for online environments
ALLOWED_HOSTS = ['*'] #Allows all ip access in online environment, or has its own rules

# The following is the configuration of logging
LOGGING = {
    'version': 1, # Specify the version of dictConnfig, currently there is only one version, haha
    'disable_existing_loggers': False, # Indicates whether to disable all existing logging configurations
    'formatters': { # formatters
        'verbose': { # detail
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'standard': { # standard
            'format': '[%(asctime)s] [%(levelname)s] %(message)s'
        },
    },
    # handlers: used to define the specific way to handle logs, can define a variety of, "default" is the default way, "console" is printed to the console way. file is the way to write to the file, note the use of different class
    'handlers': { # handlers, two handlers are defined here
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout', # configuration for file redirection, redirecting all messages printed to the console python manage.py runserver >> /home/aea/log/test.log
            # 'stream': open('/home/aea/log/test.log','a'), # It worked, but it didn't write everything to the file, it's not clear why
            'formatter': 'standard' # Set the format of the output, note Select one of the formatters in the above configuration, otherwise it will report an error
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/home/aea/log/jwt_test.log', # this is the method to write the normal log to the log file
            'formatter': 'standard'
        },
        'default': {
            'level':'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/home/aea/log/all.log', # log output file
            'maxBytes': 1024*1024*5, # file size
            'backupCount': 5, # number of backup copies
            'format':'standard', #which formatters log format to use
        },
        # There is a difference between the above two methods of writing logs, the former is to write all the output under the console to a file, the advantage of this is that all the print in our views code will also be written in the corresponding location
        # The second method is to write the system built-in content to the file, specifically the address of the request, error messages, etc. Partners can also use both and then check the similarities and differences between the two files.
    },
    'loggers': { # log logger, the corresponding output log after configuration
        # django means the default console output of django itself, that is, the original output in the console, the file in the handlers here means write to the file configured above - /home/aea/log/jwt_test.log file inside
        # The console in the handlers here means write to the above configured console-/home/aea/log/test.log file
        'django': {
            'handlers': ['console','file'],
            # Here the direct output to the console is just the requested route and other system consoles, when using redirects will output all the content to the log log
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.request ':{
            'handlers': ['console','file'],
            'level': 'WARNING', # Write the warning log to another file in conjunction with the above
            'propagate': True,
        },
        'django.db.backends': {
            'handlers': ['file'], # Specify a file handler to write to a file only
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

以下は、パラメータと設定の説明です。

レベル:レベル

ロガーはロギング・システムのエンティティであり、各ロガーはプロセスに対して書き込めるメッセージの名前付き "バケット"である。
各ロガーはロギングレベルを持ち、各レベルはロガーが処理しようとしているメッセージの重大度を記述します。pythonは以下の6つのレベルを定義しています。
レベル 値 説明
CRITICAL 50 重大な問題が発生したことを示す重大なエラー/メッセージ
ERROR 40 エラー、発生した重大な問題を記述しています。
WARNING 30 警告メッセージ、発生したマイナーな問題を説明しています。
INFO 20 通知メッセージ、システム情報の一般的なリスト
DEBUG 10 デバッグ、デバッグ用の低レベルのシステムメッセージ
NOTSET 0 レベルなし

Processor/Recorder Keyword パラメータ。

キーワードパラメータ説明
filename 指定されたファイル名でログメッセージをファイルに追加します。
filemode ファイルを開くときに使用するモードを指定します。
format ログメッセージの生成に使用されるフォーマット文字列
datefmt 日付と時刻を出力するためのフォーマット文字列
level ロガーのレベルを設定します。
propagateでは、この伝搬をレコーダー単位で制御することができます。特定のロガーをその親に伝播させたくない場合、この動作をオフにすることができます。
stream ログメッセージの送信先としてオープンファイルを提供します。sys.stderr、sys.stdout、またはファイルへの出力を指定することができます。
filenameとstreamの両方のパラメータが記載されている場合、streamパラメータは無視されます。

format: ログメッセージのフォーマット

フォーマット 説明
(名前)はロガーの名前です。
%(levelno)s 数字で表したロギングレベル
%(levelname)s ロギングレベルのテキスト名
(filename)s ロギング・コールを実行するソース・ファイルのファイル名
%(pathname)s ロギング・コール先のソース・ファイルのパス名
%(funcName)s 実行ログには呼び出された関数名が記録されます。
%(module)s 実行ログから呼び出されたモジュールの名前
%(lineno)s ロギングコールを実行する行番号
%(created)s ロギングが実行された時間
%(asctime)s 日付と時間
(msecs)s ミリ秒部分
%(thread)d スレッドID
%(threadName)s スレッドの名前
(プロセス)d プロセス ID
(メッセージ)s 記録されたメッセージ

内蔵プロセッサー

loggingモジュールは、様々な方法でログメッセージを処理することができるハンドラを多数提供します。これらの処理系は addHandler() メソッドを使用して Logger オブジェクトに追加されます。また、各プロセッサに独自のフィルタとレベルを設定することも可能です。
StreamHandlerは、sys.stdoutやsys.stderrと同様に、任意のファイルオブジェクトにメッセージを出力することができます。
logging.FileHandler は、ファイル filename にログメッセージを書き込みます。
logging.handlers.DatagramHandler(host, port) 指定されたホストとポートに位置する UDP サーバーにログメッセージを送信します。UDP プロトコルを使用して、ログメッセージをネットワークに送信します。
logging.handlers.HTTPHandler(host, url) HTTPのGETまたはPOSTメソッドを使用して、ログメッセージをHTTPサーバーにアップロードします。
logging.handlers.RotatingFileHandler(filename) ログメッセージをファイル filename に書き込みます。このファイルは、サイズが maxBytes で設定した値を超えると filenamel としてバックアッ プされます。
logging.handlers.SocketHandler TCP プロトコルを使用して、ログメッセージをネットワークに送信します。
logging.handlers.SysLogHandler syslog にログ出力する。
logging.handlers.NTEventLogHandler Windows NT/2000/XP イベントログへのリモートログ出力
logging.handlers.SMTPHandler リモートでログを電子メールアドレスに出力する。
logging.handlers.MemoryHandler メモリバッファへのログ出力
注:組み込みの処理系は他にもたくさんあるので、もっと深く知りたい方は、こちらをご覧ください。公式マニュアルをご覧ください。

django が提供する組み込みロガー

django Django 階層にある全てのメッセージロガーです。メッセージを公開するためにこの名前を使う代わりに、以下のロガー のいずれかを使ってください。
django.request リクエスト処理に関連するログメッセージ。5xx レスポンスはエラーメッセージに昇格し、4xx レスポンスは警告メッセージに昇格します。
django.server RunServer コマンドで起動されたサーバが受け取ったリクエストの処理に関連するログメッセージです。HTTP 5XX レスポンスはエラーメッセージとして、 4XX レスポンスは警告メッセージとして、それ以外は全て INFO としてログに記録されます。
django.template テンプレートレンダリングに関連するログメッセージ
django.db.backends コードがどのようにデータベースと相互作用するかについてのメッセージです。例えば、実行を要求された各アプリケーションレベルの SQL 文は、このロガーにデバッグレベルで記録されます。

本番環境での推奨デプロイ方法

多くの場合、デバッグやテストの内容を出力するために、コードに多くのprintを追加しますが、デフォルトではすべてコンソールに出力されます。
問題は、本番環境ではプロセスがバックグラウンドで実行されているので、それを利用して、コンソール印刷をすべてログファイルにリダイレクトすればいいということです。
上記の私の設定を参照すると、コンソールのハンドラは、以下のように設定されています。 'ストリーム': 'ext://sys.stdout',
これは、私たちのすべてのコンソール出力をファイルに書き込むようにリダイレクトします。
コマンドは
このコマンドの意味は、バックグラウンドでプロセスを実行し、すべてのコンソール出力をファイルにリダイレクトすることです

nohup python manage.py runserver >>/home/aea/log/test.log &