C#调试日志封装
C#自带有个调试日志,但一般我们都用它在输出窗口中打印信息用,很少用来记录文本日志,一般的小型项目其实完全可以使用自带的调试类来记日志,在System.Diagnostics的系统命名空间下有个TraceListener类,我们继承它,并重写里面的方法即可。
1. TraceListener类概述
TraceListener类是.Net Core自带的用于追踪监视类,继承并重写实现里面的方法就能实现记录各种类型的日志,和以任意形式记录日志,比如记录文本,打印到控制台,或者记录到数据库,都可以,理论上也可以支持多线程并发写日志,当然要自己重写里面的方法。
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();
}