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」内、「Input ports」でポート12201がTCPかつTLS有効で設定されていること。
  3. Stackheroのファイアウォール設定で「12201/tcp」が「ACCEPT」になっていること(テスト時はソースを0.0.0.0/0、できれば1番目のルールに設定)。
  4. Graylog管理パネルの「Search」で直近1時間のログを表示し、1秒ごとに自動更新されるように設定して新しいメッセージを確実にキャッチできるようにしてください。