Python で Syslog にログを設定する
System Logging Protocol または Syslog
は、メッセージロギングの標準である macOS や Linux などの Unix ベースのオペレーティングシステム用のソフトウェアです。
Syslog
は、システムログとイベントメッセージを Syslog
サーバーと呼ばれるサーバーに送信できるようにする標準のネットワークベースのログプロトコルです。このサービスは、分析、監視、および評価のために、複数の異なる独立したマシンからログメッセージとイベントメッセージを 1 か所で収集します。
例を使ってこのサービスを理解しましょう。
5 台のコンピューターがあるとします。これら 5 台のコンピューターの 1つは、Syslog
サーバーです。他の 4 台のコンピューターは、4つの Web アプリケーションをホストしているサーバーです。これらの 4つの Web アプリケーションは互いに独立しており、いくつかのログメッセージを生成します。
これらのログメッセージには、ログインしたユーザー、ログアウトしたユーザー、どのユーザーがどのページにアクセスしたか、どのページでどのエラーが検出されたか、過去 1 時間に特定のページにアクセスした回数、オンライントランザクションの数に関する詳細が含まれます。過去 1 時間に発生しました。
アプリケーションとログメッセージが非常に多いため、アプリケーションの数がさらに増える可能性があるため、個々のコンピューターにアクセスしてそれらを確認することは複雑な作業です。したがって、これらのアプリケーションはすべて、メッセージを 5 番目のコンピューターまたは Syslog
サーバーに記録します。
誰かが複数のアプリケーションからのこれらのログメッセージを確認および監視したいとします。その場合、彼らは一箇所からそれを行うことができます。
この戦略により、レビューが容易になるだけでなく、効率的かつ生産的になります。好みや要件に基づいてこれらのログメッセージを確認および監視するアプリケーションを開発したり、市場で入手可能な既存の製品を使用したりすることもできます。
Python プログラミング言語は、実際のアプリケーションを構築できるユニバーサル言語です。この記事では、Python を使用して Syslog
へのメッセージのログ記録に取り組みます。
Python で Syslog
モジュールを使用して syslog
にメッセージを記録する
Python モジュール syslog
を使用してメッセージをログに記録できます。これは Python 標準ライブラリの一部であり、Unix の syslog
ライブラリルーチンのインターフェイスとして機能します。
このモジュールには、メッセージをログに記録できる同じ名前の 2つのメソッド syslog()
があります。ここでは、関数のオーバーロードの概念が使用されています。
以下は、両方のメソッドの関数シグネチャです。
syslog.syslog(message)
syslog.syslog(priority, message)
最初のメソッドは文字列メッセージを受け入れ、2 番目のメソッドは優先度とともに文字列メッセージを受け取ります。どちらの方法でも、文字列メッセージがシステムロガーに送信されます。
このモジュールでは、上位から下位の 8つの優先度レベルを使用できます。
LOG_EMERG
-syslog.LOG_EMERG
:緊急時に使用されます。LOG_ALERT
-syslog.LOG_ALERT
:アラートに使用されます。LOG_CRIT
-syslog.LOG_CRIT
:重要なメッセージに使用されます。LOG_ERR
-syslog.LOG_ERR
:エラーに使用されます。LOG_WARNING
-syslog.LOG_WARNING
:警告に使用されます。LOG_NOTICE
-syslog.LOG_NOTICE
:通知に使用されます。LOG_INFO
-syslog.LOG_INFO
:情報メッセージに使用されます。LOG_DEBUG
-syslog.LOG_DEBUG
:メッセージのデバッグに使用されます。
これで、モジュールの簡潔な紹介が完了しました。例を使用して、このモジュールの使用方法を理解しましょう。これについては、次の Python コードを参照してください。
import syslog
syslog.syslog("A test message.")
syslog.syslog(syslog.LOG_EMERG, "A message with LOG_EMERG priority.")
syslog.syslog(syslog.LOG_ALERT, "A message with LOG_ALERT priority.")
syslog.syslog(syslog.LOG_CRIT, "A message with LOG_CRIT priority.")
syslog.syslog(syslog.LOG_ERR, "A message with LOG_ERR priority.")
syslog.syslog(syslog.LOG_WARNING, "A message with LOG_WARNING priority.")
syslog.syslog(syslog.LOG_NOTICE, "A message with LOG_NOTICE priority.")
syslog.syslog(syslog.LOG_INFO, "A message with LOG_INFO priority.")
syslog.syslog(syslog.LOG_DEBUG, "A message with LOG_DEBUG priority.")
syslog.syslog(syslog.LOG_INFO, "Test message with INFO priority.")
Python の logging
モジュールを使用して Syslog
にメッセージを記録する
Python には、柔軟なイベントロギングシステムでアプリケーションとライブラリを支援するメソッドとクラスを含む、さらに別のモジュール logging
があります。
このモジュールは、Python 標準ライブラリの一部でもあります。logging
モジュールは、イベントロギングに多くの機能と柔軟性を提供します。
logging
モジュールには、実際のロギングロジックの実装を含むクラス Logger
があります。開発者とプログラマーは、ロギングを実行するためにこのクラスをインスタンス化する必要があります。
このクラスを直接インスタンス化してはならないことに注意してください。ロガーを作成するには、モジュールレベルの関数 getLogger()
または logging.getLogger(name)
を使用する必要があります。
ここで、name
はロガーの名前です。Logger
クラスには、propogate()
、setLevel()
、isEnabledFor()
、getEffectiveLevel()
、log()
などのメソッドが多数あります。
この記事では、以下の方法のみに焦点を当てます。
*debug(msg)
:レベル DEBUG
のメッセージをログに記録するメソッド。
*info(msg)
:レベル INFO
のメッセージをログに記録するメソッド。
*warning(msg)
:レベル WARNING
のメッセージをログに記録するメソッド。
*error(msg)
:レベル ERROR
のメッセージをログに記録するメソッド。
*critical(msg)
:レベル CRITICAL
のメッセージをログに記録するメソッド。
*log(level, msg)
:指定された整数レベルのメッセージをログに記録するメソッド。
*exception(msg)
:レベル ERROR
のメッセージをログに記録するメソッド。
*addHandler(hdlr)
:指定されたハンドラーをロガーに追加するメソッド。
このライブラリには、次のログレベルとその数値があります。
CRITICAL
:50
ERROR
:40
WARNING
:30
INFO
:20
DEBUG
:10
NOTSET
:0
ロギングモジュールには、ログメッセージの場所を指定するために使用されるクラス Handler
があります。Handler
クラスオブジェクトは、上記の addHandler()
メソッドを使用してロガーに追加されます。
これらの 2つのクラスとは別に、logging
モジュールにはさらに 2つのクラス、つまり Formatter
と Filter
があります。Formatter
クラスはログメッセージのレイアウトとフォーマットを定義するために使用され、Filter
クラスはログメッセージのフィルタリングに使用されます。
今のところ、これらの機能について知っておく必要があるのはこれだけです。
これで、logging
モジュールの簡潔な紹介が完了しました。例を使用して、このモジュールを使用してメッセージをログに記録する方法を理解しましょう。これについては、次の Python コードを参照してください。
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger("Logger")
handler = SysLogHandler(address="/var/run/syslog")
logger.addHandler(handler)
logger.debug("A message with level DEBUG.")
logger.info("A message with level INFO.")
logger.warning("A message with level WARNING.")
logger.error("A message with level ERROR.")
logger.critical("A message with level CRITICAL.")
logger.exception("A message with level ERROR.")
logger.log(250, "A message with level 250 numeric value.")
上記の Python スクリプトは、最初に getLogger()
メソッドを使用してロガーを作成し、Logger
という名前を提供します。
次に、SysLogHandler
クラスを使用してハンドラーを作成します。このクラスを使用すると、開発者とプログラマーはログメッセージをリモートまたはローカルの Unix syslog
に送信できます。
このクラスは、ログメッセージの宛先を参照するパラメータ(3つのパラメータの 1つ)address
を受け入れます。このクラスの詳細については、公式ドキュメントこちらを参照してください。
次に、addHandler()
メソッドを使用して、このハンドラーをロガーに追加します。最後に、上記のすべてのログ方法を使用して、すべてのレベルのメッセージと 250
レベルのメッセージをログに記録します。
logging
モジュールと syslog
モジュールについては、それぞれ公式ドキュメントこちら(https://docs.python.org/3/library/logging.html)とこちら(https://docs.python.org/3/library/logging.html)を参照してください。