Windows Serverでのログローテーションをバッチファイルとタスクスケジューラで自動化する方法

## はじめに

Windowsサーバーでのログ管理は、システムのパフォーマンスやセキュリティを維持するために重要です。

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

本記事では、Windowsサーバーでログローテーションを自動化するためのバッチファイルの作成方法と、それをタスクスケジューラで定期的に実行する手順を解説します。

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

:::note info
**検証環境**
**Windows Server 2016 以降の環境:**
Windows Server（ここでは Windows Server 2022）で構築している状態です。
:::

また、管理者権限のあるユーザーアカウントと、基本的なバッチファイルの知識があることを前提としています。


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3d9d22ff-457a-1b00-58af-ff9948466145.png)


:::note info
※検証には「Windows Server 2022」を使用します。
:::

## 知識整理

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

**タスクスケジューラ**
タスクスケジューラは、Windowsに標準で搭載されているツールです。指定した時間やイベントに基づいてプログラムやスクリプトを自動的に実行することができます。

**バッチファイル**
バッチファイルは、複数のコマンドを自動で実行するために使用されるWindowsのファイル形式です。

**ログローテーション**
ログファイルが一定のサイズに達したり、一定の期間が経過したときに、古いログファイルをバックアップし、新しいログファイルを作成するプロセスです。

:::note warn
さらに詳しく知りたい場合は、以下のリンクもご参考ください。
**タスクスケジューラについて**
公式サイト：https://learn.microsoft.com/ja-jp/windows/win32/taskschd/about-the-task-scheduler
参考サイト：https://wa3.i-3-i.info/word11751.html

**バッチファイルについて**
参考サイト：https://it-trend.jp/development_tools/article/32-0040
参考サイト：https://qiita.com/talesleaves/items/8990a55b7a770de3d34f

**ログローテーションについて**
参考サイト：https://linuc.org/study/column/3635/
参考サイト：https://bftnagoya.hateblo.jp/entry/2023/12/19/162748
:::

定期的に、ログローテーションすることにより、ディスクスペースの浪費を防ぎ、ログの管理が効率的に行えるようになります。

## バッチファイルの処理フローとディレクトリ構成

以下は、今回作成するバッチファイルの処理フローです。

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

以下は「Desktop\ログローテーション検証\」フォルダのディレクトリ構成と、関連するバッチファイルの内容です。

```
Desktop\
└── ログローテーション検証\
    ├── アーカイブ\
    │   └── (圧縮ファイルや移動された .log ファイルがここに保存されます)
    ├── ログファイル\
    │   └── (ここにログファイルが保存されます)
    ├── ローテーション.log        # (ログローテーション処理のログを記録するファイル)
    ├── ログローテーション.bat    # (ログファイルをアーカイブに移動するバッチファイル)
    └── ログ作成.bat              # (ランダムなログファイルを作成するバッチファイル)
```


## 検証の流れ
ログローテーションをバッチファイルとタスクスケジューラで自動化する手順を、以下の2ステップで説明します。

**ステップ1：ログローテーションバッチファイルの作成**
**ステップ2：タスクスケジューラでの定期実行設定**

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

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

まず、ログローテーション用のログファイルを自動で作成するためのバッチファイルを用意します。以下のコードを使ってランダムなログファイルを作成します。

※ログファイルを作成するディレクトリは、ご自身の環境に合わせて修正してください。
```ログ作成.bat
@echo off
setlocal enabledelayedexpansion

:: ログファイルを作成するディレクトリ
set logDir=C:\Users\Administrator\Desktop\ログローテーション検証\ログファイル

:: 作成するログファイルの個数を聞く
set /p count="いくつのログファイルを作成しますか？: "

:: ファイル作成ループ
for /l %%i in (1,1,%count%) do (
    :: ランダムな数字でファイル名を作成
    set /a randNum=!random! %% 10000
    set "fileName=!randNum!.log"
    
    :: ログファイルを作成
    echo ログファイルの内容です > "%logDir%\!fileName!"
    
    echo ログファイル !fileName! が作成されました。
)

pause
```

このバッチファイルを実行すると、指定した個数分のランダムなログファイルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1ee59d54-875f-56b8-2c05-173def039f8c.png)

:::note alert
**※注意: ファイルの文字エンコーディングがUTF-8などに設定されていると、バッチファイル実行時に文字化けなどが発生することがありますので、ファイルを「Shift-JIS」で保存してください。**
:::

ファイルの中身は「ログファイルの内容です」とシンプルなファイルになっています。

## ステップ1：ログローテーションバッチファイルの作成

次に、ログファイルをアーカイブするためのバッチファイルを作成します。

以下のコードをテキストエディタにコピーし、「ログローテーション.bat」として保存します。

```ログローテーション.bat
@echo off
setlocal

:: ソースディレクトリとアーカイブディレクトリの設定
set "sourceDir=C:\Users\Administrator\Desktop\ログローテーション検証\ログファイル"
set "archiveDir=C:\Users\Administrator\Desktop\ログローテーション検証\アーカイブ"
set "logFile=C:\Users\Administrator\Desktop\ログローテーション検証\ローテーション.log"

:: アーカイブディレクトリが存在しない場合は作成
if not exist "%archiveDir%" (
    mkdir "%archiveDir%"
)

:: ログファイルに現在の日付と時刻を記録する関数
call :log "ローテーション開始"

:: .log ファイルを移動
for %%f in ("%sourceDir%\*.log") do (
    move "%%f" "%archiveDir%"
)

:: ログファイルに完了メッセージを記録
call :log "ログローテーションが完了しました。"

:: スクリプト終了
exit /b

:: ログファイルにメッセージを書き込むサブルーチン
:log
(
    echo %date% %time% %1
) >> "%logFile%"
goto :eof
```

※ファイルパスは、実際に使用するパスに置き換えてください。

:::note alert
**※注意: ファイルの文字エンコーディングがUTF-8などに設定されていると、バッチファイル実行時に文字化けなどが発生することがありますので、ファイルを「Shift-JIS」で保存してください。**
:::

上記の「ログローテーション.bat」を実行すると、ログファイルディレクトリ配下に事前に作成しておいた「ランダム数字.log」ファイルがすべてアーカイブディレクトリに移動していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c0b267be-c77f-6b37-2837-baae8531c7d8.png)

バッチファイルを実行した後、「ログファイル」の中身のlogファイルがすべて「アーカイブ」に移動していることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4e6fcf7d-8d2f-a082-31ea-897ef18c3b9f.png)

## ステップ2：タスクスケジューラでの定期実行設定

次は、タスクスケジューラで定期的にこのバッチファイルを使いログローテーションをしていきます。

```
タスクスケジューラを開く
スタートメニューから「タスクスケジューラ」を検索し、開きます。

新しいタスクの作成
左側の「タスクスケジューラライブラリ」を右クリックし、「基本タスクの作成」を選択します。
タスクの名前と説明を入力し、「次へ」をクリックします。

トリガーの設定
「毎日」や「毎週」などのトリガーを選択し、実行する頻度を設定します。例えば、毎日実行する場合は「毎日」を選び、実行する時間を設定します。
設定後、「次へ」をクリックします。

操作の設定
「プログラムの開始」を選択し、「次へ」をクリックします。
「プログラム/スクリプト」のフィールドにバッチファイルのパスを入力します（例: C:\path\to\log_rotate.bat）。
「次へ」をクリックし、設定内容を確認後、「完了」をクリックします。
```

タスクスケジューラの「タスクスケジューラライブラリ」で、新しく作成したタスクが一覧に表示されていることを確認します。

ここでは、検証時間として21:45に実行されるように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d65123c4-36be-3c32-5c27-3ce0046566d0.png)

:::note info
次回のスケジュール実行時に、ログファイルが正しくローテーションされるか確認します。
:::

タスクスケジューラでのタスクが正常に完了し、ログローテーションが実行されていることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cbf155f6-9fbd-7045-2824-d8d4b179343b.png)

ローテーション.log ファイルにも、ローテーションが開始され、完了したことが記録されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5d4105b9-5d07-b15f-f6d2-99bb5a89eec1.png)

## まとめ

本記事では、Windowsサーバーでログローテーションを自動化するためのバッチファイルの作成方法と、タスクスケジューラでの定期実行設定について説明しました。

これにより、ログファイルの管理が自動化され、ディスクスペースの効率的な使用が可能になります。

次回は、ログローテーションのパフォーマンスや他の管理ツールについても詳しく説明していく予定です。お楽しみに！

## 参考記事
https://bftnagoya.hateblo.jp/entry/2023/12/19/162748

https://qiita.com/danishi/items/c5f1277ac6375b94bc56