mail mail

Ведение логов действий программы (модуль класса)

Для использования подобного кода записи логов необходимо скопировать (перетащив мышкой) модуль класса LogRecorder из прикреплённого файла в ваш файл.

Sub ПримерИспользованияКласса_LogRecorder()
    ' создаём новый экземпляр лог-рекордера
   Dim LR As LogRecorder: Set LR = New LogRecorder
    ' задаём имя файла для лога (указываем полный путь)
   LR.LogFileFullName = ThisWorkbook.Path & "\common.log"
    LR.OpenLog    ' открываем лог (очистка файла + запись стартовой строки)

    For i = 1 To 10
        ' здесь ваш код ...
       ' заносим запись в лог
       LR.AddRecord "Событие " & i, "Информация " & i, 1
        If i Mod 3 = 0 Then ' i делится на 3 без остатка
           ' добавляем запись, до и после неё вставляем строку-разделитель
           LR.AddRecord "Значение " & i & " делится на 3 без остатка", _
                         "дополнительная проверка", 2, LOG_SEPARATOR_BEFORE_AND_AFTER
        End If
    Next i
    LR.AddRecord "Цикл завершен", "Проверено 10 чисел", 1, LOG_SEPARATOR_AFTER

    LR.CloseLog  ' закрываем лог (очистка буфера + запись конечной строки)
   ' LR.Show ' запуск текстового файла с логом (для просмотра
End Sub

Можно при добавлении записей в лог указать уровень записей - чтобы выделять отдельные записи отступом слева, как на этом скриншоте: http://ExcelVBA.ru/pictures/20110829-cd9-96kb.jpg

Кроме того, можно задать максимальное значение буфера лога (запись непосредственно в файла происходит не при каждом выполнении команды AddRecord, а только при превышении размера буфера, принудительном сохранении лога опцией ForceSavingLog=TRUE, а также при сохранении лога командой SaveLog, и при закрытии лога методом CloseLog )
Размер буфера можно изменить, задав значение свойства maxLogSizeBeforeSave (количество символов, при котором лог-файл будет сохранён принудительно, по умолчанию = 5000)

Результатом работы этого кода будет создание файла с именем common.log в той же папке, где расположен файл Excel с макросом:

==================================================
2011-08-29 10:19:30 Starting Log Record...
2011-08-29 10:19:30 Событие 1 Информация 1
2011-08-29 10:19:30 Событие 2 Информация 2
2011-08-29 10:19:30 Событие 3 Информация 3
==================================================
2011-08-29 10:19:30 Значение 3 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 4 Информация 4
2011-08-29 10:19:30 Событие 5 Информация 5
2011-08-29 10:19:30 Событие 6 Информация 6
==================================================
2011-08-29 10:19:30 Значение 6 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 7 Информация 7
2011-08-29 10:19:30 Событие 8 Информация 8
2011-08-29 10:19:30 Событие 9 Информация 9
==================================================
2011-08-29 10:19:30 Значение 9 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 10 Информация 10
2011-08-29 10:19:30 Цикл завершен Проверено 10 чисел
==================================================
2011-08-29 10:19:30 Finishing Log Record...
==================================================

Для создания сразу нескольких логов удобно использовать дополнительный модуль класса LogRecorders (также присутствует в прикреплённом файле)

Код модуля класса LogRecorder:

Public Enum LOG_SEPARATOR_TYPE    ' добавление разделителей в лог
   LOG_SEPARATOR_NONE = 0
    LOG_SEPARATOR_BEFORE = 1
    LOG_SEPARATOR_AFTER = 2
    LOG_SEPARATOR_BEFORE_AND_AFTER = 3
End Enum

Public LogFileFullName As String
Public LogIndex As LOG_TYPE
Public index As Long

Public Buffer As String
Public maxLogSizeBeforeSave As Long
Public LogSeparator As String


Private Sub Class_Terminate()
    Buffer = "" 'CloseLog
End Sub

Private Sub Class_Initialize()
    LogSeparator = String(50, "=") & vbNewLine
    If maxLogSizeBeforeSave = 0 Then maxLogSizeBeforeSave = 5000
End Sub


Sub SaveLog()
    If AddIntoTXTfile(LogFileFullName, Buffer) Then
        Buffer = Empty
    Else
        Debug.Print "Ошибка записи лога в файл " & LogFileFullName
    End If
End Sub

Sub OpenLog()
    Buffer = ""    ' очистка буфера
   SaveTXTfile LogFileFullName, ""    ' сохранение пустого файла
   AddRecord "Starting Log Record...", , , LOG_SEPARATOR_BEFORE, True    ' стартовая запись
End Sub

Sub CloseLog()
    AddRecord "Finishing Log Record...", , , LOG_SEPARATOR_AFTER, True    ' конечная запись
   Buffer = ""    ' очистка буфера
End Sub

Sub Show()
    'On Error Resume Next
   Path$ = Chr(34) & LogFileFullName & Chr(34)
    CreateObject("wscript.shell").Run Path$
End Sub

Sub AddRecord(ByVal EventX As String, Optional ByVal Info As String, _
              Optional ByVal Level As Integer = 0, _
              Optional ByVal LogSeparatorType As LOG_SEPARATOR_TYPE = LOG_SEPARATOR_NONE, _
              Optional ByVal ForceSavingLog As Boolean = False)

    txt = String(160, " "): Mid(txt, 1) = Left(EventX, 45): Mid(txt, 51) = Info
    txt = String(Level, vbTab) & Format(Now, "YYYY-MM-DD HH:NN:SS") & String(2, vbTab) & Trim(txt) & vbNewLine

    txt = IIf(LogSeparatorType = LOG_SEPARATOR_BEFORE Or LogSeparatorType = LOG_SEPARATOR_BEFORE_AND_AFTER, LogSeparator, "") & _
          txt & IIf(LogSeparatorType = LOG_SEPARATOR_AFTER Or LogSeparatorType = LOG_SEPARATOR_BEFORE_AND_AFTER, LogSeparator, "")

    Buffer = Buffer & txt
    If ForceSavingLog Or (Len(Buffer) > maxLogSizeBeforeSave) Then SaveLog
End Sub


Sub SaveLogAs(ByVal filename As String, Optional ByVal Overwrite As Boolean = False)
    On Error Resume Next
    txt = ReadTXTfile(LogFileFullName)
    If Overwrite Then
        SaveTXTfile filename, txt
    Else
        AddIntoTXTfile filename, txt
    End If
End Sub

' ===============
Private Function ReadTXTfile(ByVal filename As String) As String
    Set FSO = CreateObject("scripting.filesystemobject")
    Set ts = FSO.OpenTextFile(filename, 1, True): ReadTXTfile = ts.ReadAll: ts.Close
    Set ts = Nothing: Set FSO = Nothing
End Function

Private Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
    On Error Resume Next: Err.Clear
    Set FSO = CreateObject("scripting.filesystemobject")
    Set ts = FSO.CreateTextFile(filename, True)
    ts.Write txt: ts.Close
    SaveTXTfile = Err = 0
    Set ts = Nothing: Set FSO = Nothing
End Function

Private Function AddIntoTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
    On Error Resume Next: Err.Clear
    Set FSO = CreateObject("scripting.filesystemobject")
    Set ts = FSO.OpenTextFile(filename, 8, True): ts.Write txt: ts.Close
    Set ts = Nothing: Set FSO = Nothing
    AddIntoTXTfile = Err = 0
End Function

ВложениеРазмер
LOG_class.xls55 КБ

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
3 + 10 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.