📖

PythonでHAproxyのログを抽出する方法

2024/02/23に公開

やりたいこと

Pythonを使ってアクセスログの分析をしたく、サーバーからHAproxyのログをPythonで取得できないかと思って作ってみたらできたので残しておく。

前提条件

  • ログを取得したいサーバーへSSHコマンドでアクセスできるようにしておく
    • 鍵の設定などを済ませておく

説明

  • HAproxyのログは/var/log/に作られる
  • ログのファイル名は以下のようになっている(おそらくデフォルト)
    haproxy.log  ←リアルタイムのログ
    aproxy.log.1 ←リアルタイムのバックアップログ
    haproxy.log.2.gz ←1つ前のバックアップログ(gzに圧縮されている)
    haproxy.log.3.gz ←2つ前のバックアップログ(gzに圧縮されている)
          ・
      ・
    haproxy.log.7.gz ←6つ前のバックアップログ(gzに圧縮されている)

ソースコード

configを使用して.envにローカルの保存場所などを設定できるようにしてある。
日時のディレクトリを作成し、server01とserver02からHAproxyのログを取得して、それぞれのサーバー名のディレクトリに保存する動作となる。

.env
PATH_LOG_SAVED==****
PATH_ANALIZELOG_SAVED==****
PATH_BATCH_LOG==****
PATH_PROJECT=****
config.py
from dotenv import load_dotenv
import os

load_dotenv()
PATH_LOG_SAVED = os.getenv('PATH_LOG_SAVED')
PATH_ANALIZELOG_SAVED = os.getenv('PATH_ANALIZELOG_SAVED')
PATH_BATCH_LOG = os.getenv('PATH_BATCH_LOG')
PATH_PROJECT = os.getenv('PATH_PROJECT')
import subprocess
import os
from datetime import datetime
import config


def execute_cmd(name_server, name_file, path_save):
    str_cmd = 'ssh {0} "sudo cat /var/log/{1}" > {2}{1}'.format(name_server, name_file, path_save)
    print("{}".format(str_cmd))
    subprocess.run(str_cmd, shell=True)


def get_haproxy_log(name_server, path_save):
    name_file = "haproxy.log"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.1"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.2.gz"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.3.gz"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.4.gz"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.5.gz"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.6.gz"
    execute_cmd(name_server, name_file, path_save)

    name_file = "haproxy.log.7.gz"
    execute_cmd(name_server, name_file, path_save)


if __name__ == '__main__':
    # 日時ディレクトリ作る
    name_datetime = datetime.now().strftime("%Y%m%d%H%M")
    print(name_datetime)

    for i in range(0, 2):
        name_server = "server{0:02}".format(i + 1)
        path_save = "{}{}/{}/".format(config.PATH_LOG_SAVED, name_server, name_datetime)
        print(path_save)
        os.mkdir(path_save)
        get_haproxy_log(name_server, path_save)

Discussion