ULogger.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. unit ULogger;
  2. interface
  3. uses
  4. Classes, SysUtils, StrUtils, WindowsSysVersion, superobject, Dialogs, IdHTTP;
  5. type
  6. TLogger = class
  7. private
  8. FLoginName: string;
  9. FIP: string;
  10. FPlatform: string;
  11. FEnable: Boolean;
  12. FUrl: string;
  13. public
  14. procedure Log(AMessage, ACode: string);
  15. procedure AsynLog(AMessage, ACode: string);
  16. constructor Create(ALoginName, AIP, APlatform, AUrl: string; AEnable: Boolean);
  17. end;
  18. TLoggerManager = class
  19. private
  20. FLoggers: TStringList;
  21. FPlatform: string;
  22. FEnable: Boolean;
  23. FUrl,
  24. FAppCode,
  25. FClientVersion: string;
  26. FDefaultLogger: TLogger;
  27. FIP: string;
  28. public
  29. function GetLogger(ALoginName: string): TLogger;
  30. procedure Init;
  31. constructor Create;
  32. destructor Destroy; override;
  33. end;
  34. TSendLogThread = class(TThread)
  35. private
  36. FHttp: TidHttp;
  37. FMessage: string;
  38. FUrl: string;
  39. public
  40. constructor Create(AUrl: string; AMessage: string);
  41. destructor Destroy; override;
  42. procedure Execute; override;
  43. end;
  44. function Log(AMessage, ALoginName, ACode: string): Boolean;
  45. function AsynLog(AMessage, ALoginName, ACode: string): Boolean;
  46. const
  47. CONFIG_DIR: string = 'config\logger.config';
  48. JSON_LOG: string = '{'+
  49. '"appCode":"%s",'+
  50. '"loginName":"%s",'+
  51. '"time":"%d",'+
  52. '"client":'+
  53. '{'+
  54. '"platform":"%s",'+
  55. '"clientVersion":"%s",'+
  56. '"ip":"%s"'+
  57. '},'+
  58. '"exception":'+
  59. '{'+
  60. '"code":"%s",'+
  61. '"message":"%s"'+
  62. '},'+
  63. '"level":"%s"' +
  64. '}';
  65. implementation
  66. var
  67. LoggerManager: TLoggerManager;
  68. function Log(AMessage, ALoginName, ACode: string): Boolean;
  69. var
  70. ALogger: TLogger;
  71. begin
  72. if (LoggerManager = nil) then
  73. begin
  74. LoggerManager := TLoggerManager.Create;
  75. LoggerManager.Init;
  76. end;
  77. if (not LoggerManager.FEnable) then
  78. Exit;
  79. ALogger := LoggerManager.GetLogger(ALoginName);
  80. ALogger.Log(AMessage, ACode);
  81. end;
  82. function AsynLog(AMessage, ALoginName, ACode: string): Boolean;
  83. var
  84. ALogger: TLogger;
  85. begin
  86. if (LoggerManager = nil) then
  87. begin
  88. LoggerManager := TLoggerManager.Create;
  89. LoggerManager.Init;
  90. end;
  91. if (not LoggerManager.FEnable) then
  92. Exit;
  93. ALogger := LoggerManager.GetLogger(ALoginName);
  94. ALogger.AsynLog(AMessage, ACode);
  95. end;
  96. { TLogger }
  97. constructor TLogger.Create(ALoginName, AIP, APlatform, AUrl: string; AEnable: Boolean);
  98. begin
  99. FLoginName := ALoginName;
  100. FIP := AIP;
  101. FPlatform := APlatform;
  102. FUrl := AUrl;
  103. FEnable := AEnable;
  104. end;
  105. procedure TLogger.Log(AMessage, ACode: string);
  106. var
  107. AJson: string;
  108. ASendThread: TSendLogThread;
  109. begin
  110. AJson := Format(JSON_LOG, [FLoginName, Now, FPlatform, FIP, ACode, AMessage]);
  111. ASendThread := TSendLogThread.Create(FUrl, Ajson);
  112. end;
  113. procedure TLogger.AsynLog(AMessage, ACode: string);
  114. var
  115. AJson: TStringStream;
  116. AHttp: TIdHTTP;
  117. Respone: string;
  118. begin
  119. AJson := TStringStream.Create(AnsiToUtf8(Format(JSON_LOG, [FLoginName, Now, FPlatform, FIP, ACode, AMessage])));
  120. AHttp := TIdHttp.Create(nil);
  121. AHttp.HandleRedirects := True;//允许头转向
  122. AHttp.ReadTimeout := 5000;//请求超时设置
  123. try
  124. AJson.Position := 0;
  125. Respone := AHttp.Post(FUrl, AJson);
  126. Respone := Utf8ToAnsi(Respone)
  127. finally
  128. AJson.Free;
  129. AHttp.Free;
  130. end;
  131. end;
  132. { TLoggerManager }
  133. constructor TLoggerManager.Create;
  134. begin
  135. FLoggers := TStringList.Create;
  136. inherited Create;
  137. end;
  138. destructor TLoggerManager.Destroy;
  139. var
  140. ALogger: TLogger;
  141. begin
  142. while FLoggers.Count > 0 do
  143. begin
  144. ALogger :=FLoggers.Objects[0] as TLogger;
  145. FLoggers.Delete(0);
  146. FreeAndNil(ALogger);
  147. end;
  148. FreeAndNil(FLoggers);
  149. if Assigned(FDefaultLogger) then
  150. FreeAndNil(FDefaultLogger);
  151. inherited;
  152. end;
  153. function TLoggerManager.GetLogger(ALoginName: string): TLogger;
  154. var
  155. index: Integer;
  156. ALogger: TLogger;
  157. begin
  158. if ALoginName = '' then
  159. begin
  160. Result := FDefaultLogger;
  161. Exit;
  162. end;
  163. index := FLoggers.IndexOf(ALoginName);
  164. if index > -1 then
  165. Result := FLoggers.Objects[index] as TLogger
  166. else
  167. begin
  168. ALogger := TLogger.Create(ALoginName, FIP, FPlatform, FUrl, FEnable);
  169. Result := ALogger;
  170. FLoggers.AddObject(ALoginName, ALogger);
  171. end;
  172. end;
  173. procedure TLoggerManager.Init;
  174. var
  175. AVersion: TWinVer;
  176. AFullPath: string;
  177. jo: ISuperObject;
  178. p: PChar;
  179. begin
  180. case GetWindowsSystemVersion of
  181. WinNone: FPlatform := '未知';
  182. Win95: FPlatform := 'Windows 95';
  183. Win98: FPlatform := 'Windows 98';
  184. WinMe: FPlatform := 'Windows Me';
  185. Win2000: FPlatform := 'Windows 2000';
  186. WinServer2000: FPlatform := 'Windows Server 2000';
  187. WinXp: FPlatform := 'Windows XP';
  188. WinXp64: FPlatform := 'Windows XP x64';
  189. WinServer2003: FPlatform := 'Windows Server 2003';
  190. WinHomeServer: FPlatform := 'Windows Home Server';
  191. WinServer2003R2: FPlatform := 'Windows Server 2003 R2';
  192. WinVista: FPlatform := 'Windows Vista';
  193. WinServer2008: FPlatform := 'Windows Server 2008';
  194. WinServer2008R2: FPlatform := 'Windows Server 2008 R2';
  195. Win7: FPlatform := 'Windows 7';
  196. end;
  197. AFullPath := ExtractFilePath(ParamStr(0)) + CONFIG_DIR;
  198. if not FileExists(AFullPath) then
  199. begin
  200. FEnable := False;
  201. Exit;
  202. end;
  203. FIP := LocalIP;
  204. try
  205. jo := TSuperObject.ParseFile(AFullPath, False);
  206. FEnable := jo['enable'].AsBoolean();
  207. FUrl := jo['url'].AsString();
  208. except
  209. on E: Exception do
  210. begin
  211. FEnable := False;
  212. Dialogs.ShowMessage(E.Message);
  213. end;
  214. end;
  215. FDefaultLogger := TLogger.Create('', FIP, FPlatform, FUrl, FEnable);
  216. end;
  217. { TSendLogThread }
  218. constructor TSendLogThread.Create(AUrl, AMessage: string);
  219. begin
  220. FHttp := TIdHttp.Create(nil);
  221. FHttp.HandleRedirects := True;//允许头转向
  222. FHttp.ReadTimeout := 5000;//请求超时设置
  223. FUrl := AUrl;
  224. FMessage := AMessage;
  225. inherited Create(False);
  226. end;
  227. destructor TSendLogThread.Destroy;
  228. begin
  229. FHttp.Free;
  230. inherited;
  231. end;
  232. procedure TSendLogThread.Execute;
  233. var
  234. AJson: TStringStream;
  235. begin
  236. AJson := TStringStream.Create(AnsiToUtf8(FMessage));
  237. try
  238. // Dialogs.ShowMessage(FMessage);
  239. AJson.Position := 0;
  240. FHttp.Post(FUrl, AJson);
  241. finally
  242. AJson.Free;
  243. end;
  244. end;
  245. initialization
  246. LoggerManager := TLoggerManager.Create;
  247. LoggerManager.Init;
  248. finalization
  249. if LoggerManager <> nil then
  250. FreeAndNil(LoggerManager);
  251. end.