
ログファイルにどんどん追記していくと際限なくファイルサイズが増大していってしまいます。そこでログファイルがある一定のファイルサイズを超えたらローテーションして古いファイルを削除したりして増大するのを防ぎます。
標準モジュール
今回、標準モジュールに下記のようなプロシージャを作成しました。ログファイルの最大サイズ、ログファイル名、ログファイルの拡張子、あとローテーション世代数を定数で設定しています。
ローテートは、最大サイズを超えたらファイル名に数字をプラスしていきます。そして、ローテーション世代数を超えたファイルは削除するようにしています。
error.log
↓
error1.log
↓
error2.log
↓
error3.log
↓
削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | '定数 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 |
実際のローテートする部分だけです。
このプロシージャをログファイル作成時に呼び出してあげればローテートしてくれます。
実行例

↓ローテート

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