Grafana Loki はログ管理システムであり、大量のログデータを効果的に管理するために使用されます。しかし、Loki はログデータが膨大になるとストレージ領域を圧迫する可能性があります。そこで、一定期間ごとに Loki の古いログデータを削除する必要があります。本記事では、Bash シェルスクリプトを使用して Loki のログデータを削除する方法を説明します。
Bash スクリプトを使用した Loki ログデータの削除 以下に、Bash シェルスクリプトで Loki のログデータを削除する方法を示します。このスクリプトを使用すると、指定された日数より古いログデータを削除することができます。
#!/bin/bash
if [ $# -ne 3 ]; then
echo "Usage: $0 <older_than_days> <label_name> <label_value>"
exit 1
fi
LOKI_API_BASE="http://localhost:3100"
OLDER_THAN_DAYS="$1"
LABEL_NAME="$2"
LABEL_VALUE="$3"
# 削除基準となる日付を計算します
threshold_date=$(date -u -d "${OLDER_THAN_DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ)
# 削除対象となるログストリームを取得します
streams_url="${LOKI_API_BASE}/loki/api/v1/series?match=${LABEL_NAME}%3D%22${LABEL_VALUE}%22"
streams_response=$(curl -s -X GET "${streams_url}")
# 各ログストリームに対して、削除処理を実行します
stream_count=0
while read -r stream; do
stream_count=$((stream_count+1))
labels_str=$(echo "${stream}" | sed -n 's/.*"stream":{\\(.*\\)}.*/\\1/p')
delete_url="${LOKI_API_BASE}/loki/api/admin/delete_series?match=${labels_str}&end=${threshold_date}"
delete_response=$(curl -s -o /dev/null -w "%{http_code}" -X POST "${delete_url}")
if [ "${delete_response}" -ne 204 ]; then
echo "Error deleting logs for ${labels_str}: ${delete_response}"
else
echo "Deleted logs for ${labels_str}"
fi
done < <(echo "${streams_response}" | grep -oP '{"stream":{.*?}}')
echo "Number of streams found: ${stream_count}"
このスクリプトに必要なパラメータは次のとおりです。
<older_than_days>: 削除する日数 <label_name>: ログに対するラベル名 <label_value>: ログに対するラベル値 これらのパラメータをスクリプトに渡すには、以下のように実行します。
./delete_old_logs.sh 30 your_label your_label_value
この例では、OLDER_THAN_DAYS を 30、LABEL_NAME を your_label、LABEL_VALUE を your_label_value に設定しています。これにより、指定されたラベルと値を持つ 30 日より古いログデータを削除できます。
スクリプトを実行可能にして保存します。例えば、delete_old_logs.sh という名前で保存する場合:
chmod +x delete_old_logs.sh
このスクリプトを手動で実行するか、cron ジョブやタスクスケジューラーを使用して定期的に実行させます。例えば、Linux の cron ジョブで毎日実行するには、以下のような設定を追加します。
0 0 * * * /path/to/delete_old_logs.sh
この Bash シェルスクリプトは、指定されたラベルと値を持つログデータを検索し、指定された日数より古いログデータを削除します。これにより、特定のラベルに基づいて古いログデータを定期的に削除できます。