我正在尝试在我的新WPF 4.5 CompositeWPF(Prism)项目中实现日志记录功能。
这要求我在我的代码中实现ILoggerFacade。该接口仅实现1个方法:Log(string message, Category category, Priority priority)
。
ILoggerFacade
界面:
public interface ILoggerFacade
{
void Log(string message, Category category, Priority priority);
}
我的实施:
public class Log4NetLogger : ILoggerFacade
{
private static readonly ILog m_Logger = LogManager.GetLogger(typeof(ILoggerFacade));
public void Log(string message, Category category, Priority priority)
{
switch (category)
{
case Category.Debug:
m_Logger.Debug(message);
break;
case Category.Warn:
m_Logger.Warn(message);
break;
case Category.Exception:
m_Logger.Error(message);
break;
case Category.Info:
m_Logger.Info(message);
break;
}
}
}
我相信通过新引入的[CallerMemberName]
属性,我应该能够将调用者方法名称传递给记录器,只要我知道如何做这样的事情:
public class Log4NetLogger : ILoggerFacade
{
public void Log(string message, Category category, Priority priority, [CallerMemberName] string callerMethod = "")
{
...
所以我的问题是,如何覆盖第三方(Prism)接口强制执行的Log
方法,以包含1个额外的可选参数?或者如何使用此属性传递调用方法名称,以便我可以记录它?
我见过其他类似的问题,但[CallerMemberName]属性是.NET 4.5中的一个新功能,所以我希望找到比提供的解决方案更好的解决方案。
答案 0 :(得分:4)
不幸的是,你能够做到这一点的唯一方法是修改Prism源并重建二进制文件。例如将callerMethod参数添加到ILoggerFacade的Log方法。
public interface ILoggerFacade
{
void Log(string message, Category category,
Priority priority, [CallerMemberName] string callerMethod = "");
}
如果有任何已经实现ILoggerFacade的类,您还需要修改它们。
答案 1 :(得分:1)
您可以使用一些额外的方法扩展ILoggerFacade接口,如下所示:
public static class LoggerExtensions
{
public static void LogError(this ILoggerFacade logger, string message, [CallerMemberName] string caller = "")
{
logger.Log(message + ' ' + caller, Category.Exception, Priority.High);
}
}
然后你只需使用扩展方法而不是Log():
logger.LogError("message");