mirror of
https://github.com/ckaczor/Common.git
synced 2026-01-13 17:22:40 -05:00
253 lines
6.7 KiB
C#
253 lines
6.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Common.Debug
|
|
{
|
|
public static class Tracer
|
|
{
|
|
#region File creation date comparer
|
|
|
|
public class FileCreationTimeComparer : IComparer<string>
|
|
{
|
|
#region IComparer<string> Members
|
|
|
|
public int Compare(string x, string y)
|
|
{
|
|
DateTime createdX = File.GetCreationTime(x);
|
|
DateTime createdY = File.GetCreationTime(y);
|
|
|
|
return createdY.CompareTo(createdX);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Enumerations
|
|
|
|
public enum IndentOption
|
|
{
|
|
IncrementIndentLevel,
|
|
DecrementIndentLevel,
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Member variables
|
|
|
|
private static string _mainFileName = "Trace.txt";
|
|
private static int _indentLevel;
|
|
private static bool _initialized;
|
|
private static TextWriterTraceListener _traceListener;
|
|
private static int _keepRevisions = 3;
|
|
private static string _outputTemplate = "[{0:MM/dd/yyyy HH:mm:ss.fff} - 0x{1:x3}] {2}{3}";
|
|
private static string _fileNameTemplate = "{0}_{1}.txt";
|
|
private static bool _echoToConsole;
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
[Obsolete]
|
|
public static void Initialize()
|
|
{
|
|
// Initialize using some generic defaults
|
|
Initialize(Path.GetDirectoryName(Application.ExecutablePath), "Trace", Process.GetCurrentProcess().Id.ToString(), false);
|
|
}
|
|
|
|
public static void Initialize(string logPath, string rootName, string uniqueId, bool echoToConsole)
|
|
{
|
|
_echoToConsole = echoToConsole;
|
|
|
|
if (!Directory.Exists(logPath))
|
|
Directory.CreateDirectory(logPath);
|
|
|
|
if (!string.IsNullOrEmpty(logPath))
|
|
{
|
|
// Use the file name template build the base file name
|
|
_mainFileName = string.Format(_fileNameTemplate, rootName, uniqueId);
|
|
|
|
// Get the list of old log files
|
|
string[] oldLogFiles = Directory.GetFiles(logPath, string.Format(_fileNameTemplate, rootName, "*"), SearchOption.TopDirectoryOnly);
|
|
|
|
// Sort the list by creation date
|
|
Array.Sort(oldLogFiles, new FileCreationTimeComparer());
|
|
|
|
// Keep only the last X revisions
|
|
for (int i = _keepRevisions; i < oldLogFiles.Length; i++)
|
|
{
|
|
// Delete the file
|
|
File.Delete(oldLogFiles[i]);
|
|
}
|
|
|
|
// Add the log path
|
|
_mainFileName = Path.Combine(logPath, _mainFileName);
|
|
|
|
// Create the listener
|
|
_traceListener = new TextWriterTraceListener(_mainFileName);
|
|
|
|
// Setup the debug listener
|
|
Trace.Listeners.Add(_traceListener);
|
|
}
|
|
|
|
_initialized = true;
|
|
|
|
WriteLine("Application starting");
|
|
|
|
// Log the command line
|
|
logCommandLine();
|
|
}
|
|
|
|
public static void Dispose()
|
|
{
|
|
WriteLine("Application ended");
|
|
|
|
// Flush the trace
|
|
Trace.Flush();
|
|
|
|
if (_traceListener != null)
|
|
{
|
|
// Remove the listener
|
|
Trace.Listeners.Remove(_traceListener);
|
|
|
|
// Close the listener
|
|
_traceListener.Close();
|
|
_traceListener.Dispose();
|
|
_traceListener = null;
|
|
}
|
|
|
|
// Close the trace
|
|
Trace.Close();
|
|
|
|
_initialized = false;
|
|
}
|
|
|
|
public static void WriteException(string message, Exception exception)
|
|
{
|
|
WriteLine(message);
|
|
WriteLine(exception.ToString());
|
|
}
|
|
|
|
public static void WriteException(Exception exception)
|
|
{
|
|
WriteLine(exception.ToString());
|
|
}
|
|
|
|
public static void WriteLine(string message)
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
string sIndent = new string('\t', _indentLevel);
|
|
|
|
string sOutput = string.Format(_outputTemplate, DateTime.Now, System.Threading.Thread.CurrentThread.ManagedThreadId, sIndent, message);
|
|
|
|
//sOutput = sOutput.Replace("\n", "\\n");
|
|
//sOutput = sOutput.Replace("\r", "\\r");
|
|
|
|
if (_echoToConsole)
|
|
Console.WriteLine(sOutput);
|
|
|
|
Trace.WriteLine(sOutput);
|
|
Trace.Flush();
|
|
}
|
|
|
|
public static void WriteLine(string message, params object[] arguments)
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
string sMessage = string.Format(message, arguments);
|
|
|
|
WriteLine(sMessage);
|
|
}
|
|
|
|
public static void WriteLine(string message, IndentOption indentLine)
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
if (indentLine == IndentOption.DecrementIndentLevel)
|
|
DecrementIndentLevel();
|
|
|
|
WriteLine(message);
|
|
|
|
if (indentLine == IndentOption.IncrementIndentLevel)
|
|
IncrementIndentLevel();
|
|
}
|
|
|
|
public static void IncrementIndentLevel()
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
_indentLevel++;
|
|
}
|
|
|
|
public static void DecrementIndentLevel()
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
_indentLevel--;
|
|
}
|
|
|
|
public static void Flush()
|
|
{
|
|
if (!_initialized)
|
|
return;
|
|
|
|
Trace.Flush();
|
|
}
|
|
|
|
private static void logCommandLine()
|
|
{
|
|
// Log all command line arguments
|
|
WriteLine("Command line arguments:");
|
|
int argIndex = 0;
|
|
foreach (string arg in Environment.GetCommandLineArgs())
|
|
{
|
|
WriteLine("\tArg {0}: {1}", argIndex++, arg);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public static bool Initialized
|
|
{
|
|
get { return _initialized; }
|
|
}
|
|
|
|
public static int KeepRevisions
|
|
{
|
|
get { return _keepRevisions; }
|
|
set { _keepRevisions = value; }
|
|
}
|
|
|
|
public static string OutputTemplate
|
|
{
|
|
get { return _outputTemplate; }
|
|
set { _outputTemplate = value; }
|
|
}
|
|
|
|
public static string FileNameTemplate
|
|
{
|
|
get { return _fileNameTemplate; }
|
|
set { _fileNameTemplate = value; }
|
|
}
|
|
|
|
public static TextWriter Writer
|
|
{
|
|
get { return _traceListener.Writer; }
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|