ログファイルにどんどん追記していくと際限なくファイルサイズが増大していってしまいます。そこでログファイルがある一定のファイルサイズを超えたらローテーションして古いファイルを削除したりして増大するのを防ぎます。
標準モジュール
今回、標準モジュールに下記のようなプロシージャを作成しました。ログファイルの最大サイズ、ログファイル名、ログファイルの拡張子、あとローテーション世代数を定数で設定しています。
ローテートは、最大サイズを超えたらファイル名に数字をプラスしていきます。そして、ローテーション世代数を超えたファイルは削除するようにしています。
error.log
↓
error1.log
↓
error2.log
↓
error3.log
↓
削除
'定数
Private Const MAX_FILE_SIZE As Long = 4096 'ログファイルサイズ(KB)
Private Const LOG_FILE_NAME As String = "error" 'ログファイル名
Private Const LOG_FILE_EXT As String = "log" '拡張子名
Private Const ROTATE_NUM As Integer = 3 'ログローテーション世代数
'ログローテート
Public Sub LogRotate(ByVal fileName As String)
On Error GoTo Err_Trap
Dim fso As FileSystemObject
Dim i As Integer
Dim r As Integer
Dim folderPath As String
Dim srcFile As String
Dim destFile As String
Dim oldestFile As String
Dim checkFile As String
Dim fileSize As Long
'FileSystemObjectオブジェクトを作成する
Set fso = CreateObject("Scripting.FileSystemObject")
'ファイルが存在するかチェック
If fso.FileExists(fileName) = False Then
Exit Sub
End If
'ファイルサイズを取得する
fileSize = fso.GetFile(fileName).Size
'ファイルサイズをチェック
If fileSize < MAX_FILE_SIZE * 1024 Then
'最大サイズを超えてなければ処理を抜ける
Exit Sub
End If
'フォルダパスを取得
folderPath = fso.GetParentFolderName(fileName)
'最古ファイルパス
oldestFile = folderPath & "\" & LOG_FILE_NAME & ROTATE_NUM & "." & LOG_FILE_EXT
'最古ファイルが存在すれば削除
If fso.FileExists(oldestFile) Then
Call fso.DeleteFile(oldestFile)
r = ROTATE_NUM - 1
Else
'ローテーション世代数を調べる
For r = (ROTATE_NUM - 1) To 0 Step -1
If r = 0 Then
checkFile = folderPath & "\" & LOG_FILE_NAME & "." & LOG_FILE_EXT
Else
checkFile = folderPath & "\" & LOG_FILE_NAME & r & "." & LOG_FILE_EXT
End If
If fso.FileExists(checkFile) Then
Exit For
End If
Next
End If
'ファイル名をローテーションする
For i = r To 0 Step -1
If i = 0 Then
srcFile = folderPath & "\" & LOG_FILE_NAME & "." & LOG_FILE_EXT
Else
srcFile = folderPath & "\" & LOG_FILE_NAME & i & "." & LOG_FILE_EXT
End If
destFile = folderPath & "\" & LOG_FILE_NAME & i + 1 & "." & LOG_FILE_EXT
If fso.FileExists(srcFile) Then
'ファイル名変更
Call fso.MoveFile(srcFile, destFile)
End If
Next
Exit_Trap:
Set fso = Nothing
Exit Sub
Err_Trap:
MsgBox Err.Number & Space(2) & Err.Description, vbCritical, "エラー"
Resume Exit_Trap
End Sub
実際のローテートする部分だけです。
このプロシージャをログファイル作成時に呼び出してあげればローテートしてくれます。
実行例

↓ローテート

このようにファイル名の番号をずらし、最大世代数のファイルは削除されます。
スポンサーリンク