シェルスクリプトで実現するログ監視とエラーメール通知の自動化検証

## はじめに
今回は、Linux環境において、特定のログファイルに「ERROR」という文字列が現れた際に、自動で検知し、サーバー管理者にメールで通知する仕組みを構築します。

日常的なサーバー運用において、エラーの早期発見は非常に重要です。

この記事では、エラーログ検知とアラート通知を行う方法を検証し、その手順を忘備録として記録します。



## 前提条件
今回の検証を進めるにあたり、以下の環境が必要です。

:::note info
**検証環境**
**Linuxディストリビューション:**
仮想環境や実際のサーバー上でLinux（ここではAlmaLinux 9.3を使用）が稼働していること。

**管理者権限を持つユーザーアカウント:**
sudo権限にてコマンド操作できること。

**メールサーバー構築済み：**

[こちらの記事で紹介：自宅のAlmaLinux 9.3でのメールサーバー構築およびメール送信の検証](https://qiita.com/free-honda/items/c10052dcd507ac7e7605)
:::

**自宅のVirtualBox環境**
今回も VirtualBox 上で構築した検証環境を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/70df8950-ddfa-2728-1d71-60373a8276e9.png)

:::note info
※検証には実行中の「AlmaLinux」を使用します。
:::

## 知識整理

今回の検証で必要な知識を簡単に整理します。

**ログ監視**
ログ監視とは、サーバーやアプリケーションの動作を記録したログファイルを定期的に確認し、特定の文字列やエラーメッセージが含まれているかどうかを監視することです。

**シェルスクリプト**
シェルスクリプトは、Linuxコマンドを自動的に実行するためのスクリプトです。

### ディレクトリ構成
以下のようにログ監視のためのスクリプトや設定を整理します。

```
/home/honda/log_monitor/
│
├── monitor.sh    # ログ監視スクリプト
└── logs/         # ログファイルを保管するディレクトリ
    └── myapp.log # 監視対象のログファイル
```

:::note 
**monitor.sh:**
ログファイルを監視し、エラーを検知した場合にメール通知を行うスクリプト

**logs/myapp.log:**
監視対象となるアプリケーションのログファイル
:::

今回は、シェルスクリプトを使ってログファイルを監視し、エラーを検知する仕組みを構築します。

### フロー処理の流れ
以下は、ログ監視からエラーメール通知までの処理の流れを表したフローチャートです。

```monitor.sh
+-----------------------------+  
|      スクリプト開始          |  
+-----------------------------+  
               |  
               v  
+-----------------------------+  
|  監視対象のログファイルを確認 |  
+-----------------------------+  
               |  
               v  
+-----------------------------+  
| 「ERROR」文字列が含まれるか？ |  
| (grep "ERROR" log_file.txt)  |  
+-----------------------------+  
                    |            |  
                    | YES        | NO  
                    v            v  
+-----------------------------+    +-----------------------------+  
|   エラーメッセージを作成      |    |  次の監視を待機              |  
|   (エラーログの内容を取得)    |    +-----------------------------+  
+-----------------------------+  
               |  
               v  
+-----------------------------+  
| 管理者にメール通知を送信       |  
| (mailコマンドなどで通知)      |  
+-----------------------------+  
               |  
               v  
+-----------------------------+  
|      ログ監視を再開           |  
+-----------------------------+  
               |  
               v  
+-----------------------------+  
|      スクリプト終了           |  
+-----------------------------+
```

このスクリプトでは、**指定されたログファイルに「ERROR」という文字列が含まれているかどうかを確認し、検知した場合にはその内容を管理者にメールで通知します**。

## 検証の流れ
Linux環境でエラーログの検知とアラート通知を行う手順について、以下の2つのステップに分けて詳しく解説します。

**ステップ１: ログ監視スクリプトの作成**
**ステップ２: テストと動作確認**

::: note
※本記事は、すでに検証環境が構築されていることを前提としています。
:::

### ステップ１: ログ監視スクリプトの作成
まずは、monitor.shというシンプルなスクリプトを作成します。

```monitor.sh
#!/bin/bash

LOGFILE="/home/honda/log_monitor/logs/myapp.log"
MAIL_TO="admin@example.com"

# ログファイルの監視
tail -Fn0 $LOGFILE | while read line
do
    # "ERROR"が含まれている場合、メール送信
    echo "$line" | grep "ERROR"
    if [ $? = 0 ]; then
        echo "エラー検出: $line" | mail -s "エラーログ通知" $MAIL_TO
    fi
done
```

**※注意: スクリプトを実行するには、実行権限を付与する必要があります。** 以下のコマンドを使って権限を付与してください。

```
chmod +x 作成したスクリプト名.sh
```

このスクリプトは、指定されたログファイルの末尾を監視し、「ERROR」という文字列が含まれている場合にメールで通知を行います。

:::note warn
**シェルスクリプトのポイント**
**・tail -Fn0**
 ログファイルの末尾をリアルタイムで監視し、新しい行が追加されるたびに出力します。

**・grep "ERROR"**
ログに「ERROR」という文字列が含まれているか確認します。

**・mail -s**
エラー検出時にメールで通知を送信するコマンドです。
:::

### ステップ２: テストと動作確認
次に、スクリプトが正しく動作するかをテストします。

**スクリプトを実行**
以下のコマンドで監視スクリプトをバックグラウンドで実行します。

```
nohup /home/honda/log_monitor/monitor.sh &
```
:::note
**nohup**はバックグラウンドでプロセスを実行し、シェルを閉じても監視が続けられるようにするためのコマンドです。
:::

**テストログの追加**
テストとしてログファイルに「ERROR」を含むログを追記し、メールが正しく送信されるか確認します。

```
echo "$(date '+%Y-%m-%d %H:%M:%S') ERROR: Sample error message" >> /home/honda/log_monitor/logs/myapp.log
```

**実際の検証画面**
以下は検証時の画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/76972fed-eaa7-ef1a-c894-37c0367fd23b.png)


**メールの確認**
設定したメールアドレスに「エラーログ通知」の件名でメールが届きます。メール内容の例は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/20034158-4ff0-612f-6ef7-835cad172d06.png)

また、ログファイルに「ERROR」の文字列が正常に出力されていることも確認できます。

```logs/myapp.log
2024-09-23 10:58:36 ERROR: Sample error message
```

## まとめ
今回の検証では、Linux環境で特定のログファイルを監視し、「ERROR」という文字列が検出された際に自動的にメール通知を行うシンプルなログ監視システムを構築しました。

この仕組みを導入することで、サーバー運用中にリアルタイムでエラーログを検知し、迅速に対応することが可能になります。

サーバー管理の効率向上に役立てていただければ幸いです。

## おまけ: 成功メッセージの場合の正常性確認

ログに「ERROR」ではなく「**SUCCESS**」という文字列を追加し、メール通知が飛ばないことを確認します。以下のコマンドで「成功メッセージ」をログに追記します。

```
echo "$(date '+%Y-%m-%d %H:%M:%S') SUCCESS: Operation completed successfully" >> /home/honda/log_monitor/logs/myapp.log
```

この操作後、スクリプトは「ERROR」以外のログには反応しないため、メールが送信されません。

```logs/myapp.log
2024-09-23 11:18:08 SUCCESS: Operation completed successfully
```

これにより、エラー時のみ通知が行われることを確認できます。もしメールが送信されてしまった場合、スクリプトに問題があるため再度確認してください。

## 参考記事
https://qiita.com/Qrg/items/107928672569a8141222

https://qiita.com/hakoritenshi/items/92bb3606dd5ee81eb05b