mirror of
https://github.com/danieleteti/delphimvcframework.git
synced 2024-11-15 15:55:54 +01:00
f78fa3744b
# Conflicts: # lib/loggerpro/LoggerPro.ConsoleAppender.pas
198 lines
6.1 KiB
ObjectPascal
198 lines
6.1 KiB
ObjectPascal
// *************************************************************************** }
|
|
//
|
|
// LoggerPro
|
|
//
|
|
// Copyright (c) 2010-2024 Daniele Teti
|
|
//
|
|
// https://github.com/danieleteti/loggerpro
|
|
//
|
|
// Contributors for this file:
|
|
// https://github.com/nurettin
|
|
//
|
|
// ***************************************************************************
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
// ***************************************************************************
|
|
|
|
unit LoggerPro.UDPSyslogAppender;
|
|
// Contains the Syslog Logger (RFC 5424)
|
|
|
|
interface
|
|
|
|
uses
|
|
LoggerPro,
|
|
IdBaseComponent,
|
|
IdComponent,
|
|
IdUDPBase,
|
|
IdUDPClient,
|
|
IdGlobal;
|
|
|
|
type
|
|
TLoggerProUDPSyslogAppender = class(TLoggerProAppenderBase)
|
|
private
|
|
FLoggerProSyslogAppenderClient: TIdUDPClient;
|
|
FIP: string;
|
|
FPort: Integer;
|
|
FHostName: string;
|
|
FUserName: string;
|
|
FApplication: string;
|
|
FVersion: string;
|
|
FProcID: string;
|
|
FUnixLineBreaks: Boolean;
|
|
FUTF8BOM: Boolean;
|
|
|
|
public
|
|
constructor Create(pIP: string; pPort: Integer; pHostName: string; pUserName: string; pApplication: string;
|
|
pVersion: string; pProcID: string; pUnixLineBreaks: Boolean; pUTF8BOM: Boolean = False); reintroduce;
|
|
procedure Setup; override;
|
|
procedure TearDown; override;
|
|
procedure WriteLog(const aLogItem: TLogItem); override;
|
|
|
|
property IP: string read FIP write FIP;
|
|
property Port: Integer read FPort write FPort;
|
|
property HostName: string read FHostName write FHostName;
|
|
property UserName: string read FUserName write FUserName;
|
|
property Application: string read FApplication write FApplication;
|
|
property Version: string read FVersion write FVersion;
|
|
property ProcID: string read FProcID write FProcID;
|
|
property UnixLineBreaks: Boolean read FUnixLineBreaks write FUnixLineBreaks;
|
|
end;
|
|
|
|
TLoggerProUDPSyslogPacket = class
|
|
strict private
|
|
FPriority: string;
|
|
FVersion: string;
|
|
FTimestamp: string;
|
|
FHostName: string;
|
|
FUserName: string;
|
|
FApplication: string;
|
|
FProcID: string;
|
|
FThreadID: string;
|
|
FMessageID: string;
|
|
FMessageData: string;
|
|
FUnixLineBreaks: Boolean;
|
|
FUTF8BOM: Boolean;
|
|
function GetSyslogData: string;
|
|
public
|
|
constructor Create(pLogItem: TLogItem; pHostName: string; pUserName: string; pApplication: string; pVersion: string;
|
|
pProcID: string; pUnixLineBreaks: Boolean; pUTF8BOM: Boolean = False);
|
|
property SyslogData: string read GetSyslogData;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.DateUtils,
|
|
System.SysUtils;
|
|
{ TLoggerProUDPSyslogAppender }
|
|
|
|
constructor TLoggerProUDPSyslogAppender.Create(pIP: string; pPort: Integer; pHostName: string; pUserName: string;
|
|
pApplication: string; pVersion: string; pProcID: string; pUnixLineBreaks: Boolean; pUTF8BOM: Boolean);
|
|
begin
|
|
inherited Create;
|
|
FIP := pIP;
|
|
FPort := pPort;
|
|
FHostName := pHostName;
|
|
FUserName := pUserName;
|
|
FApplication := pApplication;
|
|
FVersion := pVersion;
|
|
FProcID := pProcID;
|
|
FUnixLineBreaks := pUnixLineBreaks;
|
|
FUTF8BOM := pUTF8BOM;
|
|
end;
|
|
|
|
procedure TLoggerProUDPSyslogAppender.Setup;
|
|
begin
|
|
inherited;
|
|
FLoggerProSyslogAppenderClient := TIdUDPClient.Create(nil);
|
|
end;
|
|
|
|
procedure TLoggerProUDPSyslogAppender.TearDown;
|
|
begin
|
|
FLoggerProSyslogAppenderClient.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TLoggerProUDPSyslogAppender.WriteLog(const aLogItem: TLogItem);
|
|
var
|
|
lPacket: TLoggerProUDPSyslogPacket;
|
|
begin
|
|
inherited;
|
|
lPacket := TLoggerProUDPSyslogPacket.Create(aLogItem, FHostName, FUserName, FApplication, FVersion, FProcID,
|
|
FUnixLineBreaks, FUTF8BOM);
|
|
try
|
|
FLoggerProSyslogAppenderClient.Broadcast(lPacket.SyslogData, FPort, FIP, IndyTextEncoding_UTF8);
|
|
finally
|
|
lPacket.Free;
|
|
end;
|
|
end;
|
|
|
|
{ TLoggerProUDPSyslogPacket }
|
|
|
|
function RFC5424Priority(pFacility, pSeverity: Integer): string;
|
|
begin
|
|
Result := '<' + IntToStr(pFacility * 8 + pSeverity) + '>';
|
|
end;
|
|
|
|
constructor TLoggerProUDPSyslogPacket.Create(pLogItem: TLogItem; pHostName: string; pUserName: string;
|
|
pApplication: string; pVersion: string; pProcID: string; pUnixLineBreaks: Boolean; pUTF8BOM: Boolean);
|
|
begin
|
|
// ## start https://github.com/danieleteti/loggerpro/issues/56
|
|
case pLogItem.LogType of
|
|
TLogType.Debug:
|
|
FPriority := RFC5424Priority(1, 7);
|
|
TLogType.Info:
|
|
FPriority := RFC5424Priority(1, 6);
|
|
TLogType.Warning:
|
|
FPriority := RFC5424Priority(1, 4); // 4 = slWarning
|
|
TLogType.Error:
|
|
FPriority := RFC5424Priority(1, 3); // 3 = slError
|
|
end;
|
|
if pLogItem.LogMessage.Contains('Access Violation') then
|
|
FPriority := RFC5424Priority(1, 2); // 2 = slCritical
|
|
// ## end
|
|
FApplication := pApplication;
|
|
FVersion := pVersion;
|
|
FTimestamp := DateToISO8601(pLogItem.Timestamp);
|
|
FHostName := pHostName;
|
|
FUserName := pUserName;
|
|
FApplication := pApplication;
|
|
FVersion := pVersion;
|
|
FProcID := pProcID;
|
|
FThreadID := IntToStr(pLogItem.ThreadID);
|
|
FMessageID := pLogItem.LogTag;
|
|
FUnixLineBreaks := pUnixLineBreaks;
|
|
if FUnixLineBreaks then
|
|
FMessageData := pLogItem.LogMessage.Replace(sLineBreak, '#10', [rfReplaceAll])
|
|
else
|
|
FMessageData := pLogItem.LogMessage;
|
|
FUTF8BOM := pUTF8BOM;
|
|
end;
|
|
|
|
function TLoggerProUDPSyslogPacket.GetSyslogData: string;
|
|
const
|
|
IANAVersion = '1';
|
|
begin
|
|
Result :=
|
|
// NOT; RFC 5424 6.2 HEADER
|
|
FPriority + IANAVersion + ' ' + FTimestamp + ' ' + FHostName + ' ' + FApplication + ' ' + FProcID + ' ' + FMessageID
|
|
// NOT; RFC 5424, 6.5 ex 1 no structured data
|
|
+ ' - ' + iif(FUTF8BOM, #$EF#$BB#$BF) + FUserName + ' ' + FVersion + ' '
|
|
+ FThreadID + ' ' + FMessageData;
|
|
// NOT; RFC 5424 structured data, uncomment and use if needed
|
|
// + ' [MySDID@1 ' + 'UserName="' + FUserName + '" Version="' + FVersion + '" ThreadId="' + FThreadID + '" MessageData="' + FMessageData + '"]' + ...;
|
|
end;
|
|
|
|
end.
|