Python で Syslog にログを設定する

Vaibhav Vaibhav 2023年1月30日
  1. Python で Syslog モジュールを使用して syslog にメッセージを記録する
  2. Python の logging モジュールを使用して Syslog にメッセージを記録する
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つのクラス、つまり FormatterFilter があります。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)を参照してください。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.