我有一个程序写入日志文件并将其拉链。我想设置它以便它会在一个月之后将日志文件和压缩文件清除并清除文件并重置它以在再过一个月后再次执行
procedure SendToLog(Const MType : twcMTypes; Const callProgram, callPas, callProssecs, EMessage, zipName : String; AddlStr : String = '' );
Const
MTValues = 'EDS';
var
LogFile : TextFile;
LogName : String;
EString : String;
begin
logName := WebLogPath; // þ for delimeter
EString := MTValues[ Ord( MType )+1] + PC + FormatDateTime( 'mm/dd/yyyy hh:nn:ss.zzz', Now )
+ PC + callProgram + PC + callpas + PC + callProssecs + PC + EMessage;
Assign( LogFile, LogName );
if FileExists(LogName) then
Append( LogFile ) { Open to Append }
else
begin
Rewrite( LogFile ); { Create file }
end;
Writeln( LogFile, EString );
Close( LogFile );
ArchiveFiles('C:', 'mytest.log', 'C:', zipName + '.zip', 'M');
我想知道我是如何制作的,以便每次程序记录某些内容时它会检查一个月是否已经过去,然后它会将所有内容压缩到一个新文件中并重置日志。
答案 0 :(得分:0)
您必须:
在某个地方跟踪上次写入日期,并在应用重新启动时持续跟踪。
使用Win32 API GetFileTime()
函数查询日志文件本身的上次写入日期。
将当前日期放在您编写的每个日志条目上,然后您可以查找日志文件的末尾并从上次写入的日志条目中读取日期。
每次要编写新的日志条目时,将上一个已知日期的月份+年份与当前日期进行比较,然后在当前日期更高时压缩+重置日志文件。
答案 1 :(得分:0)
因此,您只需检查创建日期,然后决定是否需要新文件。
procedure SendToLog(Const MType : twcMTypes; Const callProgram, callPas, callProssecs, EMessage, zipName : String; AddlStr : String = '' );
Const
MTValues = 'EDS';
MaxAgeBeforeNewLogFile = 30; // 30 days, in TDateTime type convention
var
LogFile : TextFile;
LogName : String;
EString : String;
NeedZipLogFile : Boolean; ZipName: String;
begin
logName := WebLogPath; // þ for delimeter
EString := MTValues[ Ord( MType )+1] + PC + FormatDateTime( 'mm/dd/yyyy hh:nn:ss.zzz', Now )
+ PC + callProgram + PC + callpas + PC + callProssecs + PC + EMessage;
NeedZipLogFile := False;
if System.IOUtils.TFile.Exists( LogName ) then
NeedZipLogFile := Now() - System.IOUtils.TFile.GetCreationTime( LogName )
> MaxAgeBeforeNewLogFile;
if NeedZipLogFile then begin
ZipName := _Generate_New_Non_Used_And_Proper_Name_For_Archive();
_Save_Log_Into_Zip( LogName );
If _Secure_Keeping_Of_Logs_Is_Very_Very_Important then begin
_Flush_Windows_File_Cache_To_Disk( ZipName );
_Read_Zipped_Log_Into_Memory( ZipName, ExtractFileName( LogName ), _Temp_Memory_Buffer );
_Compare_With_Old_Log_File_And_Ensure_Nothing_Was_Lost( LogName, _Temp_Memory_Buffer);
end;
DeleteFile( LogFile);
end;
System.IOUtils.TFile.AppendAllText( LogFile, EString );
end;