在.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); } }}