Tim*_*aax 6 .net c# logging log4net nlog
这个问题与史蒂文的答案有关 - 这里.他提出了一个非常好的记录器包装器.我将在下面粘贴他的代码:
public interface ILogger
{
void Log(LogEntry entry);
}
public static class LoggerExtensions
{
public static void Log(this ILogger logger, string message)
{
logger.Log(new LogEntry(LoggingEventType.Information,
message, null));
}
public static void Log(this ILogger logger, Exception exception)
{
logger.Log(new LogEntry(LoggingEventType.Error,
exception.Message, exception));
}
// More methods here.
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是创建代理到log4net的实现的正确方法是什么?我应该只使用类型参数添加另一个Log扩展方法,然后在里面创建一个开关吗?如果使用不同的log4net方法LoggingEventType?
第二个问题,以后在代码中使用它的最佳方法是什么?
因为他写道:
(...)您可以轻松创建ILogger实现(...)并配置您的DI容器以将其注入到在其构造函数中具有ILogger的类中.
这是否意味着每个会记录的类(基本上都是每个)都应该ILogger在它的构造函数中?
Yac*_*sad 11
所以,我的问题是创建代理到log4net的实现的正确方法是什么?
你应该创建类似的东西:
public class Log4netAdapter : ILogger
{
private readonly log4net.ILog m_Adaptee;
public Log4netAdapter(log4net.ILog adaptee)
{
m_Adaptee = adaptee;
}
public void Log(LogEntry entry)
{
//Here invoke m_Adaptee
if(entry.Severity == LoggingEventType.Debug)
m_Adaptee.Debug(entry.Message, entry.Exception);
else if(entry.Severity == LoggingEventType.Information)
m_Adaptee.Info(entry.Message, entry.Exception);
else if(entry.Severity == LoggingEventType.Warning)
m_Adaptee.Warn(entry.Message, entry.Exception);
else if(entry.Severity == LoggingEventType.Error)
m_Adaptee.Error(entry.Message, entry.Exception);
else
m_Adaptee.Fatal(entry.Message, entry.Exception);
}
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着每个会记录的类(基本上都是每个)都应该在其构造函数中使用ILogger?
据我所知,史蒂文斯回答:是的,你应该这样做.
以后在代码中使用它的最佳方法是什么?
如果您使用的是DI容器,那么只需使用DI容器进行映射ILogger即可Log4netAdapter.您还需要注册log4net.ILog,或者只是将一个log4net记录器实例提供给DI容器,以将其注入Log4netAdapter构造函数.
如果您不使用DI容器,即使用Pure DI,那么您可以执行以下操作:
ILog log = log4net.LogManager.GetLogger("MyClass");
ILogger logging_adapter = new Log4netAdapter(log);
var myobject = new MyClass(other_dependencies_here, logging_adapter);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7600 次 |
| 最近记录: |