Graylog: Pythonでの利用方法

PythonからGraylogへログを送信する方法

👋 Stackheroのドキュメントへようこそ!

Stackheroは、数多くの利点を提供する、すぐに使えるGraylogクラウドソリューションを提供しています。

  • 無制限で専用のSMTP メールサーバーが含まれています。
  • ワンクリックで簡単にアップデート
  • HTTPSで保護されたカスタマイズ可能なドメイン名(例: https://logs.your-company.com)。
  • プライベートで専用のVMによる最適なパフォーマンスと強力なセキュリティ

時間を節約し、生活を簡素化:StackheroのGraylogクラウドホスティングソリューションを試すのに5分しかかかりません!

PythonからGraylogへログを送信するのは非常に簡単です。このガイドでは、graypyおよびloggingパッケージを使用して、PythonアプリケーションのログをGraylogインスタンスへ転送する手順をご紹介します。

まず、GraylogサーバーでGELF TCPインプットを設定します。

Graylogの管理パネルにアクセスし、「System」>「Inputs」から「GELF TCP」タイプの新しいインプットを作成してください。「global」ボックスにチェックを入れ、インプットの「title」を入力し、ポートが12201に設定されていることを確認します。

TLSオプションはここで有効化しないでください。 TLS暗号化は、インスタンスに含まれるリバースプロキシによって処理されます。

Input configurationInput configuration

StackheroダッシュボードでGraylogサービスを選択し、「Configure」をクリックします。

TCPポート12201が正しく設定されていること、またこのポートで「TLS encryption」が有効になっていることを確認してください。設定を保存して反映させます。

Input port configurationInput port configuration

サービスの「Firewall」で、少なくともご自身のIPアドレスがTCPポート12201へのデータ送信を許可されていることを確認してください。テスト目的の場合は、すべてのIP(0.0.0.0/0)を許可する方が簡単です(これがデフォルト設定です)。

この例では、graypyライブラリを使用します。まず、pip install graypyでインストールしてください。

次に、graylog-example.pyというファイルを作成し、<XXXXXX>.stackhero-network.comをご自身のサーバーホスト名に置き換えてください。以下はサンプルスクリプトです:

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

my_logger.debug('This is a test from a Python script!')

ログを確認するには、Graylog管理パネルを開き、「Search」タブに移動し、再生アイコンをクリックして1秒ごとに更新されるように設定します。スクリプトは以下のコマンドで実行できます:

python graylog-example.py

スクリプトを実行すると、ログメッセージがGraylogに送信され、検索結果に表示されるはずです。

Your first log received on GraylogYour first log received on Graylog

「This is a test from a Python script!」というメッセージをクリックすると、スクリプト名やログを生成した正確な行番号などの詳細情報が表示されます。

Detailed logDetailed log

Graylogは通常のログメッセージだけでなく、エラーもキャッチして転送できます。これにより、アプリケーションの挙動をより詳細に監視でき、メールやSlack、Mattermostなどで問題発生時に通知を受け取ることが容易になります。

以下は、存在しない関数を呼び出してエラーを発生させる例です。必ず「<XXXXXX>.stackhero-network.com」をご自身のインスタンスのホスト名に置き換えてください。

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
    unknown_function()
except NameError:
    my_logger.debug('The "unknown_function" raised an error', exc_info=1)

このスクリプトも先ほどと同様に実行できます。Graylog管理パネルでは、「NameError: name 'unknown_function' is not defined」というエラーメッセージとともに、スタックトレース全体が表示されます。

Error log exampleError log example

前述の例ではTLS暗号化を使用していますが、証明書の検証は行っていません。テスト用途では問題ありませんが、本番環境では証明書の有効性を必ず検証してください

証明書検証を有効にするには、validateおよびca_certsオプションを次のように追加します:

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')

システム上に/etc/ssl/certs/ca-certificates.crtファイルが存在することを確認してください:

  • Ubuntu/Debianの場合、sudo apt install ca-certificatesでインストールできます。
  • Alpine Linuxの場合、apk add ca-certificatesでインストールできます。
  • macOSではデフォルトでインストールされていますが、ファイル名は/etc/ssl/cert.pemです。

Graylogにログが表示されない場合、以下の点を確認してください:

  1. GraylogでGELF TCPインプットがポート12201でリッスンしており、このインプットでTLSが有効化されていないこと。
  2. Stackheroダッシュボードの「Configure」で、ポート12201がTCPかつTLS有効で「Input ports」に設定されていること。
  3. Stackheroのファイアウォール設定で「12201/tcp」が「ACCEPT」になっていること(テスト時はソースを0.0.0.0/0、できれば#1の位置に設定)。
  4. Graylog管理パネルの「Search」で、直近1時間のログを表示し、1秒ごとに自動更新されるように設定して新しいメッセージを確認できるようにしてください。