2017年10月9日

【Access】ログファイルをローテーションする


ログファイルにどんどん追記していくと際限なくファイルサイズが増大していってしまいます。そこでログファイルがある一定のファイルサイズを超えたらローテーションして古いファイルを削除したりして増大するのを防ぎます。

標準モジュール

今回、標準モジュールに下記のようなプロシージャを作成しました。
ログファイルの最大サイズ、ログファイル名、ログファイルの拡張子、あとローテーション世代数を定数で設定しています。

ローテートは、最大サイズを超えたらファイル名に数字をプラスしていきます。そして、ローテーション世代数を超えたファイルは削除するようにしています。

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

実際のローテートする部分だけです。
このプロシージャをログファイル作成時に呼び出してあげればローテートしてくれます。


実行例



↓ローテート


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






スポンサーリンク