// If you are using latest (modern) versions of EurekaLog - you can enable run-time debug mode:
// https://www.eurekalog.com/help/eurekalog/fix_runtime_issues.php
// Run your application with run-time mode enabled and find newly created run-time log file (.csl file).
// Open run-time log file and browse / search / filter / organize messages to find:
// "EurekaLog.Dialog" category and SendBugReport / SendBugReportInternal methods.
// "EurekaLog.Sending" category and EurekaLogSend function.
// The send log can be found inside these methods.
// Alternatively, you may manually log sending as shown below
// This code example will show you how to capture logging output from bug report sender
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses
EConsts,
ETypes,
ELowLevel,
ESysInfo,
ECore,
EDialog,
ESend,
EDialogWinAPIMSClassic, // < - replace with your selected dialog
ESendAPIJIRA, // < - replace with your selected sender
ECompatibility;
{$R *.dfm}
type
EEurekaSendTestException = class(Exception);
procedure TForm1.Button1Click(Sender: TObject);
begin
raise EEurekaSendTestException.Create('Test exception');
end;
//___________ Logging code below ___________
type
{$IFNDEF UNICODE}
UnicodeString = WideString;
{$ENDIF}
TELTrackerJIRASender = class(ESendAPIJIRA.TELTrackerJIRASender); // < - replace with your selected sender
TMSClassicDialog = class(EDialogWinAPIMSClassic.TMSClassicDialog) // < - replace with your selected dialog
private
// New stuff for logging:
FSendLogFile: TStream;
procedure LogSend(const AMsg: String);
protected
// Override sending behaviour
function SendBugReportInternal: TResponse; override;
end;
{ TMSClassicDialog }
function TMSClassicDialog.SendBugReportInternal: TResponse;
procedure Prepare;
begin
// Make sure that we've used LogBuilder before possible async send
BugReport;
// Fill necessary information for sending bug report
Options.CustomField[sifBugAppVersion] := ESysInfo.GetVersionNumber;
Options.CustomField[sifBugID] := ExceptionInfo.BugIDStr;
Options.CustomField[sifBugIDSource] := ExceptionInfo.BugIDSource;
Options.CustomField[sifBugText] := ExceptionInfo.ExceptionMessage;
Options.CustomField[sifBugType] := ExceptionInfo.ExceptionClass;
Options.CustomField[sifBuild] := ESysInfo.GetVersionNumber;
Options.CustomField[sifMachineID] := Options.OverrideComputerName;
Options.CustomField[sifMessage] := BugReportForSend;
Options.CustomField[sifOSBuild] := ESysInfo.GetOSBuild;
Options.CustomField[sifOSType] := ESysInfo.GetOSTypeStr;
Options.CustomField[sifPlatform] := ESysInfo.GetPlatform;
Options.CustomField[sifUserEMail] := Options.OverrideUserEMail;
Options.CustomField[sifStepsToReproduce] := ReproduceText;
end;
procedure SendWithLogging;
var
ELSender: TELTrackerJIRASender;
X: Integer;
begin
LogFileName := GetFolderTemp + 'CB03001828F84110B1EF17A503B8EEE8.txt';
DeleteFile(LogFileName);
try
FSendLogFile := TFileStream.Create(LogFileName, fmCreate or fmShareExclusive);
except
FSendLogFile := nil;
end;
try
if Assigned(FSendLogFile) then
FSendLogFile.WriteBuffer(BOM_UTF16_LSB, SizeOf(BOM_UTF16_LSB));
LogSend('Testing send with ' + TELTrackerJIRASender.ClassName + ' on ' + DateTimeToStr(Now)); // <- replace with your selected sender
ELSender := TELTrackerJIRASender.Create; // <- replace with your selected sender
try
ELSender.OnLog := LogSend;
LogSend(sLineBreak + 'Options:');
LogSend(ELSender.Options.ToString);
LogSend(sLineBreak + 'Files:');
for X := 0 to FilesToSend.Count - 1 do
LogSend(FilesToSend[X]);
LogSend(sLineBreak + 'Exception:');
LogSend(ExceptionInfo.ToString);
Result := EurekaLogSend(ELSender, Options, FilesToSend, ProgressIndicator, ProcessMessages, GetEnvVariable);
finally
FreeAndNil(ELSender);
end;
finally
FreeAndNil(FSendLogFile);
if FileExists(LogFileName) then
begin
ShellExec(LogFileName);
Sleep(10000);
DeleteFile(LogFileName);
end;
end;
end;
begin
Prepare;
SendWithLogging;
end;
// This implementation will log sending into:
// 1. File on disk (in TEMP folder);
// 2. IDE's "Events" window;
// 3. Memo1 on main form.
procedure TMSClassicDialog.LogSend(const AMsg: String);
var
WS: UnicodeString;
begin
if IsDebugged then
OutputDebugString(PChar(AMsg));
if Assigned(FSendLogFile) then
begin
WS := AMsg + sLineBreak;
FSendLogFile.WriteBuffer(WS[1], Length(WS) * SizeOf(WideChar));
end;
if Assigned(Form1) then
Form1.Memo1.Lines.Add(WS);
end;
initialization
RegisterDialogClassFirst(TMSClassicDialog); // < - replace with your selected dialog
end.
Comments
0 B
|👍
/👎
0 B
|👍
/👎