zoukankan      html  css  js  c++  java
  • 日志文件

    delphi 写日志文件的一个类, 从网上查找的资料, 然后按自己的需求修正了下.

    使用: 引用本单元后, 调用WriteLog函数即可. 默认31天清理一次日志.

    unit uProgLog;
    
    interface
    
    uses
      Windows, SysUtils, SyncObjs;
    
    type
      TLogFile = class
      private
        FLogKeepDays: Integer; //日志保存时间
        FLogPath: string;      //日志保存路径
    
        FCsWriteLogFile: TCriticalSection;
        FLogFile: TextFile;    //日志文件句柄
        FLogOpened: Boolean;   //日志文件是否打开
        FFileTime: TDateTime; //当前日志文件创建或打开时间
      protected
      public
        function WriteLogFile(const szFormat: string;const Args: array of const): Boolean;
        function DeleteLogFile(): Boolean;
        constructor Create();
        Destructor Destroy(); override;
      end;
    
      procedure WriteLog(const szFormat: string; const Args: array of const);
    var
      gLog: TLogFile=nil;
      
    implementation
    
    uses DateUtils;
      
    procedure WriteLog(const szFormat: string; const Args: array of const);
    begin
      if gLog = nil then
        gLog := TLogFile.Create();
      gLog.WriteLogFile(szFormat,Args);
    end;
    
    { TLogFile }
    
    constructor TLogFile.Create();
    var
      sLogName: string;
    begin
      FLogOpened := False;
      FCsWriteLogFile := TCriticalSection.Create;
    
      FLogKeepDays := 31;
      sLogName := ExtractFileName(ParamStr(0));
      sLogName := Copy(sLogName,1,Pos('.',sLogName)-1);
    //  if sLogName <> '' then
        //eg; D:\MYfile\myexelog\2009-03-05.log
        //防止同一系统中模块过多, 路径混乱
      FLogPath := ExtractFilePath(ParamStr(0))+ 'Log\'+sLogName+'\'
    //  else FLogPath := ExtractFilePath(ParamStr(0))+ 'Log\';
    end;
    
    function TLogFile.DeleteLogFile(): Boolean;
    var
      SearchRec: TSearchRec;
      FileMask: string;
      LocalFileTime: TFileTime;
      FileTime: Integer;
    begin
      FileMask := FLogPath + '*.log';
      Result := FindFirst(FileMask, faAnyFile, SearchRec) = 0;
      try
        if Result then
        begin
          repeat
            if (SearchRec.Name[1] <> '.')
              and (SearchRec.Attr and faDirectory <> faDirectory) then
            begin
              FileTimeToLocalFileTime(SearchRec.FindData.ftCreationTime, LocalFileTime);
              FileTimeToDosDateTime(LocalFileTime, LongRec(FileTime).Hi, LongRec(FileTime).Lo);
              // 按照文件创建日期删除文件
              if FileDateToDateTime(FileTime) <= (Now() - FLogKeepDays) then
                DeleteFile(FLogPath + SearchRec.Name);
            end;
          until FindNext(SearchRec) <> 0;
        end;
      finally
        FindClose(SearchRec);
      end;
    end;
    
    destructor TLogFile.Destroy;
    begin
      if (FLogOpened) then CloseFile(FLogFile);
      FCsWriteLogFile.Free();
      inherited;
    end;
    
    function TLogFile.WriteLogFile(const szFormat: string;
      const Args: array of const): Boolean;
    var
      sFileName: string;
      dtCurrent: TDateTime;
      sBuffer: string;
      szDate: string;
    begin
      Result := false;
      FCsWriteLogFile.Enter();
      try
        dtCurrent := Now(); //注意这里得到的是local time
        szDate := FormatDateTime('YYYYMMDD',dtCurrent);
        try
          if (FLogOpened)
             and (DateOf(dtCurrent) <> DateOf(FFileTime)) then
          begin
            CloseFile(FLogFile);
            FLogOpened := False;
            //每月15日 清理日志
            if Copy(szDate,7,2) = '15' then
              DeleteLogFile();
          end;
    
          if (not FLogOpened) then
          begin
            if not DirectoryExists(FLogPath) then
              if not ForceDirectories(FLogPath) then exit;
            sFileName := FLogPath + szDate+'.log';
            Assignfile(FLogFile, sFileName);
            
            try
              if FileExists(sFileName) then
                append(FLogFile)
              else rewrite(FLogFile);
              FLogOpened := True;
            except
              FLogOpened := False;
              Exit;
            end;
            FFileTime := dtCurrent;
          end;
    
          if FLogOpened then
          begin
            sBuffer := FormatDateTime('HH:MM:SS',dtCurrent) + '  ' +szFormat;
            sBuffer := Format(sBuffer, Args);
            writeln(FLogFile, sBuffer);
          end;
        except
          OutputDebugString('Write Log Exception');
        end;
      finally
        FCsWriteLogFile.Leave; //离开临界区
      end;
      Result := true;
    end;
    
    initialization
    
    finalization
      if gLog <> nil then
        FreeAndNil(gLog);
    end.
  • 相关阅读:
    JavaEE开发中系列总结
    equals及==问题
    eclipse debug弹出窗
    MacOS Sierra 显示隐藏文件命令
    了解点Excel VBA 代码,让工作效率提升多倍~
    PADS Layout进行eco对比更新
    PCB走线规则与一些技巧介绍
    旁路电容与去耦电容的区别
    Flash download failed-Cortex-M3的原因及解决办法
    Keil U5不能识别DAP仿真器的解决办法及原因
  • 原文地址:https://www.cnblogs.com/doorsky/p/1941941.html
Copyright © 2011-2022 走看看