【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「beSIM(ビーシム)」

【200ヶ国以上に対応】グローバル eSIM「beSIM(ビーシム)」

【中国法人に対応】中国クラウド / サーバー構築・運用保守

【中国法人に対応】中国クラウド / サーバー構築・運用保守

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【Windows】不要になったログファイルを定期的に自動削除する

こんにちは。
最近uptimeが12分くらい
システムソリューション部のかわです。

いつのまにか春ですね。
個人的には春が一番好きでして、いろんなものが新しくなるので心機一転て感じです。
できれば過去の黒歴史もバッサリ捨て去りたいので、今回はWindowsのログローテートについて書きます。春からはどんどんいらないファイルは整理していきましょう。

実行環境

Windows 11 Pro

バッチファイルの準備

何らかの業務アプリケーションの操作ログファイルが「C:\Users\testuser\Documents\test」配下に保存されていくと仮定しましょう。
この日々追加されていく永久機関のようなログファイル。手動でポチポチ消すのは面倒ですよね。今回は、これを2週間経過後に定期削除してくれるバッチファイルを解説していきます。

まずはテキストエディタ等で▼のようなバッチファイル(.bat形式)を作成します。

"logrotate.bat"

@echo off
setlocal

set LOGDIR="C:\Users\testuser\Documents\test"

forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path" /D -14

exit /B 0

これを、Windowsのタスクスケジューラに組込めば準備完了です。

プログラム解説

@echo off
setlocal

▶ @echo offによって出力結果を表示させないようにします。setlocalを使うことで、このプログラム上で使用される環境変数が他に影響しない(ローカル化)ようになります。

set LOGDIR="C:\Users\testuser\Documents\test"

▶ 「LOGDIR」という変数に、今回対象のログ保存先パスを代入します。

forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path" /D -14

▶ ややこしいので部分ごとに分けましょう

下記ヘルプから、
/P で該当パスを参照して、
/M でファイルを検索(今回は「.log」という拡張子のファイル)、
/C で任意のコマンドを実行させて、
/D で経過日数を確認します。今回は14日=2週間。

forfilesコマンドヘルプ
FORFILES [/P パス名] [/M 検索マスク] [/S]
         [/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}]

説明:
    ファイル (または、ファイルのセット) を選んで、そのファイル上の
    コマンドを実行します。これはバッチ ジョブの使用に便利です。

パラメーター一覧:
    /P    パス名        検索を開始するパスを示します。
                        既定のフォルダーは現在実行中の
                        ディレクトリ (.) です。

    /M    検索マスク    検索マスクによってファイルを検索します。
                        既定の検索マスクは '*' です。

    /S                  サブディレクトリに対しても処理を行うように forfiles に
                        指示します (例: "DIR /S")。

    /C    コマンド      各ファイルの実行するコマンドを示します。
                        コマンドの文字列は二重引用符で囲んでくだ
                        さい。

                        既定のコマンドは "cmd /c echo @file" です。

                        次の変数をコマンドの文字列に使用することができ
                        ます:
                        @file    - フィルの名前を返します。
                        @fname   - 拡張子なしのファイル名を
                                   返します。
                        @ext     - ファイルの拡張子だけを返し
                                   ます。
                        @path    - ファイルの完全なパスを返します。
                        @relpath - ファイルの相対パスを返し
                                   ます。
                        @isdir   - ファイルの種類がディレクトリの場合
                                   は "TRUE"を、ファイルの場合は
                                   "FALSE" を返します。
                        @fsize   - ファイルのサイズをバイトで返し
                                   ます。
                        @fdate   - ファイルの最終更新日を返し
                                   ます。
                        @ftime   - ファイルの最終更新時刻を返し
                                   ます。

                        コマンド ラインに特殊文字を使用する場合は、
                        文字を 16 進数コードで 0xHH 形式で (例:
                        タブは 0x09) 指定してください。CMD.EXE の
                        内部コマンドの前には "cmd /c" が必要
                        です。

    /D    日付          最終更新日が指定された日かもしくはそれ
                        以降 (+)、または指定された日またはそれ
                        以前 (-) であるファイルを "yyyy/MM/dd" 形式を使っ
                        て選択します。または、最終更新日が現在
                        の日にちより "dd" 日あと、もしくは "dd" 日
                        前であるファイルを選択します。有効な "dd"
                        値は 0 から 32768 の間です。
                        指定がない場合は、"+" が既定で使用さ
                        れます。
    /?                  ヘルプまたは使用法を表示します。
"cmd /C Del /S @path"

▶ この箇所で削除コマンドの「Del」、/S @pathで指定ファイルをすべてのサブディレクトリからも削除して、削除したファイル名を表示させます。

exit /B 0

▶ exitに「/B」を付与することでバッチ終了、終了コード「0」を指定することでエラーを返さずcmd.exeを終了できます。

実行結果

試しにコマンドプロンプトから以下を手動実行するとデバッグが可能です。
適当にファイルを置いて、/Dオプションを除いた結果を確認してみます。

testuser> forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path"

削除したファイル - C:\Users\testuser\Documents\test\test.log
削除したファイル - C:\Users\testuser\Documents\test\test1.log
削除したファイル - C:\Users\testuser\Documents\test\test2.log

ちゃんと削除されましたね。
ここまでできればもう一息。タスクスケジューラの設定をしていきます。

タスクスケジューラへの追加

Windowsの検索とかでタスクスケジューラーを開きます。
メニューから[タスクスケジューラライブラリ]>[タスクの作成]をクリック


▶ [全般]タブではタスク名や「ログオン時のみ実行」等の権限設定を行います。セキュリティオプションは実行したい内容によって任意で調節します。


▶ [トリガー]タブでは実行タイミングを設定します。今回は2/9から毎週日曜日0時としました。


▶ 最後に[操作]タブから作成したプログラムファイルを選択します。

あとはよしなに設定すればPC容量で悩むこともなくなって、4月からはバリバリ活躍できること間違いなし!過去は振り返らずがんばれ新成人!

~完~

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
23
読み込み中...
23 票, 平均: 1.00 / 123
18,131
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

かわ けん

システムソリューション部所属
好奇心旺盛ポケ○ン