Linuxでログローテーションを自動化するシェルスクリプトの作成と運用方法

## はじめに

Linuxサーバーにおけるログ管理は、システムのパフォーマンスやセキュリティを維持する上で非常に重要です。

ログファイルが肥大化すると、ディスクスペースを圧迫し、システムパフォーマンスの低下を招く可能性があります。

本記事では、Linux環境でのログローテーションを自動化するためのシェルスクリプト作成方法と、cronを使った定期実行の手順を解説します。

## 前提条件
この記事の手順を実行するために、以下の環境を用意してください。

:::note info
**検証環境**
**Linux環境:**
仮想環境や実サーバー上で動作するLinux（ここではAlmaLinux 9.3を使用）
**管理者権限のあるユーザー:**
作成したシェルスクリプトを実行できるユーザー
:::

また、シェルスクリプトの基本知識があることを前提としています。

**自宅の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」を使用します。
:::

## 知識整理

ログローテーションを行うために必要な知識を簡単に整理します。

**cron**
cronは、Linuxで定期的にコマンドやスクリプトを自動実行するためのタスクスケジューリングツールです。

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

**ログローテーション**
ログファイルが一定のサイズや日数に達すると、古いログを圧縮・アーカイブし、新しいログファイルを作成するプロセスです。これにより、ディスクスペースの無駄な消費を防ぎます。

:::note warn
さらに詳しく知りたい場合は、以下のリンクもご参考ください。
**cronについて**
参考サイト：https://www.kagoya.jp/howto/it-glossary/server/cron/
**シェルスクリプト**
参考サイト：https://x-tech.pasona.co.jp/media/detail.html?p=7484
**ログローテーション**
参考サイト：https://qiita.com/matsuda-hiroki/items/9802538432b9dbf03ab0
:::

## シェルスクリプトの処理フローとディレクトリ構成

以下は、今回作成するシェルスクリプトの処理フローです。

```
+-----------------------------+  
|       スクリプト開始        |  
+-----------------------------+  
               |  
               v  
+-------------------------------------------+  
| ソースディレクトリとアーカイブディレクトリの設定 |  
+-------------------------------------------+  
               |  
               v  
+-------------------------------------------+  
| アーカイブディレクトリが存在しない場合は作成  |  
+-------------------------------------------+  
               |  
               v  
+-------------------------------------------+  
| ログファイルに「ローテーション開始」のメッセージを記録 |  
+-------------------------------------------+  
               |  
               v  
+-------------------------------------------+  
| .log ファイルをアーカイブディレクトリへ移動    |  
+-------------------------------------------+  
               |  
               v  
+-------------------------------------------+  
| ログファイルに「ログローテーション完了」のメッセージを記録|  
+-------------------------------------------+  
               |  
               v  
+-----------------------------+  
|        スクリプト終了        |  
+-----------------------------+  
```

ディレクトリ構成は以下の通りです。

```
/home/username/log-rotation-test/
    ├── archive/
    │   └── (圧縮ファイルや移動された .log ファイルがここに保存されます)
    ├── logs/
    │   └── (ここにログファイルが保存されます)
    ├── rotation.log        # (ログローテーション処理のログを記録するファイル)
    ├── log-rotation.sh     # (ログファイルをアーカイブに移動し、圧縮するシェルスクリプト)
    └── log-creation.sh     # (ランダムなログファイルを作成するシェルスクリプト)
```

## 検証の流れ
Linux環境でログローテーションを自動化する方法について、以下の2つのステップで詳細に解説します。

**ステップ1：ログローテーション用のシェルスクリプトの作成**
**ステップ2：cronでの定期実行設定**

また、ログファイルの自動作成用スクリプトは、事前準備で作成していきます。

:::note info
前提として、検証環境がすでに構築されていることを想定としています。
:::

## 事前準備：ログファイルの自動作成

まず、ログローテーションの検証のためにランダムなログファイルを作成するシェルスクリプトを用意します。

以下のコードを使用し、「log-creation.sh」として保存し、指定した数のランダムなログファイルを作成します。

※ログファイルを作成するディレクトリは、ご自身の環境に合わせて適宜変更してください。

```log-creation.sh
#!/bin/bash

# ログファイルを作成するディレクトリ
log_dir="/home/user/log-rotation-test/logs"

# 作成するログファイルの個数を指定
read -p "いくつのログファイルを作成しますか?: " count

# ディレクトリが存在しない場合は作成
mkdir -p "$log_dir"

# ログファイル作成ループ
for ((i=1; i<=count; i++))
do
    # ランダムなファイル名を作成
    rand_num=$RANDOM
    file_name="${rand_num}.log"

    # ログファイルを作成
    echo "ログファイルの内容です" > "${log_dir}/${file_name}"

    echo "ログファイル ${file_name} が作成されました。"
done
```

このスクリプトを実行することで、指定された数だけログファイルがランダムな名前で作成されます。

:::note alert
注意: シェルスクリプトの実行権限を忘れずに付与してください。以下のコマンドで実行権限を付与します。
```
chmod +x 作成したスクリプト名.sh
```
:::

上記のスクリプトを実行すると、「/home/honda/log-rotation-test/logs」配下にランダムのログファイルが50個作成されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8590bf70-d7ac-f2f4-93fe-cbfa86f17dc5.png)


## ステップ1：ログローテーション用のシェルスクリプトの作成

次に、作成したログファイルをアーカイブディレクトリに移動するシェルスクリプトを作成します。

以下のコードを使用し、「log-rotation.sh」として保存してください。

```log-rotation.sh
#!/bin/bash

# ログファイルのディレクトリとアーカイブ先ディレクトリを設定
source_dir="/home/user/log-rotation-test/logs"
archive_dir="/home/user/log-rotation-test/archive"
log_file="/home/user/log-rotation-test/rotation.log"

# アーカイブディレクトリが存在しない場合は作成
mkdir -p "$archive_dir"

# ログに現在の日時を記録
echo "$(date '+%Y-%m-%d %H:%M:%S') ローテーション開始" >> "$log_file"

# ログファイルをアーカイブディレクトリに移動
for file in "$source_dir"/*.log
do
    mv "$file" "$archive_dir"
    echo "$(date '+%Y-%m-%d %H:%M:%S') $file をアーカイブしました。" >> "$log_file"
done

# ログに完了メッセージを記録
echo "$(date '+%Y-%m-%d %H:%M:%S') ログローテーションが完了しました。" >> "$log_file"
```

:::note info
注意: パスを適切に変更し、ご自身の環境に合ったものにしてください。
:::

このスクリプトを実行すると、ログディレクトリ内の .log ファイルがすべてアーカイブディレクトリに移動されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/abee6d58-1441-b650-ff4a-a2bb85bc021b.png)

ログローテーションの詳細は rotation.log に記録され、開始と完了メッセージが正常に出力されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ae7c9ab5-1192-af29-6586-0df51ab2ff13.png)

## ステップ2：cronでの定期実行設定

次に、シェルスクリプトを定期的に実行するために cron を使用します。cron は指定したスケジュールでコマンドやスクリプトを実行するためのツールです。

ターミナルを開き、crontabを編集します。
```
crontab -e
```

以下のように、シェルスクリプトを定期実行するための設定を追加します。以下の例では、毎日午前3時にスクリプトを実行するように設定しています。

また、検証のため、2分おきにスクリプトを実行する設定も追加します。


```
0 3 * * * /home/honda/log-rotation-test/log-rotation.sh
*/2 * * * * /home/honda/log-rotation-test/log-rotation.sh
```

保存して終了すると、指定した時間に自動的にシェルスクリプトが実行されます。

:::note info 
上記ではcronのスケジュールを「毎日午前3時」に設定しています。スケジュールは次の形式で設定されます：**分 時 日 月 曜日 コマンド**
:::

設定後、指定した時刻にログローテーションが自動的に実行され、アーカイブが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/392e1894-4c05-4e39-d1d5-4b0008e4e5f4.png)


シェルスクリプトのログで、ローテーションが正常に完了したか確認できます。

**ローテーションのログ**

```
[root@HONDA-TEST log-rotation-test]# cat rotation.log
2024-09-18 21:18:02 ローテーション開始
2024-09-18 21:18:02 /home/honda/log-rotation-test/logs/19647.log をアーカイブしました。
2024-09-18 21:18:02 /home/honda/log-rotation-test/logs/25767.log をアーカイブしました。
2024-09-18 21:18:02 /home/honda/log-rotation-test/logs/29528.log をアーカイブしました。
2024-09-18 21:18:02 /home/honda/log-rotation-test/logs/6990.log をアーカイブしました。
2024-09-18 21:18:02 /home/honda/log-rotation-test/logs/7113.log をアーカイブしました。
2024-09-18 21:18:02 ログローテーションが完了しました。
```

## まとめ

本記事では、Linux でログローテーションをシェルスクリプトで自動化する手順と、cron を使用して定期実行する方法について解説しました。

これにより、ログ管理が自動化され、手動でのファイル整理の手間が省けます。

次回は、ローテーションの最適化やさらに高度なログ管理ツールの利用について解説していきます。

## おまけ
おまけとして、前回は同じログローテーションの仕組みをWindowsサーバでも検証してみました。

Windowsでの手順も気になる方は、ぜひそちらもチェックしてみてください！Windowsならではの設定ポイントも紹介しています。

https://qiita.com/free-honda/items/f8a6b228f1fd0add67eb


## 参考記事
https://linuc.org/study/column/3635/

https://ameblo.jp/bakery-diary/entry-12646260816.html