1.情景
很多时候,我们为了输出log往往会使函数看起来很麻烦,因为log把函数的本身处理逻辑给侵染了,这看起来很不舒服。当然可以用注入和过滤的方式解决这个问题,但是很多函数是没有经过过滤的。怎么办呢,能不能再函数外套一层专门处理异常记log的逻辑呢,于是有了这个试验。
2.代码
using NLog;
using System;
namespace Nlog实验
{
class Program
{
//创建日志记录对象
static Logger Logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
Console.WriteLine("Nlog实验");
//Logger.Trace("Nlog实验");
A1 a1 = new A1();
a1.fun();
A a2 = new A2();
a2.fun();
Console.ReadKey();
}
}
abstract class A
{
public delegate void DeFun();
protected Logger Logger;
public void Log(DeFun deFun)
{
try
{
deFun();
}
catch(Exception e)
{
Logger.Error(e.ToString());
}
}
abstract public void fun();
protected void creatLog()
{
Logger = NLog.LogManager.GetCurrentClassLogger();
}
}
class A1:A
{
public A1()
{
Logger = NLog.LogManager.GetCurrentClassLogger();
}
public override void fun()
{
Log(() =>
{
int a = 5;
int b = a / 0;
});
}
}
class A2 : A
{
public A2()
{
Logger = NLog.LogManager.GetCurrentClassLogger();
}
public override void fun()
{
Log(() => {
A a = null;
a.fun();
});
}
}
}
3.运行效果
3.1 生成两个 error 文件
3.1 A1 的异常
2022-12-22 19:11:40.9010 | System.DivideByZeroException: 尝试除以零。
在 Nlog实验.A1.<>c.<fun>b__1_0() 位置 E:\test\2试验\Nlog实验\Nlog实验\Program.cs:行号 54
在 Nlog实验.A.Log(DeFun deFun) 位置 E:\test\2试验\Nlog实验\Nlog实验\Program.cs:行号 30
3.2 A2的异常
2022-12-22 19:11:43.0293 | System.NullReferenceException: 未将对象引用设置到对象的实例。
在 Nlog实验.A2.<>c.<fun>b__1_0() 位置 E:\test\2试验\Nlog实验\Nlog实验\Program.cs:行号 69
在 Nlog实验.A.Log(DeFun deFun) 位置 E:\test\2试验\Nlog实验\Nlog实验\Program.cs:行号 30
4.1 要点记录
NLog.LogManager.GetCurrentClassLogger(); 生成的文件名是所在位置的类名,如果写再基类的函数中,再子类的函数中调用是没有效果的,只会生成一个基类的文件。