我日志类的文件代码为:
---------------------------------------------------
unit Logger;
{----------------------------------------------------------------------------\-
日志类(TLogger)
日志级别约定:
          0 - Info
          1 - Debug
          2 - Warn
          3 - Error
\-----------------------------------------------------------------------------}
interfaceuses
   Windows,Classes,SysUtils;   const  WRITE_LOG_DIR = 'log\'; //记录日志默认目录
   WRITE_LOG_MIN_LEVEL = 0; //记录日志的最低级别,小于此级别只显示不记录
   WRITE_LOG_ADD_TIME = True; //记录日志是否添加时间
   WRITE_LOG_TIME_FORMAT = 'hh:nn:ss.zzz';//记录日志添加时间的格式
   
type
   TLogger = classprivate
    FCSLock: TRTLCriticalSection; //临界区
    FFileStream: TFileStream; //文件流
    FLogDir: AnsiString; //日志目录
    FLogName: AnsiString; //日志名称
public
    procedure WriteLog(Log:AnsiString; const LogLevel:Integer = 0);
    constructor Create(LogDir: AnsiString); 
    destructor Destroy; override; 
end;      implementationconstructor TLogger.Create(LogDir: AnsiString);
begin
   InitializeCriticalSection(FCSLock);
   if Trim(LogDir) = '' then
      FLogDir := ExtractFilePath(ParamStr(0)) + WRITE_LOG_DIR 
   else
      FLogDir := LogDir;   if not DirectoryExists(FLogDir) then
   if not ForceDirectories(FLogDir) then
   begin
      raise Exception.Create('日志路径错误,日志类对象不能被创建'); 
   end;
   
end;procedure TLogger.WriteLog(Log:AnsiString; const LogLevel:Integer = 0);
var
   logName: AnsiString;
   fMode: Word;
begin
   EnterCriticalSection(FCSLock);
   try
      if LogLevel >= WRITE_LOG_MIN_LEVEL  then
      begin
         logName := FormatDateTime('yyyymmdd',Now)+'.log';
         if FLogName <> logName then FLogName := logName;
         if FileExists(FLogDir+FLogName) then //如果当天的日志文件存在
             fMode := fmOpenWrite or fmShareDenyNone
         else
             fMode := fmCreate or fmShareDenyNone;
         if Assigned(FFileStream) then FreeAndNil(FFileStream);
         FFileStream := TFileStream.Create(FLogDir+FLogName,fmode);
         FFileStream.Position := FFileStream.Size; //追加到最后
         case LogLevel of
            0: Log := '[Info] ' + Log;
            1: Log := '[Debug] ' + Log;
            2: Log := '[Warn] ' + Log;
            3: Log := '[Error] ' + Log;
         end;
         if WRITE_LOG_ADD_TIME then
         Log := FormatDateTime(WRITE_LOG_TIME_FORMAT, Now) + ' '+ Log + #13#10; 
         FFileStream.Write(PAnsiChar(Log)^, StrLen(PAnsiChar(Log))); 
      end;
   finally
       LeaveCriticalSection(FCSLock); 
   end;
   
end;
destructor TLogger.Destroy;
begin
   DeleteCriticalSection(FCSLock); 
end;end.
我记录日志时这样调用的:
logger := TLogger.Create('');
logger.WriteLog('日志信息内容',1);//参数1为日志级别
logger.FreeInstance;
这个是会在每天创建当天的日志文件,经常在第二天开始00:00:00创建新日志文件的时候报错,报错内容为:
提示当天创建的日志文件正在被使用,进程无法访问 ,大家帮忙看看这个日志类问题在哪?  万分感谢!!!delphi日志异常cannot open

解决方案 »

  1.   

    创建的时候也进下临界区;
    constructor TLogger.Create(LogDir: AnsiString);
    begin
       InitializeCriticalSection(FCSLock);
       EnterCriticalSection(FCSLock);
       try
         if Trim(LogDir) = '' then
            FLogDir := ExtractFilePath(ParamStr(0)) + WRITE_LOG_DIR
         else
            FLogDir := LogDir;     if not DirectoryExists(FLogDir) then
         if not ForceDirectories(FLogDir) then
         begin
            raise Exception.Create('日志路径错误,日志类对象不能被创建');
         end;
       finally
           LeaveCriticalSection(FCSLock);
       end;
    end;
      

  2.   

    你是不是创建了多个logger???多个时会起这种冲突。
      

  3.   


    每次调用写入日志的方法前都调用create方法,但是传入的参数是空,所有它是直接获取安装目录下的log路径,然后用当天的年月日作为文件名,如果有当天文件则不创建直接写入,没有则创建 应该没有多个。
      

  4.   

    做个延时先断点确定是那儿执行快了会出错, 然后在这之前加个sleep(0)或application.processMessage之类的