C#调试日志封装

dahlin
7
2020-03-31

C#调试日志封装

C#自带有个调试日志,但一般我们都用它在输出窗口中打印信息用,很少用来记录文本日志,一般的小型项目其实完全可以使用自带的调试类来记日志,在System.Diagnostics的系统命名空间下有个TraceListener类,我们继承它,并重写里面的方法即可。

1. TraceListener类概述

TraceListener类是.Net Core自带的用于追踪监视类,继承并重写实现里面的方法就能实现记录各种类型的日志,和以任意形式记录日志,比如记录文本,打印到控制台,或者记录到数据库,都可以,理论上也可以支持多线程并发写日志,当然要自己重写里面的方法。
TraceListener类截图

2. 封装实现自定义类

这里只实现了文本日志的记录,抛砖引玉吧,理论上应该还可以支持多线程并发。

/// <summary>
/// 追踪日志类
/// </summary>
public class MyListener : TraceListener
{
	/// <summary>
	/// 日志路径
	/// </summary>
	public string _filePath { get; private set; }

	/// <summary>
	/// 追踪日志构造方法
	/// </summary>
	/// <param name="name">日志名称</param>
	public MyListener(string name)
	{
		_filePath = 
			AppDomain.CurrentDomain.BaseDirectory + 
			name+
			".log" ;
	}

	/// <summary>
	/// 行内写日志
	/// </summary>
	/// <param name="message">日志行内容</param>
	public override void Write(string message)
	{
		File.AppendAllText(_filePath, $"{ DateTime.Now.ToLongTimeString()} {message}");
	}

	/// <summary>
	/// 另起一行,写日志
	/// </summary>
	/// <param name="message">日志行内容</param>
	public override void WriteLine(string message)
	{
		File.AppendAllText(_filePath, $"{ DateTime.Now.ToLongTimeString()}  " +
			$"{message}  " +
			$"{Environment.NewLine}");
	}

	/// <summary>
	/// 行内写日志
	/// </summary>
	/// <param name="message">日志行内容</param>
	/// <param name="category">日志分类</param>
	public override void Write(string message,string category)
	{
		File.AppendAllText(_filePath, $"{ DateTime.Now.ToLongTimeString()}  " +
		$"{message}  " +
		$"{category}");
	}

	/// <summary>
	/// 另起一行,写日志
	/// </summary>
	/// <param name="message">日志行内容</param>
	/// <param name="category">日志分类</param>
	public override void WriteLine(string message, string category)
	{
		File.AppendAllText(_filePath, $"{ DateTime.Now.ToLongTimeString()}  " +
			$"{message}  " +
			$"{category}" +
			$"{Environment.NewLine}");
	}
}

3. 使用说明

使用也很简单,先清除一下监听对象,再把自定义的监听对象加进去就可以了,执行完之后,在项目根目录下就能发现记录的文本日志了。

static void Main(string[] args)
{
	Trace.Listeners.Clear();
	Trace.Listeners.Add(new MyListener("myLogger"));

	try
	{
		var a = Convert.ToInt32("HelloWorld");
	}
	catch (FormatException ex)
	{
		Trace.WriteLine("Message:" + ex.Message, "Test");
	}
	Console.ReadKey();
}
动物装饰