Catch CTRL-C event in user mode
[mgsmtp.git] / Log.pas
1 {
2 MegaBrutal's SMTP Server (MgSMTP)
3 Copyright (C) 2010-2014 MegaBrutal
4
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.
9
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.
14
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/>.
17 }
18
19 {
20 Unit: Log
21 Supports basic logging features.
22 }
23
24
25 {$MODE DELPHI}
26 unit Log;
27
28 interface
29 uses SysUtils, Classes, INIFiles, Common;
30
31 type
32
33 TStreamLogger = class
34 constructor Create(Stream: TStream);
35 destructor Destroy; override;
36 protected
37 LogFile: TStream;
38 function AddPureLine(Line: string): boolean; virtual;
39 public
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;
44 end;
45
46
47 TLogger = class(TStreamLogger)
48 constructor Create(Config: TINIFile);
49 destructor Destroy; override;
50 protected
51 FLogOn: boolean;
52 FLogFileName: string;
53 {FLogLevel: integer;}
54 function AddPureLine(Line: string): boolean; override;
55 public
56 function AddStdLine(Line: string): boolean; overload;
57 function AddStdLine(Agent, Line: string): boolean; overload;
58 end;
59
60
61 var
62
63 Out: TStreamLogger;
64 Logger: TLogger;
65
66
67
68 implementation
69
70 const
71
72 LOG_FN_STDOUT = 'mgsmtp_stdout.log';
73 LOG_FN_STDOUT_PREV = 'mgsmtp_stdout_previousrun.log';
74 LOG_FN_SMTP = 'smtp.log';
75
76
77 constructor TStreamLogger.Create(Stream: TStream);
78 begin
79 LogFile:= Stream;
80 end;
81
82 destructor TStreamLogger.Destroy;
83 begin
84 LogFile.Free;
85 end;
86
87 constructor TLogger.Create(Config: TINIFile);
88 begin
89 FLogOn:= MainServerConfig.Log;
90 if FLogOn then begin
91 FLogFileName:= Config.ReadString('Log', 'Filename', LOG_FN_SMTP);
92 if not FileExists(FLogFileName) then begin
93 LogFile:= TFileStream.Create(FLogFileName, fmCreate);
94 LogFile.Free;
95 end;
96 LogFile:= TFileStream.Create(FLogFileName, fmOpenWrite or fmShareDenyWrite);
97 LogFile.Seek(0, soFromEnd);
98 AddPureLine('');
99 AddPureLine('');
100 AddPureLine('MgSMTP version ' + MainServerConfig.VersionStr + ', session log');
101 AddPureLine('Log started: ' + DateTimeToStr(Now));
102 end;
103 end;
104
105 destructor TLogger.Destroy;
106 begin
107 if FLogOn then
108 AddPureLine('Log finished: ' + DateTimeToStr(Now));
109 inherited Destroy;
110 end;
111
112
113 function TStreamLogger.AddPureLine(Line: string): boolean;
114 begin
115 Result:= WriteLineToStream(LogFile, Line);
116 end;
117
118 function TStreamLogger.AddLine(Line: string): boolean;
119 begin
120 Result:= AddPureLine('[' + DateTimeToStr(Now) + '] ' + Line);
121 end;
122
123 function TStreamLogger.AddLine(Agent, Line: string): boolean;
124 begin
125 Result:= AddPureLine('[' + DateTimeToStr(Now) + '] <' + Agent + '> ' + Line);
126 end;
127
128 function TStreamLogger.WriteLn(Line: string): boolean;
129 { Only a wrapper for AddPureLine for convenience. }
130 begin
131 Result:= AddPureLine(Line);
132 end;
133
134 function TStreamLogger.WriteLn: boolean;
135 begin
136 Result:= AddPureLine('');
137 end;
138
139 function TLogger.AddPureLine(Line: string): boolean;
140 begin
141 if FLogOn then
142 Result:= inherited AddPureLine(Line)
143 else
144 Result:= true;
145 end;
146
147 function TLogger.AddStdLine(Line: string): boolean;
148 { Log message to both stdout and smtp.log. }
149 begin
150 Result:= Out.AddLine(Line) and AddLine(Line);
151 end;
152
153 function TLogger.AddStdLine(Agent, Line: string): boolean;
154 { Log message to both stdout and smtp.log. }
155 begin
156 Result:= Out.AddLine(Agent, Line) and AddLine(Agent, Line);
157 end;
158
159
160
161 initialization
162 if StdOutputHandle > 0 then
163 Out:= TStreamLogger.Create(THandleStream.Create(StdOutputHandle))
164 else begin
165 DeleteFile(LOG_FN_STDOUT_PREV);
166 RenameFile(LOG_FN_STDOUT, LOG_FN_STDOUT_PREV);
167 Out:= TStreamLogger.Create(TFileStream.Create(LOG_FN_STDOUT, fmCreate or fmShareDenyWrite));
168 end;
169 finalization
170 Out.Free;
171 end.