// Авторы файла: aim. // Содержимое: Объект Log. Отвечает за лог =). // Потокобезопасность: Использование объекта безопасно. unit u_log; {$mode objfpc} interface uses windows, sysutils; type TLog = class private FLogFile: Text; procedure WriteString(const Str: string); CS: TRTLCriticalSection; public // В параметр передается имя файла для лога. constructor Create(const FileName: string); destructor Destroy; override; // Пишет в лог обычное сообщение (с пометкой "Note"). procedure Write(const SenderName, Str: string); // Пишет в лог отладочную информацию (с пометкой "Debug"). procedure Debug(const SenderName, Str: string); // Пишет в лог сообщение об ошибке (с пометкой "Error"). procedure Error(const SenderName, Str: string); // Пишет в лог сообщение о критической ошибке (с пометкой "Fatal Error") // и мгновенно прекращает выполение программы. procedure Fatal(const SenderName, Str: string); end; var Log: TLog; implementation const TimeFormat = 'yyyy-mm-dd hh:mm:ss.zzz'; // Формат даты. // TLog ----- // private procedure TLog.WriteString(const Str: string); begin try EnterCriticalSection(CS); {$I-} WriteLn(FLogFile, Str); Flush(FLogFile); {$I+} if IOResult <> 0 then begin MessageBox(0, 'Can''t write to log file. Program halted.', 'File error', MB_OK); Halt(0); end; finally LeaveCriticalSection(CS); end; end; // public constructor TLog.Create(const FileName: string); begin InitCriticalSection(CS); {$I-} Assign(FLogFile, FileName); if FileExists(FileName) then Append(FLogFile) else Rewrite(FLogFile); {$I+} if (IOResult = 0) and (FileName <> '') then begin WriteString(''); WriteString('*** Start session ***'); end else begin MessageBox(0, 'Can''t create or open log file. Program halted.', 'File error', MB_OK); Halt(0); end; end; destructor TLog.Destroy; begin WriteString('*** End session ***'); Close(FLogFile); DoneCriticalSection(CS); end; procedure TLog.Write(const SenderName, Str: string); begin WriteString(FormatDateTime(TimeFormat, Now) + ' Note: "' + SenderName + '" - ' + Str); end; procedure TLog.Debug(const SenderName, Str: string); begin WriteString(FormatDateTime(TimeFormat, Now) + ' Debug: "' + SenderName + '" - ' + Str); end; procedure TLog.Error(const SenderName, Str: string); begin WriteString(FormatDateTime(TimeFormat, Now) + ' Error: "' + SenderName + '" - ' + Str); end; procedure TLog.Fatal(const SenderName, Str: string); begin WriteString(FormatDateTime(TimeFormat, Now) + ' Fatal Error: "' + SenderName + '" - ' + Str); MessageBox(0, PChar(AnsiString(SenderName + ': ' + Str)), 'Fatal Error', MB_OK); Halt(0); end; end.