相关疑难解决方法(0)

依赖注入和命名记录器

我有兴趣了解更多有关人们如何使用依赖注入平台注入日志记录的信息.虽然下面的链接和我的示例引用了log4net和Unity,但我不一定会使用其中任何一个.对于依赖注入/ IOC,我可能会使用MEF,因为这是项目的其余部分(大)正在解决的标准.

我是依赖注入/ ioc的新手,对于C#和.NET来说还是新手(在过去10年左右的VC6和VB6中,在C#/ .NET中编写了很少的生产代码).我已经对各种日志解决方案进行了大量调查,所以我认为我对其功能集有一个不错的处理.我只是不熟悉获得一个依赖注入的实际机制(或者,可能更"正确",获得一个依赖注入的抽象版本).

我见过其他与日志记录和/或依赖注入相关的帖子,如: 依赖注入和日志记录接口

记录最佳实践

Log4Net Wrapper类看起来像什么?

再次关于log4net和Unity IOC配置

我的问题与"如何使用ioc工具yyy注入日志记录平台xxx"无关?相反,我感兴趣的是人们如何处理包装日志记录平台(通常,但并不总是建议)和配置(即app.config).例如,使用log4net作为示例,我可以配置(在app.config中)一些记录器,然后以标准方式使用这样的代码来获取这些记录器(没有依赖注入):

private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)

或者,如果我的记录器没有为某个类命名,而是为了一个功能区,我可以这样做:

private static readonly ILog logger = LogManager.GetLogger("Login");
private static readonly ILog logger = LogManager.GetLogger("Query");
private static readonly ILog logger = LogManager.GetLogger("Report");
Run Code Online (Sandbox Code Playgroud)

所以,我想我的"要求"将是这样的:

  1. 我想将我的产品源与直接依赖于日志记录平台隔离开来.

  2. 我希望能够通过某种依赖注入(可能是MEF)直接或间接地解析特定的命名记录器实例(可能在同一命名实例的所有请求者之间共享相同的实例).

  3. 我不知道我是否会称之为硬性要求,但我希望能够根据需要获得一个命名记录器(不同于类记录器).例如,我可能会根据类名为我的类创建一个记录器,但是一个方法需要特别重的诊断,我想单独控制.换句话说,我可能希望单个类"依赖"两个独立的记录器实例.

让我们从数字1开始.我已经阅读了很多文章,主要是关于stackoverflow,关于它是否是一个好主意.请参阅上面的"最佳实践"链接,并转到jeffrey hantin的评论,了解一个关于为什么包装log4net不好的观点.如果你确实包装(如果你能有效地包装),你会严格包装以注入/消除直接的倾向吗?或者你也会尝试抽象出部分或全部log4net app.config信息?

假设我想使用System.Diagnostics,我可能想要实现一个基于接口的记录器(甚至可能使用"常见的"ILogger/ILog接口),可能基于TraceSource,以便我可以注入它.你会实现接口,比如TraceSource,只是按原样使用System.Diagnostics app.config信息吗?

像这样的东西:

public class MyLogger : ILogger
{
  private TraceSource ts;
  public MyLogger(string name)
  {
    ts = new TraceSource(name);
  }

  public void ILogger.Log(string msg)
  {
    ts.TraceEvent(msg);
  }
} …
Run Code Online (Sandbox Code Playgroud)

c# logging log4net dependency-injection nlog

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

在解决方案中跨多个程序集使用相同的Log4net记录器的最佳模式是什么?

我有一个解决方案,包括一个主winforms应用程序,以及我希望记录的相关内部编写的类库dll.此记录应由同一记录器执行,无论主UI客户端或关联的dll是否调用此记录.dll当然可以被其他解决方案中具有不同记录器的其他应用程序使用,但在这些情况下将具有不同的log4net配置,并且可能是完全不同的一组appender.

一种方法是在主应用程序中创建单例并从中进行记录,但是由于log4net是它自己的单例,所以可以引用它,只要我们传递相同的字符串(或类型),log4net.LogManager.GetLogger我们将记录到相同的目的地(在我的情况下,我希望使用RollingFileAppender).

这有效.但是,鉴于DLL将具有许多类,这意味着我们希望记录的每个类实例化或静态类将需要i)定义记录器名称的参数(以便记录到同一目的地)和ii)在每个入口点都需要打电话log4net.LogManager.GetLogger(loggerName).

这里使用的最佳模式是什么?正确的方法是在每个程序集中创建单例实例吗?我担心的是,我们仍然需要将记录器名称传递给dll的每个入口点,这看起来有点过分.为了避免传入记录器名称,我可能会认为它始终等于System.Reflection.Assembly.GetCallingAssembly().GetName().Name.

如果这对于log4net来说太难了,还有其他更简单的解决方案,例如企业日志记录块吗?或者是面向方面编程(AOP)方法的最佳解决方案?

这里参考单例的反模式方法.

log4net projects-and-solutions

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

记录信息最佳实践

我正在做生产支持,很依赖日志进行故障排除.我发现日志信息现在非常混乱.

您能提供编写日志信息的最佳实践或指南吗?

顺便说一句:我们正在使用log4Net.你对替代图书馆有什么建议吗?

谢谢.

logging log4net

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

从StackFrame获取Type T.

目标是基于调用my方法的类型创建一个通用实例.

问题是,当从泛型调用时,StackFrame似乎只包含开放定义类型参数而不是封闭定义类型参数.如何从StackFrame中获取类型参数?与此问题类似.我想我的情况有所不同,因为Log.Debug是从一个封闭的方法调用的.

如果StackFrame不是正确的方法,除IoC以外的任何建议?此代码用于填写对我的Unity容器的引用不可用的情况.

using System;
using System.Reflection;

namespace ReflectionTest
{
    public class Logger
    {
        private readonly string loggerName;
        protected Logger(string loggerName) { this.loggerName = loggerName; }
        public void Debug(string message) { Console.WriteLine(string.Format("{0} - {1}", loggerName, message)); }
    }

    public class Logger<T> : Logger
    {
        public Logger() : base(typeof(T).FullName) { }
    }

    public static class Log
    {
        public static void Debug(string message)
        {
            // Determine the calling function, and create a Logger<T> for it.
            System.Diagnostics.StackFrame frame = new System.Diagnostics.StackFrame(1); …
Run Code Online (Sandbox Code Playgroud)

.net c# generics reflection

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