[英]Log4Net logging from custom interface
我想知道如何使用log4net(在我的示例中)在%logger模式中打印正确的类名。
在我的应用程序中,我正在使用实现日志记录接口的日志记录类(在SOLID之后)。 其他类使用日志记录接口抽象来执行实际的日志记录。 我想切换到Log4Net,但是我正在考虑保留日志记录抽象。 自定义日志记录类方法将对象作为参数并根据其状态创建日志。
因此,在下面的示例中,%logger模式将记录“ MyLogger”,这是预期的,但是我想记录调用类的名称(在本例中为ObjectManipulator)。
using System.Reflection;
using log4net;
namespace LoggingTestur
{
class Program
{
class AnObject
{
public string State { get; set; }
}
interface IMyLogger
{
void LogObjectStateChenge(AnObject anObject);
}
class MyLogger : IMyLogger
{
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public void LogObjectStateChenge(AnObject anObject)
{
Log.InfoFormat("AnObject's state is: {0}", anObject.State);
}
}
class ObjectManipulator
{
private readonly IMyLogger _logger;
public ObjectManipulator(IMyLogger logger)
{
_logger = logger;
}
public void Manipulate()
{
var anObject = new AnObject { State = "New" };
_logger.LogObjectStateChenge(anObject);
}
}
static void Main(string[] args)
{
var logger = new MyLogger();
var manipulator = new ObjectManipulator(logger);
manipulator.Manipulate();
}
}
}
您可以通过以下几种方法获取类名:
将其作为参数传递,即LogObjectStateChange(AnObject anObject, Type type = null);
如果您的目标是4.5运行时,则可以使用CallerFilePath属性获取文件名,然后从中提取类名(假设每个类有一个文件,并且文件名与类名相同),即LogObjectStateChange(AnObject anObject, [CallerFilePath] string fileName = "")
使用反射从CallStack和StackFrame类获取调用类。 请注意,尽管在Release版本中,编译器可能会内联方法或以其他方式重新安排内容,从而导致堆栈跟踪中的信息不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.