相关疑难解决方法(0)

记录器包装器的最佳实践

我想在我的应用程序中使用nlogger,将来可能需要更改日志记录系统.所以我想使用日志门面.

您是否知道对现有示例的任何建议如何编写这些示例?或者只是给我链接到这个领域的一些最佳实践.

.net c# logging nlog

87
推荐指数
4
解决办法
5万
查看次数

温莎 - 从容器中拉出瞬态物体

如何从容器中拉出瞬态物体?我是否必须在容器中注册它们并注入需要类的构造函数?将所有内容注入构造函数中感觉不太好.也只是为了一个类,我不想创建一个TypedFactory并将工厂注入需要的类.

我想到的另一个想法是根据需要"新"起来.但我也在我的Logger所有类中注入一个组件(通过属性).因此,如果我新建它们,我将不得不手动实例化Logger这些类.如何继续为我的所有课程使用容器?

记录器注入:我的大多数类都Logger定义了属性,除非存在继承链(在这种情况下,只有基类具有此属性,并且所有派生类都使用该属性).当这些通过Windsor容器实例化时,它们会将我的实现ILogger注入其中.

//Install QueueMonitor as Singleton
Container.Register(Component.For<QueueMonitor>().LifestyleSingleton());
//Install DataProcessor as Trnsient
Container.Register(Component.For<DataProcessor>().LifestyleTransient());

Container.Register(Component.For<Data>().LifestyleScoped());

public class QueueMonitor
{
    private dataProcessor;

    public ILogger Logger { get; set; }

    public void OnDataReceived(Data data)
    {
        //pull the dataProcessor from factory    
        dataProcessor.ProcessData(data);
    }
}

public class DataProcessor
{
    public ILogger Logger { get; set; }

    public Record[] ProcessData(Data data)
    {
        //Data can have multiple Records
        //Loop through the data and create new set …
Run Code Online (Sandbox Code Playgroud)

.net dependency-injection castle-windsor ioc-container

57
推荐指数
1
解决办法
2万
查看次数

带有DI Simple Injector的log4net

我正在尝试使用Simple Injector(+ integration MVC)v 2.5.2.对于MVC 4应用程序,我也需要跟踪/记录性能(执行)(通过log4net模块).当前实现(在运行时)在指定的路径中创建log4net文件,但没有写入任何文本行(当我调试它时,一切都没有错误到_logger.Info("message")的结尾).

有没有人尝试使用Simple Injector DI for log4net?

我注册log4net模块的方式是:

public static class LoggingModule
{
    public static void RegisterServices(Container container)
    {
        string log4NetConfigFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");
        log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFile));
        var logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        container.RegisterSingle(logger);

    }
}
Run Code Online (Sandbox Code Playgroud)

并在Global.asax

LoggingModule.RegisterServices(container);
Run Code Online (Sandbox Code Playgroud)

Log4net配置文件看起来像这样(我不认为有任何问题):

<log4net>
  <appender name="PerformanceLogFile" type="log4net.Appender.RollingFileAppender" >
  <param name="File" value="..\Performance\PricingManager" />
  <param name="AppendToFile" value="true" />
  <param name="RollingStyle" value="Date" />
  <param name="DatePattern" value="_yyyy-MM-dd.lo\g" />
  <param name="MaxSizeRollBackups" value="10" />
  <param name="StaticLogFileName" value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%m%n"/>
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <param …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-mvc dependency-injection simple-injector

7
推荐指数
1
解决办法
4929
查看次数

Serilog的记录器包装器的实现和使用

这个问题与史蒂文的答案有关 - 这里.他提出了一个非常好的记录器包装器.我将在下面粘贴他的代码:

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)

所以,我的问题是创建代理Serilog的实现的正确方法什么

注意:这个问题与关于log4net的这个问题有关,但现在特定于Serilog.

.net c# logging serilog

4
推荐指数
1
解决办法
3452
查看次数

Microsoft.Extensions.Logging的记录器包装器的实现和使用

这个问题与史蒂文的答案有关 - 这里.他提出了一个非常好的记录器包装器.我将在下面粘贴他的代码:

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)

所以,我的问题是创建代理Microsoft.Extensions.Logging的实现的正确方法什么,以及在代码中稍后使用它的最佳方法是什么

注意:此问题是关于log4net此问题的副本,但现在特定于Microsoft.Extensions.Logging.

.net c# logging ms-extensions-logging

3
推荐指数
1
解决办法
5908
查看次数

使用 Log4net 的简单注入器和日志记录抽象

为了尝试使用 Log4net 获得良好的日志记录抽象,我从这篇 SO 帖子中获取了抽象,并从这篇 SO 帖子中获取了适配器,并尝试让它们一起工作。

真正剩下要做的就是配置容器,而这是我尚未成功完成的部分。

我尝试过的配置是

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您从代码中看到的,我想要一个特定的 log4net 记录器,它从注入的类中获取其类型。虽然大多数日志记录都是以包罗万象的方式完成的,但我希望在较低层中进行一些日志记录,例如当表单验证失败时。

ActivationException通过该配置得到的是:

LogImpl 类型的构造函数包含名称为“logger”且类型为 ILogger 的未注册参数。请确保ILogger已注册,或更改LogImpl的构造函数。

不太确定从这里去哪里,所以任何帮助将不胜感激。

编辑

抱歉,我应该指出,我正在尝试编写它,这样我只需编写此配置一次。以下工厂函数有效,但我不想每次要注入记录器时都手动添加更多配置:

container.RegisterPerWebRequest<ILog>(() => LogManager.GetLogger(typeof(LoginController)));
Run Code Online (Sandbox Code Playgroud)

c# log4net simple-injector

2
推荐指数
1
解决办法
2294
查看次数