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