TRollingFileAppenderUnit.pas 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. {
  2. Copyright 2005-2006 Log4Delphi Project
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. }
  13. {*----------------------------------------------------------------------------
  14. Contains the TRollingFileAppender class.
  15. @version 0.5
  16. @author <a href="mailto:tcmiller@users.sourceforge.net">Trevor Miller</a>
  17. ----------------------------------------------------------------------------}
  18. unit TRollingFileAppenderUnit;
  19. {$ifdef fpc}
  20. {$mode objfpc}
  21. {$h+}
  22. {$endif}
  23. interface
  24. uses
  25. Classes,
  26. TFileAppenderUnit, TLayoutUnit, TLoggingEventUnit;
  27. type
  28. {*----------------------------------------------------------------------------
  29. RollingFileAppender appends log events to a file, occasionally rotating
  30. the log file.
  31. ----------------------------------------------------------------------------}
  32. TRollingFileAppender = class (TFileAppender)
  33. private
  34. protected
  35. FMaxBackupIndex : Integer;
  36. FMaxFileSize : Int64;
  37. public
  38. constructor Create(); Overload;
  39. constructor Create(const AFileName : String; ALayout : TLayout;
  40. AAppend : Boolean; AMaxBackupIndex : Integer; AMaxFileSize : Integer);
  41. Overload;
  42. procedure SetMaxBackupIndex(AIndex : Integer); Virtual;
  43. procedure SetMaxFileSize(ASize : Int64); Overload; Virtual;
  44. procedure SetMaxFileSize(ASize : String); Overload; Virtual;
  45. procedure Append(AEvent : TLoggingEvent); Override;
  46. procedure RollOver(); Virtual;
  47. function GetMaxBackupIndex() : Integer; Virtual;
  48. function GetMaxFileSize() : Int64; Virtual;
  49. end;
  50. implementation
  51. uses
  52. SysUtils, TLogLogUnit;
  53. const ONE_KB = 1024;
  54. const ONE_MB = 1024 * ONE_KB;
  55. const ONE_GB = 1024 * ONE_MB;
  56. constructor TRollingFileAppender.Create();
  57. begin
  58. inherited Create;
  59. Self.FMaxBackupIndex := 1;
  60. Self.FMaxFileSize := 10*1024*1024;
  61. end;
  62. constructor TRollingFileAppender.Create(const AFileName : String; ALayout : TLayout;
  63. AAppend : Boolean; AMaxBackupIndex : Integer; AMaxFileSize : Integer);
  64. begin
  65. inherited Create(AFileName, ALayout, AAppend);
  66. Self.FMaxBackupIndex := AMaxBackupIndex;
  67. Self.FMaxFileSize := AMaxFileSize;
  68. end;
  69. procedure TRollingFileAppender.SetMaxBackupIndex(AIndex : Integer);
  70. begin
  71. Self.FMaxBackupIndex := AIndex;
  72. end;
  73. procedure TRollingFileAppender.SetMaxFileSize(ASize : Int64);
  74. begin
  75. Self.FMaxFileSize := ASize;
  76. end;
  77. procedure TRollingFileAppender.SetMaxFileSize(ASize : String);
  78. begin
  79. if (ASize[Length(ASize)] = 'K') then begin
  80. Self.FMaxFileSize := StrToInt(Copy(ASize, 0, Length(ASize)-1)) * ONE_KB;
  81. TLogLog.debug('Set max file size to KB');
  82. end;
  83. if (ASize[Length(ASize)] = 'M') then begin
  84. Self.FMaxFileSize := StrToInt(Copy(ASize, 0, Length(ASize)-1)) * ONE_MB;
  85. TLogLog.debug('Set max file size to MB');
  86. end;
  87. if (ASize[Length(ASize)] = 'G') then begin
  88. Self.FMaxFileSize := StrToInt(Copy(ASize, 0, Length(ASize)-1)) * ONE_GB;
  89. TLogLog.debug('Set max file size to BB');
  90. end;
  91. end;
  92. procedure TRollingFileAppender.Append(AEvent : TLoggingEvent);
  93. begin
  94. inherited Append(AEvent);
  95. if (Self.FFileStream.Position >= Self.FMaxFileSize) then
  96. Self.RollOver;
  97. TLogLog.debug('TRollingFileAppender#Append');
  98. end;
  99. procedure TRollingFileAppender.RollOver();
  100. var
  101. i : Integer;
  102. fileName : String;
  103. begin
  104. TLogLog.debug('TRollingFileAppender#RollOver: Start');
  105. if (Self.FMaxBackupIndex > 0) then begin
  106. TLogLog.debug('TRollingFileAppender#RollOver: max index > 0');
  107. // Delete the oldest file if it exists
  108. if (FileExists(FFileName + '.' + IntToStr(FMaxBackupIndex))) then begin
  109. DeleteFile(FFileName + '.' + IntToStr(FMaxBackupIndex));
  110. TLogLog.debug('TRollingFileAppender#RollOver: deleted old file');
  111. end;
  112. // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
  113. for i := Self.FMaxBackupIndex-1 downto 1 do begin
  114. fileName := Self.FFileName + '.' + IntToStr(i);
  115. TLogLog.debug('TRollingFileAppender#RollOver: renaming ' + fileName);
  116. if (FileExists(fileName)) then begin
  117. RenameFile(fileName, Self.FFileName + '.' + IntToStr(i + 1));
  118. TLogLog.debug('TRollingFileAppender#RollOver: renamed ' + fileName);
  119. end;
  120. end;
  121. // Rename fileName to fileName.1
  122. Self.FFileStream.Free;
  123. Self.FFileStream := Nil;
  124. TLogLog.debug('TRollingFileAppender#RollOver: freed the filestream');
  125. RenameFile(Self.FFileName, Self.FFileName + '.1');
  126. end;
  127. // reinitialize the file.
  128. Self.SetFile(Self.FFileName);
  129. TLogLog.debug('TRollingFileAppender#RollOver: End');
  130. end;
  131. function TRollingFileAppender.GetMaxBackupIndex() : Integer;
  132. begin
  133. Result := Self.FMaxBackupIndex;
  134. end;
  135. function TRollingFileAppender.GetMaxFileSize() : Int64;
  136. begin
  137. Result := Self.FMaxFileSize;
  138. end;
  139. end.