2 MegaBrutal's SMTP Server (MgSMTP)
3 Copyright (C) 2010-2018 MegaBrutal
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Affero General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 Supports basic logging features.
29 uses SysUtils
, Classes
, INIFiles
, Common
;
34 constructor Create(Stream
: TStream
);
35 destructor Destroy
; override;
38 function AddPureLine(Line
: string): boolean; virtual;
40 function AddLine(Line
: string): boolean; overload
;
41 function AddLine(Agent
, Line
: string): boolean; overload
;
42 function WriteLn(Line
: string): boolean; overload
;
43 function WriteLn
: boolean; overload
;
47 TLogger
= class(TStreamLogger
)
48 constructor Create(Config
: TINIFile
);
49 destructor Destroy
; override;
54 function AddPureLine(Line
: string): boolean; override;
56 function AddStdLine(Line
: string): boolean; overload
;
57 function AddStdLine(Agent
, Line
: string): boolean; overload
;
72 LOG_FN_STDOUT
= 'mgsmtp_stdout.log';
73 LOG_FN_STDOUT_PREV
= 'mgsmtp_stdout_previousrun.log';
74 LOG_FN_SMTP
= 'smtp.log';
77 constructor TStreamLogger
.Create(Stream
: TStream
);
82 destructor TStreamLogger
.Destroy
;
87 constructor TLogger
.Create(Config
: TINIFile
);
89 FLogOn
:= MainServerConfig
.Log
;
91 FLogFileName
:= Config
.ReadString('Log', 'Filename', LOG_FN_SMTP
);
92 if not FileExists(FLogFileName
) then begin
93 LogFile
:= TFileStream
.Create(FLogFileName
, fmCreate
);
96 LogFile
:= TFileStream
.Create(FLogFileName
, fmOpenWrite
or fmShareDenyWrite
);
97 LogFile
.Seek(0, soFromEnd
);
100 AddPureLine('MgSMTP version ' + MainServerConfig
.VersionStr
+ ', session log');
101 AddPureLine('Log started: ' + DateTimeToStr(Now
));
105 destructor TLogger
.Destroy
;
108 AddPureLine('Log finished: ' + DateTimeToStr(Now
));
113 function TStreamLogger
.AddPureLine(Line
: string): boolean;
115 Result
:= WriteLineToStream(LogFile
, Line
);
118 function TStreamLogger
.AddLine(Line
: string): boolean;
120 Result
:= AddPureLine('[' + DateTimeToStr(Now
) + '] ' + Line
);
123 function TStreamLogger
.AddLine(Agent
, Line
: string): boolean;
125 Result
:= AddPureLine('[' + DateTimeToStr(Now
) + '] <' + Agent
+ '> ' + Line
);
128 function TStreamLogger
.WriteLn(Line
: string): boolean;
129 { Only a wrapper for AddPureLine for convenience. }
131 Result
:= AddPureLine(Line
);
134 function TStreamLogger
.WriteLn
: boolean;
136 Result
:= AddPureLine('');
139 function TLogger
.AddPureLine(Line
: string): boolean;
142 Result
:= inherited AddPureLine(Line
)
147 function TLogger
.AddStdLine(Line
: string): boolean;
148 { Log message to both stdout and smtp.log. }
149 var outresult
, logresult
: boolean;
151 outresult
:= Out.AddLine(Line
);
152 logresult
:= AddLine(Line
);
153 Result
:= outresult
and logresult
;
156 function TLogger
.AddStdLine(Agent
, Line
: string): boolean;
157 { Log message to both stdout and smtp.log. }
158 var outresult
, logresult
: boolean;
160 outresult
:= Out.AddLine(Agent
, Line
);
161 logresult
:= AddLine(Agent
, Line
);
162 Result
:= outresult
and logresult
;
168 if StdOutputHandle
> 0 then
169 Out:= TStreamLogger
.Create(THandleStream
.Create(StdOutputHandle
))
171 DeleteFile(LOG_FN_STDOUT_PREV
);
172 RenameFile(LOG_FN_STDOUT
, LOG_FN_STDOUT_PREV
);
173 Out:= TStreamLogger
.Create(TFileStream
.Create(LOG_FN_STDOUT
, fmCreate
or fmShareDenyWrite
));