C# 简单的注入器和使用Log4net的日志抽象

C# 简单的注入器和使用Log4net的日志抽象,c#,log4net,simple-injector,C#,Log4net,Simple Injector,为了尝试使用Log4net获得一个好的日志抽象,我从中获取了抽象和适配器,并尝试让它们一起工作 剩下要做的就是配置容器,这是我没有成功完成的部分 我尝试的配置是 public static class InfrastructureRegistry { public static void RegisterLoggingServices(this Container container) { container.RegisterConditional(typeof(

为了尝试使用Log4net获得一个好的日志抽象,我从中获取了抽象和适配器,并尝试让它们一起工作

剩下要做的就是配置容器,这是我没有成功完成的部分

我尝试的配置是

public static class InfrastructureRegistry
{
    public static void RegisterLoggingServices(this Container container)
    {
        container.RegisterConditional(typeof(ILog), c => LogManager.GetLogger(
            c.Consumer.ImplementationType).GetType(), 
            Lifestyle.Scoped, c => true);
        container.RegisterPerWebRequest<ILogger, Log4netAdapter>();
    }
}
您所指的是假定应用程序中的每个组件都有一个单独的记录器,而您希望有一个特定的记录器“知道”其使用者,这样它就可以将日志消息与原始类关联起来

尽管在使用log4net和NLog等工具时,这似乎是一种非常常见的做法,但根据我的经验,这一要求通常来自这样一个事实,即在代码中的太多位置进行日志记录。请阅读更多信息

这就是说,如果您想有条件地注册记录器,您必须将适配器更改为泛型类;这样,您可以使注册成为有条件的:

public class Log4netAdapter<T> : ILogger
{
    private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(T));

    public void Log(LogEntry entry)
    {
        if(entry.LoggingEventType == LoggingEventType.Information)
            logger.Info(entry.Message, entry.Exception);
        else if(entry.LoggingEventType == LoggingEventType.Warning)
            logger.Warn(entry.Message, entry.Exception);
        else if(entry.LoggingEventType == LoggingEventType.Error)
            logger.Error(entry.Message, entry.Exception);
        else
            logger.Fatal(entry.Message, entry.Exception);
    }
}
公共类Log4netAdapter:ILogger
{
私有静态只读log4net.ILog logger=LogManager.GetLogger(typeof(T));
公共作废日志(日志条目)
{
if(entry.LoggingEventType==LoggingEventType.Information)
logger.Info(entry.Message,entry.Exception);
else if(entry.LoggingEventType==LoggingEventType.Warning)
logger.Warn(entry.Message,entry.Exception);
else if(entry.LoggingEventType==LoggingEventType.Error)
logger.Error(entry.Message,entry.Exception);
其他的
logger.Fatal(entry.Message,entry.Exception);
}
}
使用此泛型类,可以执行以下条件/上下文注册:

container.RegisterConditional(
    typeof(ILogger),
    c => typeof(Log4netAdapter<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Singleton,
    c => true);
container.register条件(
类型(ILogger),
c=>typeof(Log4netAdapter).MakeGenericType(c.Consumer.ImplementationType),
生活方式,单身,
c=>true);
您所指的假设是应用程序中的每个组件都有一个单独的记录器,而您希望有一个特定的记录器“知道”其使用者,以便它可以将日志消息与原始类关联起来

尽管在使用log4net和NLog等工具时,这似乎是一种非常常见的做法,但根据我的经验,这一要求通常来自这样一个事实,即在代码中的太多位置进行日志记录。请阅读更多信息

这就是说,如果您想有条件地注册记录器,您必须将适配器更改为泛型类;这样,您可以使注册成为有条件的:

public class Log4netAdapter<T> : ILogger
{
    private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(T));

    public void Log(LogEntry entry)
    {
        if(entry.LoggingEventType == LoggingEventType.Information)
            logger.Info(entry.Message, entry.Exception);
        else if(entry.LoggingEventType == LoggingEventType.Warning)
            logger.Warn(entry.Message, entry.Exception);
        else if(entry.LoggingEventType == LoggingEventType.Error)
            logger.Error(entry.Message, entry.Exception);
        else
            logger.Fatal(entry.Message, entry.Exception);
    }
}
公共类Log4netAdapter:ILogger
{
私有静态只读log4net.ILog logger=LogManager.GetLogger(typeof(T));
公共作废日志(日志条目)
{
if(entry.LoggingEventType==LoggingEventType.Information)
logger.Info(entry.Message,entry.Exception);
else if(entry.LoggingEventType==LoggingEventType.Warning)
logger.Warn(entry.Message,entry.Exception);
else if(entry.LoggingEventType==LoggingEventType.Error)
logger.Error(entry.Message,entry.Exception);
其他的
logger.Fatal(entry.Message,entry.Exception);
}
}
使用此泛型类,可以执行以下条件/上下文注册:

container.RegisterConditional(
    typeof(ILogger),
    c => typeof(Log4netAdapter<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Singleton,
    c => true);
container.register条件(
类型(ILogger),
c=>typeof(Log4netAdapter).MakeGenericType(c.Consumer.ImplementationType),
生活方式,单身,
c=>true);

谢谢你,史蒂文。该死的,我对自己很生气。你的答案似乎很明显,我不知道为什么我没想到。我也花了很多时间在这上面。再次感谢!谢谢你,史蒂文。该死的,我对自己很生气。你的答案似乎很明显,我不知道为什么我没想到。我也花了很多时间在这上面。再次感谢!