Cause: - Live diagnostics required logging from multiple applications without blocking TBF. - Shared nlog.config files caused configuration conflicts. - The original viewer lacked configurable colors and practical log controls. - Inconsistent diagnostic deployment caused log transfer failures and locked shared DLLs during builds. Solution: 1. Added universal diagnostic transport - Added AppDiagnostic.Logging with an NLog target and named-pipe communication. - Added background buffering and automatic reconnection. - Registered the diagnostic connector programmatically. 2. Separated diagnostic window lifecycle - Run AppDiagnostic as an independent process. - Activate the existing window on repeated launches. - Keep TBF running when the diagnostic window closes. 3. Corrected diagnostic deployment - Copy the complete diagnostic output into a dedicated AppDiagnostic subdirectory during build. - Overwrite existing deployment files to prevent inconsistent versions. - Validate and launch the executable from that subdirectory with an explicit working directory. 4. Improved the log viewer - Added configurable substring colors with a palette and live preview. - Added text, level and application filters. - Added line wrapping, clipboard actions and log export. - Added Pause/Resume, Refresh, Clear, auto-scroll and Always on top. - Added connection and log counters. - Persist color rules between sessions. 5. Removed legacy dependencies - Replaced LiveLogCache with structured diagnostic storage. - Removed AppDiagnostic dependencies on log4net and SharedComponents. Validation: - Confirmed successful log transfer when launching AppDiagnostic from TBF.
66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
|
|
namespace AppDiagnostic
|
|
{
|
|
[Serializable]
|
|
public sealed class LogColorRule
|
|
{
|
|
public bool Enabled { get; set; } = true;
|
|
public string Pattern { get; set; } = string.Empty;
|
|
public int ForeColorArgb { get; set; } = Color.Black.ToArgb();
|
|
public int BackColorArgb { get; set; }
|
|
public bool UseBackColor { get; set; }
|
|
public bool Bold { get; set; }
|
|
|
|
public Color ForeColor => Color.FromArgb(ForeColorArgb);
|
|
public Color BackColor => Color.FromArgb(BackColorArgb);
|
|
|
|
public LogColorRule Clone()
|
|
{
|
|
return new LogColorRule
|
|
{
|
|
Enabled = Enabled,
|
|
Pattern = Pattern,
|
|
ForeColorArgb = ForeColorArgb,
|
|
BackColorArgb = BackColorArgb,
|
|
UseBackColor = UseBackColor,
|
|
Bold = Bold
|
|
};
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
string state = Enabled ? string.Empty : "[disabled] ";
|
|
return state + Pattern;
|
|
}
|
|
|
|
public static List<LogColorRule> CreateDefaults()
|
|
{
|
|
return new List<LogColorRule>
|
|
{
|
|
Create("|TRACE|", Color.DimGray, false),
|
|
Create("|DEBUG|", Color.RoyalBlue, false),
|
|
Create("|INFO |", Color.ForestGreen, false),
|
|
Create("|WARN |", Color.DarkOrange, true),
|
|
Create("|ERROR|", Color.Crimson, true),
|
|
Create("|FATAL|", Color.White, true, Color.DarkRed)
|
|
};
|
|
}
|
|
|
|
private static LogColorRule Create(string pattern, Color foreground, bool bold, Color? background = null)
|
|
{
|
|
return new LogColorRule
|
|
{
|
|
Enabled = true,
|
|
Pattern = pattern,
|
|
ForeColorArgb = foreground.ToArgb(),
|
|
BackColorArgb = background?.ToArgb() ?? Color.Empty.ToArgb(),
|
|
UseBackColor = background.HasValue,
|
|
Bold = bold
|
|
};
|
|
}
|
|
}
|
|
}
|