tTLogFile для Embarcadero RAD studio XE

tTLogFile для Embarcadero RAD studio XE
Ранее был предложен компонент tTLogFile  для упрощения логирования работы приложения в идет текстовых файлов . В данной статье предлагается компонент обновленный для установки в Embarcadero RAD studio XE.

Исходній код и демонстрационное приложение можно скачать LogFile.

0. Компонент tLogFile.

Компонент  tLogFile предназначен для простого добавления в приложения функционала логирования. Логирование производиться в текстовые файлы. Запись проводиться согласно настраиваемым параметрам.

1. Установка

1.1. Components -> Install Packages… -> Add

1.2. Выберите TtLogFile.bpl, нажмите Open

1.3. OK

2.1. File -> Open Project …

2.2. Выберите TtLogFile.dpk, нажмите Open

2.3. Compile TtLogFile.dpk

2.4. Install TtLogFile.dpk

2.5. OK

2. Описание свойств

 

Компонент расположен на вкладке TTComponents

Свойства :

property Active - true – запись в лог ведется, false-лог отключен

property FileName – Префикс имени файла логов

property KeepOpened – true – файл не закрывается после каждой записи

property FileDir – Путь где будут храниться файла логов

property FileExt: – расширение для файла логов

property FormatDateTimeToLog – формат даты и времени, добавляемый в лог

property FormatDateStr – формат даты времени, добавляемый в имя файла

property AddDateTimeToLog – true – записывать в файл дату и время, false – не записывать

property AddMessageTypeToLog – true – записывать в файл тип сообщения, false – не записывать

property IniFileName: – путь к ini – file , где будут храниться настройки для фала логов

property IniFileSectionName – Название секции в ini – file, из которой необходио будет забирать настройки для логировнаия

property LogLevel – {llINFO – записывать в лог информационные сообщения, llERROR – записывать в лог сообщения об ошибке, llTRACE – записывать в лог сообщения для трассировки}

property isShowMessageOnError:  – {Признак того, что надо показывать сообщение при возникновении ошибки}

Методы;

function Prepare: Boolean – Функция инициализации работы с файлами логов.

procedure Add(ALevel: TLogLevel; AText: string); – Функция для записи в файл логов сообщения

procedure AddFile(ALevel: TLogLevel; AFilePath: string); – Функция для записи в файл данных из жругого текстового файла.

procedure AddStrings(ALevel: TLogLevel; AStrings: TStrings); – Функция для записи множества строк в лог файл

procedure AddFromStream(ALevel: Tloglevel; AStream: TStream; ABufSize: Integer); – Функция для записи из потока в лог файл

procedure SaveToStream(AStream: TStream; const AFileName: string = ”); – Функция я для сохранения файла логов в поток.

function LoadFromIniFile: Boolean; – Функция для загрузки параметров логирования из файла.

———————————————————————

Пример ini-файла:

[Log]

; уровень логирования уазывает типы каких ообщений будут писаться

;  INFO  = 1 – information ;

;  ERROR = 2 – Errors;

;  TRACE = 3 – Debug;

LogLevel = 4

;префикс имени

FileName = Log

; 1 – писать в лог файл, 0 – не писать в лог файл

Active = 1

; 1 – держать файл открытым

KeepOpened = 1

; добавлять перед каждой записью в файл лога дату и время

AddDateTimeToLog = 1

; расширение файла лога

FileExt = .log

; формат даты времени в имени файла.

FormatDateStr = YYYYMMDD

;путь к файлам логов

; папка Log в директории откуда запускается файл

FileDir = .\Log

; формат даты времени добавляемого в лог

;dd/mm/yy hh:mm:ss = 09/02/49 01:02:03

;mmm = Фев

;mmmm = Февраль

;ddd = Вт

;dddd = Вторник

;ddddd = 09/02/2049

;dddddd = 09 Февраль 2049

;hhampm = 01AM

;t = 01:02

;tt = 01:02:03

;dd/mm/yyyy = 09/02/2049

;dd/mm/yy hh:mm:ss = 09-02-49 01_02_03

;mmm = ФЕВ

;mmmm = ФЕВРАЛЬ

;ddd = ВТ

;dddd = ВТОРНИК

;ddddd = 09-ФЕВ-49

;dddddd = ВТОРНИК 09 ФЕВРАЛЬ 1949

;hhampm = 01утро

;t = 01_02_03

;tt = 01 _ 02 _ 03 . 004

;dd/mm/yyyy = 09-02-1949

FormatDateTimeToLog = dd/mm/yyyy hh:mm:ss

; true – записывать в файл тип сообщения, false – не записывать

AddMessageTypeToLog = 1

uLogFile.pas

<br />unit uLogFile;<br /><br />interface<br /><br />uses<br />  Windows, SysUtils, Classes, IniFiles, Forms, uClearLog, Dialogs;<br />{<br />Пример ini-файла:<br />[Log]<br />; уровень логирования уазывает типы каких ообщений будут писаться<br />;  INFO  = 1 - information ;<br />;  ERROR = 2 - Errors;<br />;  TRACE = 3 - Debug;<br />LogLevel = 4<br />;префикс имени<br />FileName = Log<br />; 1 - писать в лог файл, 0 - не писать в лог файл<br />Active = 1<br />; 1 - держать файл открытым<br />KeepOpened = 1<br />; добавлять перед каджой записью в файл лога дату и время<br />AddDateTimeToLog = 1<br />; расширение файла лога<br />FileExt = .log<br />; формат даты времени в имени файла.<br />FormatDateStr = YYYYMMDD<br />;путь к файлам логов<br />; папка Log в директории откуда запускается файл<br />FileDir = .\Log<br />; формат даты времени добавляемого в лог<br />;dd/mm/yy hh:mm:ss = 09/02/49 01:02:03<br />;mmm = Фев<br />;mmmm = Февраль<br />;ddd = Вт<br />;dddd = Вторник<br />;ddddd = 09/02/2049<br />;dddddd = 09 Февраль 2049<br />;hhampm = 01AM<br />;t = 01:02<br />;tt = 01:02:03<br />;dd/mm/yyyy = 09/02/2049<br />;dd/mm/yy hh:mm:ss = 09-02-49 01_02_03<br />;mmm = ФЕВ<br />;mmmm = ФЕВРАЛЬ<br />;ddd = ВТ<br />;dddd = ВТОРНИК<br />;ddddd = 09-ФЕВ-49<br />;dddddd = ВТОРНИК 09 ФЕВРАЛЬ 1949<br />;hhampm = 01утро<br />;t = 01_02_03<br />;tt = 01 _ 02 _ 03 . 004<br />;dd/mm/yyyy = 09-02-1949<br />FormatDateTimeToLog = dd/mm/yyyy hh:mm:ss<br />; true - записывать в файл тип сообщения, false - не записывать<br />AddMessageTypeToLog = 1<br />;Количество симвлов в разделителе<br />DateTimeAndTextSeparatorLength = 0<br />;Символ разделителя<br />DateTimeAndTextSeparator=-<br />;Удалять файлы лога до определенной даты = 1 - очишать , 0 - не очищать.<br />isDeleteLogFiles = 1<br />;Количество дней которое надо хранить файлы логов<br />StoreLogFileDays = 90<br />; 1 - показвать сообщение об ошибке , 0 - не показывать.<br />isShowMessageOnError = 0<br />}<br />{<br />Example ini-file:<br />[Log]<br />; Logging level uazyvaet message containing any type will be written<br />; INFO = 1 - information;<br />; ERROR = 2 - Errors;<br />; TRACE = 3 - Debug;<br />LogLevel = 4<br />; Name prefix<br />FileName = Log<br />; 1 - to write to log file 0 - do not write to log file<br />Active = 1<br />; Keep a file open<br />KeepOpened = 1<br />; Add to Kajo record to a log file date and time<br />AddDateTimeToLog = 1<br />; Expanding the log file<br />FileExt =.log<br />; Date format of time in the filename.<br />FormatDateStr = YYYYMMDD<br />; The path to the log<br />; folder Log at the current folder<br />FileDir = .\Log<br />; Date format of time in the log<br />;dd/mm/yy hh:mm:ss = 09/02/49 01:02:03<br />;mmm = Feb<br />;mmmm = February<br />;ddd = Th<br />;dddd = Thursday<br />;ddddd = 09/02/2049<br />;dddddd = 09 february 2049<br />;hhampm = 01AM<br />;t = 01:02<br />;tt = 01:02:03<br />FormatDateTimeToLog = dd/mm/yyyy hh:mm:ss<br />; true - write to log file message type, false - dont write<br />AddMessageTypeToLog = 1<br />;length of Separetor<br />DateTimeAndTextSeparatorLength = 0<br />;symbol of Separetor<br />DateTimeAndTextSeparator=-<br />;Delete Log Files after n days  = 1 - delete , 0 - not delete.<br />isDeleteLogFiles = 1<br />;number of days before delete log files<br />StoreLogFileDays = 90<br />; 1 - Show message on error? 0 - don't show<br />isShowMessageOnError = 0 }<br />const<br />//типы сообщений, которые будут писаться в лог<br />//  LOG_LEVEL_NONE  = 0;<br />  cCopyRight = '*** Copyright (c) Eugene Tatarinov, 2010 - ...'+#10#13;<br />  c_DF_DateTimeSeparator = '$';<br />resourcestring<br />  infoAddToLogFile = 'Добавляем в лог файл данные из файла - ';<br />  infoAddFromStream = 'Добавляем в лог файл данные из потока!';<br />  cErrorWhileOpenIniFile = 'Ошибка при открытии файла!!!'+#10#13;<br />  cErrorWhilePrepareFile = 'Ошибка при открытии файла!!!'+#10#13;<br />type<br />  TLogLevel = (llINFO, llERROR, llTRACE, llInfinity);<br />  TtLogFile = class(TComponent)<br />  private<br />    { Private declarations }<br />    FFile: TextFile;<br />    FCriticalSection: TRTLCriticalSection;<br />    FActive: boolean;<br />    FFileName: AnsiString;<br />    FFullName: AnsiString;<br />    FKeepOpened: boolean;<br />    FFileExt: AnsiString;<br />    FFormatDateStr: AnsiString;<br />    FIniFileName: AnsiString;<br />    FIniFileSectionName: AnsiString;<br />    FLogLevel: TLogLevel;<br />//    FLogLevleInterior: TLogLevel;<br />    FFileDir: AnsiString;<br />    FAddDateTimeToLog: boolean;<br />    FAddMessageTypeToLog: Boolean;<br />    FFormatDateTimeToLog: AnsiString;<br />    FDateTimeAndTextSeparator: AnsiString;<br />    FDateTimeAndTextSeparatorLength: Integer;<br />    FisDeleteLogFiles: Boolean;<br />    FStoreLogFileDays: Integer;<br />    FisShowMessageOnError: Boolean;<br />    procedure SetFileName(const Value: AnsiString);<br />    procedure SetKeepOpened(const Value: boolean);<br />    procedure SetFileExt(const Value: AnsiString);<br />    procedure SetFormatDateStr(const Value: AnsiString);<br />    procedure SetIniFileName(const Value: AnsiString);<br />    procedure SetIniFileSectionName(const Value: AnsiString);<br />    procedure SetLogLevel(const Value: TLogLevel);<br />    procedure SetFileDir(const Value: AnsiString);<br />    procedure SetAddDateTimeToLog(const Value: boolean);<br />    procedure SetAddMessageTypeToLog(const Value: Boolean);<br />    procedure SetFormatDateTimeToLog(const Value: AnsiString);<br />    function GetLogFileName: AnsiString;<br />    procedure SetDateTimeAndTextSeparator(const Value: AnsiString);<br />    procedure SetDateTimeAndTextSeparatorLength(const Value: Integer);<br />    procedure SetisDeleteLogFiles(const Value: Boolean);<br />    procedure SetStoreLogFileDays(const Value: Integer);<br />    procedure SetisShowMessageOnError(const Value: Boolean);<br />  protected<br />    { Protected declarations }<br />  public<br />    { Public declarations }<br />    {поток, в котором будут удаляться файлы.}<br />    FthrdDeleteLogs: TClearLog;<br />    // Дирректория для ini - файла<br />    FFileDirIniFile: AnsiString;<br />    // Сепаратор даты / времени и текста - Для того что бы не вычислять его каждый раз<br />    FSeparator: AnsiString;<br />    // Функция инициализации работы с файлами логов.<br />    function Prepare: Boolean;<br />    constructor Create(AOwner: TComponent); override;<br />    destructor Destroy; override;<br />    // Функция для записи в файл логов собщения<br />    procedure Add(ALevel: TLogLevel; AText: AnsiString);<br />    // Функция для записи в файл данных из жругого текстового файла.<br />    procedure AddFile(ALevel: TLogLevel; AFilePath: AnsiString);<br />    // Функция для записи множества строк в лог файл<br />    procedure AddStrings(ALevel: TLogLevel; AStrings: TStrings);<br />    // Функция для записи из потока в лог файл<br />    procedure AddFromStream(ALevel: Tloglevel; AStream: TStream; ABufSize: Integer);<br />    // Функция я для сохранения файла логов в поток.<br />    procedure SaveToStream(AStream: TStream; const AFileName: AnsiString = '');<br />    // Функция для загрузки парметров логирования из файла.<br />    function LoadFromIniFile: Boolean;<br />    // Количество симвлов в разделителе<br />    property DateTimeAndTextSeparatorLength: Integer read FDateTimeAndTextSeparatorLength<br />      write SetDateTimeAndTextSeparatorLength;<br />  published<br />    { Published declarations }<br />    //  true - запись в лог ведется, false-лог отключен<br />    property Active: boolean read FActive write FActive;<br />    //  Префикс имени файла логов<br />    property FileName: AnsiString read FFileName write SetFileName;<br />    //  true - файл не закрывается после каждой записи<br />    property KeepOpened: boolean read FKeepOpened write SetKeepOpened;<br />    // Путь где будут храниться файла логов<br />    property FileDir: AnsiString read FFileDir write SetFileDir;<br />    // расширение для файла логов<br />    property FileExt: AnsiString read FFileExt write SetFileExt;<br />    // формат даты и времени, добавляемый в лог<br />    property FormatDateTimeToLog: AnsiString read FFormatDateTimeToLog write SetFormatDateTimeToLog;<br />    // формат даты времени, добавляемый в имя файла<br />    property FormatDateStr: AnsiString read FFormatDateStr write SetFormatDateStr;<br />    // true - записывать в файл дату и время, false - не записывать<br />    property AddDateTimeToLog: boolean read FAddDateTimeToLog write SetAddDateTimeToLog;<br />    // true - записывать в файл тип сообщения, false - не записывать<br />    property AddMessageTypeToLog: Boolean read FAddMessageTypeToLog write SetAddMessageTypeToLog;<br />    // путь к ini - file , где будут храниться настройки для фала логов<br />    property IniFileName: AnsiString read FIniFileName write SetIniFileName;<br />    // Название секции в ini - file, из которой необходио будет забирать настройки для логировнаия<br />    property IniFileSectionName: AnsiString read FIniFileSectionName write SetIniFileSectionName;<br />    {llINFO - записывать в лог информационные сообщения,<br />     llERROR - записывать в лог сообщения об ошибке,<br />     llTRACE - записывать в лог сообщения для трассировки}<br />    property LogLevel: TLogLevel read FLogLevel write SetLogLevel;<br />    // Символ разделителя<br />    property DateTimeAndTextSeparator: AnsiString read FDateTimeAndTextSeparator write<br />      SetDateTimeAndTextSeparator;<br />      {Удалять файлы лога до определенной даты = 1 - очишать , 0 - не очищать.}<br />    property isDeleteLogFiles: Boolean read FisDeleteLogFiles write SetisDeleteLogFiles;<br />      {Количество дней которое надо хранить файлы логов}<br />    property StoreLogFileDays: Integer read FStoreLogFileDays write SetStoreLogFileDays;<br />      {Признак того, что надо показывать сообщение при возникновении ошибки}<br />    property isShowMessageOnError: Boolean read FisShowMessageOnError write<br />      SetisShowMessageOnError;<br />  end;<br /><br />procedure Register;<br /><br />implementation<br /><br />procedure Register;<br />begin<br />  RegisterComponents('TTComponets', [TtLogFile]);<br />end;<br /><br />procedure TtLogFile.Add(ALevel: TLogLevel; AText: AnsiString);<br />const<br />  cErrorWhileAddLineToLogFile = 'Ошибка при добавлении строки в лог файл :'+#10#13;<br />var<br />  fname, lMessage: AnsiString;<br />begin<br />  if not Active then exit;<br />  if ALevel &gt; FLogLevel then exit;<br />  EnterCriticalSection(FCriticalSection);<br />  fname:= GetLogFileName;<br />  try<br />    try<br />      if not KeepOpened then<br />      begin<br />        AssignFile(FFile, fname);<br />        if FileExists(fname) then<br />          Append(FFile)<br />        else<br />          Rewrite(FFile);<br />      end<br />      //если файл держим открытым, то если новая дата, надо его переоткрыть<br />      else<br />        if fname &lt;&gt; FFullName then<br />        begin<br />          CloseFile(FFile);<br />          FFullName:= fname;<br />          AssignFile(FFile, fname);<br />          if FileExists(fname) then<br />            Append(FFile)<br />          else<br />            Rewrite(FFile);<br />        end;<br />      lMessage:= '';<br />      if AddDateTimeToLog then<br />        lMessage:= lMessage + FormatDateTime(FormatDateTimeToLog, Now)+<br />          DateTimeAndTextSeparator<br />      else<br />        if AddDateTimeToLog then<br />          lMessage:= lMessage + TimeToStr(Now)+' ';<br />      if AddMessageTypeToLog then<br />        case ALevel of<br />          llINFO:lMessage:= lMessage + 'I ';<br />          llERROR:lMessage:= lMessage + 'E ';<br />          llTRACE:lMessage:= lMessage + 'T ';<br />        end;<br />      lMessage:= lMessage + FSeparator +AText;<br />      writeln(FFile, lMessage);<br />      //  writeln(FFile, inttostr(GetCurrentThreadId) + ' - ' + AText);<br />      if not KeepOpened then<br />        CloseFile(FFile);<br />    Except on e: Exception do<br />      begin<br />        if isShowMessageOnError then<br />          ShowMessage('# '+cErrorWhileAddLineToLogFile+FFullName+#10#13+<br />            AText+#10#13+e.Message);<br />      end;<br />    end;<br />  finally<br />    LeaveCriticalSection(FCriticalSection);<br />  end;<br />end;<br /><br />procedure TtLogFile.AddFile(ALevel: TLogLevel; AFilePath: AnsiString);<br />var<br />  F: TextFile;<br />  lStr: AnsiString;<br />begin<br />  Add(ALevel, infoAddToLogFile+AFilePath);<br />  try<br />    AssignFile(F, AFilePath);<br />    Reset(F);<br />    while not EOF(F) do<br />    begin<br />      Readln( F, lStr);<br />      Add(ALevel, lStr);<br />    end;<br />  finally<br />    CloseFile(F);<br />  end;<br />end;<br /><br />procedure TtLogFile.AddFromStream(ALevel: Tloglevel; AStream: TStream; ABufSize: Integer);<br />var<br />  lStr: AnsiString;<br />begin<br />  Add(ALevel, infoAddFromStream);<br />  AStream.Position:=0;<br />  SetLength(lStr, AStream.Size);<br />  AStream.ReadBuffer(lStr[1], AStream.Size);<br />  Add(ALevel, lStr);<br />end;<br /><br />procedure TtLogFile.AddStrings(ALevel: TLogLevel; AStrings: TStrings);<br />var<br />  i: Integer;<br />begin<br />  for i := 0 to AStrings.Count - 1 do<br />    Add(ALevel, AStrings[i]);<br />end;<br /><br />constructor TtLogFile.Create(AOwner: TComponent);<br />begin<br />  inherited;<br />  FthrdDeleteLogs:= TClearLog.Create(True);<br />  FthrdDeleteLogs.FreeOnTerminate:= True;<br />end;<br /><br />destructor TtLogFile.Destroy;<br />begin<br />  if FthrdDeleteLogs &lt;&gt; nil then begin<br />    FthrdDeleteLogs.Terminate;<br />    FthrdDeleteLogs:= nil;<br />  end;<br /><br />  if KeepOpened then CloseFile(FFile);<br />  inherited;<br />end;<br /><br />function TtLogFile.GetLogFileName: AnsiString;<br />var<br />  lSize: Cardinal;<br />  lComputerName: AnsiString;<br />begin<br />  lSize:= MAX_COMPUTERNAME_LENGTH + 1;<br />  setlength(lComputerName,20);<br />  GetComputerName(PWideChar(lComputerName), lSize);<br />  setlength(lComputerName,lSize);<br />  Result:= FileDir + FileName + FormatDateTime(FormatDateStr, Date)+'-'+<br />    lComputerName+'-'+ FileExt;<br />end;<br /><br />function TtLogFile.LoadFromIniFile: Boolean;<br />var<br />  lApplicationName: AnsiString;<br />  lApplicationHandle: THandle;<br />  ini: TIniFile;<br />begin<br /><br />  ini:= TIniFile.Create(IniFileName);<br />  try<br />    lApplicationHandle:= Application.Handle;<br />    lApplicationName:= Application.Name;<br />    try<br />      Result:= True;<br />      if IniFileName = '' then begin<br />        Result:= False;<br />        Exit<br />      end;<br />      LogLevel:= TLogLevel(ini.ReadInteger(IniFileSectionName, 'LogLevel', 0));<br />      FileName:= ini.ReadString(IniFileSectionName, 'FileName', 'Log');<br />      FileDir:= ini.ReadString(IniFileSectionName, 'FileDir', ExtractFilePath(IniFileName));<br />      Active:= ini.ReadBool(IniFileSectionName, 'Active', false);<br />      KeepOpened:= ini.ReadBool(IniFileSectionName, 'KeepOpened', true);<br />      AddDateTimeToLog:= ini.ReadBool(IniFileSectionName, 'AddDateTimeToLog', true);<br />      FileExt:= ini.ReadString(IniFileSectionName, 'FileExt', '.log');<br />      FormatDateStr:= ini.ReadString(IniFileSectionName, 'FormatDateStr', '_yyyy_MM_dd');<br />      FormatDateTimeToLog:= ini.ReadString(IniFileSectionName, 'FormatDateTimeToLog', '_yyyy_MM_dd');<br />      AddMessageTypeToLog:= ini.ReadBool(IniFileSectionName, 'AddMessageTypeToLog', true);<br />      DateTimeAndTextSeparatorLength:= ini.ReadInteger(IniFileSectionName, 'DateTimeAndTextSeparatorLength', 0);<br />      DateTimeAndTextSeparator:= ini.ReadString(IniFileSectionName, 'DateTimeAndTextSeparator', '-');<br />      isDeleteLogFiles:= ini.ReadBool(IniFileSectionName, 'isDeleteLogFiles', False);<br />      StoreLogFileDays:= ini.ReadInteger(IniFileSectionName, 'StoreLogFileDays', 90);<br />      isShowMessageOnError:= ini.ReadBool(IniFileSectionName, 'isShowMessageOnError', true);<br />    Except on e: Exception do<br />      begin<br />        Result:= False;<br />        MessageBox(lApplicationHandle, PChar(lApplicationName),<br />          PChar(cErrorWhileOpenIniFile+e.Message), MB_OK or MB_ICONERROR);<br />      end;<br />    end;<br />  finally<br />    ini.Free;<br />  end;<br />end;<br /><br />function TtLogFile.Prepare: Boolean;<br />var<br />  lApplicationName: AnsiString;<br />  lApplicationHandle: THandle;<br />begin<br />  Result:= True;<br />  lApplicationHandle:= Application.Handle;<br />  lApplicationName:= Application.Name;<br />  try<br />    InitializeCriticalSection(FCriticalSection);<br />    FFullName:= GetLogFileName;<br />    //если файл надо открыть и держать всегда, сделаем это сейчас<br />    if KeepOpened then<br />    begin<br />      AssignFile(FFile, FFullName);<br />      if FileExists(FFullName) then<br />        Append(FFile)<br />      else<br />        Rewrite(FFile);<br />    end;<br />    if isDeleteLogFiles then FthrdDeleteLogs.Resume;<br />  except on e: Exception do<br />    begin<br />      Result:= False;<br />      MessageBox(lApplicationHandle, PChar(lApplicationName),<br />        PChar(cErrorWhilePrepareFile+E.Message), MB_OK or MB_ICONERROR);<br />    end;<br />  end;<br />end;<br /><br />procedure TtLogFile.SaveToStream(AStream: TStream; const AFileName: AnsiString = '');<br />var<br />  fs: TFileStream;<br />begin<br />  if not Assigned(AStream) then exit;<br />  EnterCriticalSection(FCriticalSection);<br />  fs:= nil;<br />  try<br />    //т.к. не получается открывать файл только для чтения, сделаем временное<br />    //освобождение файла<br />    if KeepOpened then CloseFile(FFile);<br />    if AFileName = '' then<br />      fs:= TFileStream.Create(FFullName, fmOpenRead or fmShareDenyNone)<br />    else<br />      fs:= TFileStream.Create(FileDir + AFileName, fmOpenRead or fmShareDenyNone);<br />    AStream.CopyFrom(fs, fs.Size);<br />  finally<br />    if Assigned(fs) then fs.Free;<br />    if KeepOpened then<br />      if FileExists(FFullName) then<br />        Append(FFile)<br />      else<br />        Rewrite(FFile);<br />    LeaveCriticalSection(FCriticalSection);<br />  end;<br />end;<br /><br />procedure TtLogFile.SetAddDateTimeToLog(const Value: boolean);<br />begin<br />  FAddDateTimeToLog := Value;<br />end;<br /><br />procedure TtLogFile.SetAddMessageTypeToLog(const Value: Boolean);<br />begin<br />  FAddMessageTypeToLog := Value;<br />end;<br /><br />procedure TtLogFile.SetDateTimeAndTextSeparator(const Value: AnsiString);<br />var<br />  lChar: AnsiChar;<br />begin<br />  if FDateTimeAndTextSeparator &lt;&gt; Value then begin<br />    FDateTimeAndTextSeparator:= Value;<br />    if Length(DateTimeAndTextSeparator) &lt;&gt; 0 then<br />      lChar:= DateTimeAndTextSeparator[1]<br />    else<br />      lChar:= c_DF_DateTimeSeparator;<br />    FSeparator:= StringOfChar(lChar, DateTimeAndTextSeparatorLength);<br />  end;<br />end;<br /><br />procedure TtLogFile.SetDateTimeAndTextSeparatorLength(const Value: Integer);<br />var<br />  lChar: AnsiChar;<br />begin<br /> if FDateTimeAndTextSeparatorLength &lt;&gt; Value then begin<br />   FDateTimeAndTextSeparatorLength:= Value;<br />   if Length(DateTimeAndTextSeparator) &lt;&gt; 0 then<br />     lChar:= DateTimeAndTextSeparator[1]<br />   else lChar:= c_DF_DateTimeSeparator;<br />   FSeparator:= StringOfChar(lChar, DateTimeAndTextSeparatorLength);<br /> end;<br />end;<br /><br />procedure TtLogFile.SetFileDir(const Value: AnsiString);<br />begin<br />  FFileDir:= Value;<br />  if FFileDir &lt;&gt; '' then begin<br />    FFileDirIniFile:= FFileDir;<br />    if FFileDir[1] = '.' then begin<br />      Delete(FFileDir,1,1);<br />      Delete(FFileDir,1,1);<br />      FFileDir:= ExtractFilePath(Application.ExeName)+FFileDir;<br />    end;<br />    ForceDirectories(FFileDir);<br />    FFileDir := IncludeTrailingPathDelimiter(FFileDir);<br />    FthrdDeleteLogs.PathToLogs:= FFileDir;<br />  end;<br />end;<br /><br />procedure TtLogFile.SetFileExt(const Value: AnsiString);<br />begin<br />  if FFileExt &lt;&gt; Value then begin<br />    FFileExt:= Value;<br />    FthrdDeleteLogs.FileExt:= '*'+FFileExt;<br />  end;<br />end;<br /><br />procedure TtLogFile.SetFileName(const Value: AnsiString);<br />begin<br />  FFileName := Value;<br />end;<br /><br />procedure TtLogFile.SetFormatDateStr(const Value: AnsiString);<br />begin<br />  FFormatDateStr := Value;<br />end;<br /><br />procedure TtLogFile.SetFormatDateTimeToLog(const Value: AnsiString);<br />begin<br />  FFormatDateTimeToLog := Value;<br />end;<br /><br />procedure TtLogFile.SetIniFileName(const Value: AnsiString);<br />begin<br />  FIniFileName := Value;<br />end;<br /><br />procedure TtLogFile.SetIniFileSectionName(const Value: AnsiString);<br />begin<br />  FIniFileSectionName := Value;<br />end;<br /><br />procedure TtLogFile.SetisDeleteLogFiles(const Value: Boolean);<br />begin<br />  FisDeleteLogFiles := Value;<br />end;<br /><br />procedure TtLogFile.SetisShowMessageOnError(const Value: Boolean);<br />begin<br />  FisShowMessageOnError := Value;<br />end;<br /><br />procedure TtLogFile.SetKeepOpened(const Value: boolean);<br />begin<br />  FKeepOpened := Value;<br />end;<br /><br />procedure TtLogFile.SetLogLevel(const Value: TLogLevel);<br />begin<br />  FLogLevel := Value;<br />end;<br /><br />procedure TtLogFile.SetStoreLogFileDays(const Value: Integer);<br />begin<br />  if FStoreLogFileDays &lt;&gt; Value then begin<br />    FStoreLogFileDays:= Value;<br />    FthrdDeleteLogs.ClearDate:= Now()-FStoreLogFileDays;<br />  end;<br />end;<br /><br />end.<br />

uClearLog.pas

<br />unit uClearLog;<br /><br />interface<br /><br />uses<br />  Windows, SysUtils,Classes;<br /><br />type<br />  TClearLog = class(TThread)<br />  private<br />    FClearDate: TDateTime;<br />    FPathToLogs: AnsiString;<br />    FFileExt: AnsiString;<br />    procedure SetClearDate(const Value: TDateTime);<br />    procedure SetFileExt(const Value: AnsiString);<br />    procedure SetPathToLogs(const Value: AnsiString);<br />    { Private declarations }<br />  protected<br />    procedure Execute; override;<br />  public<br />    property ClearDate: TDateTime read FClearDate write SetClearDate;<br />    property PathToLogs: AnsiString read FPathToLogs write SetPathToLogs;<br />    property FileExt: AnsiString read FFileExt write SetFileExt;<br />  end;<br /><br />implementation<br />  uses uLogFile;<br />{ Important: Methods and properties of objects in visual components can only be<br />  used in a method called using Synchronize, for example,<br /><br />      Synchronize(UpdateCaption);<br /><br />  and UpdateCaption could look like,<br /><br />    procedure TCLearPosLog.UpdateCaption;<br />    begin<br />      Form1.Caption := 'Updated in a thread';<br />    end; }<br /><br />{ TCLearPosLog }<br /><br />procedure TClearLog.Execute;<br />var<br />  srec: TSearchRec;<br />begin<br />  { Place thread code here }<br />//  dtmDatecs.LogFile.Add(llINFO, 'Начинаем подчищать логи в дирректории:'+PathToLogs);<br />  if FindFirst(PathToLogs+FileExt, faAnyFile, srec) = 0 then begin<br />    repeat<br />      Sleep(0);<br />      if FileDateToDateTime(srec.Time)&lt;= ClearDate then begin<br />        Windows.DeleteFile(PChar(PathToLogs+srec.Name));<br />        Sleep(0);<br />      end;<br />    until FindNext(srec) &lt;&gt; 0;<br />    Sleep(0);<br />    FindClose(srec);<br />    Sleep(0);<br />  end;<br />  Terminate;<br />end;<br /><br />procedure TClearLog.SetClearDate(const Value: TDateTime);<br />begin<br />  FClearDate := Value;<br />end;<br /><br />procedure TClearLog.SetFileExt(const Value: AnsiString);<br />begin<br />  FFileExt := Value;<br />end;<br /><br />procedure TClearLog.SetPathToLogs(const Value: AnsiString);<br />begin<br />  FPathToLogs := Value;<br />end;<br /><br />end.<br />

Еще интересные записи по данной теме

Share

Tags: , , ,

Leave a Reply