在.net项目中,经常使用log4net类库来记录项目的日志,如果需要记录是哪个类哪个方法,经常需要在各个类中定义一个静态的属性,用于获取是哪个类哪个方法。本文介绍使用反射技术,获取调用方的类和方法名。.
首先,在程序入口处,初始化日志记录,否则无法自动生成日志文件。
Logger.Initialize();
后面就可以在任意引用了本库的地方,使用日志记录。
/// <summary>
/// 开始屏幕录像
/// </summary>
public string StartCaptureScreen()
{
if (RecordScreenParameter == null)
{
Logger.Debug($"录屏参数{nameof(RecordScreenParameter)}为空,无法执行录屏!");
}
if (!RecordScreenParameter.IsEnabled)
{
Logger.Debug($"您未启用录屏参数{nameof(RecordScreenParameter.IsEnabled)},无法执行录屏!");
}
}
错误记录
try
{
}
catch (Exception ex)
{
Logger.Error(ex.Message);
};
那么如何通过反射技术获取调用者的方法名呢,下面是核心代码
public static void Debug(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Debug(message);
}
完整的代码如下:
using log4net;
using System.Reflection;
namespace System
{
/// <summary>
/// 日志记录类
/// </summary>
public class Logger
{
/// <summary>
/// 初始化ILog
/// </summary>
public static void Initialize()
{
LogManager.GetLogger(typeof(Logger));
}
public static void Debug(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Debug(message);
}
public static void Info(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Info(message);
}
public static void Warn(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Warn(message);
}
public static void Error(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Error(message);
}
public static void Fatal(object message)
{
MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
var logger = LogManager.GetLogger(method.DeclaringType);
#if DEBUG
Console.WriteLine(message);
#endif
logger?.Fatal(message);
}
}
}