0

假设我有一个实用程序(例如记录器),我的应用程序中的每个类都可能使用它。我希望记录器能够保存有关使用记录器的客户端类型的信息,即如果StockProvider想要记录消息,记录器应该将StockProvider类名与日志消息一起附加。并且StockProvider记录器通过构造函数传递,例如

public StockProvider (ILogger logger) {}

因此它可以在其方法中使用记录器。我知道每次使用记录器时传递类型信息是最简单的,比如logger.Log (GetType(), msg). 我想要的是记录器在其状态中拥有该客户端类型信息,而不是必须将该类型信息传递给记录器方法,以便调用Log导致消息被附加类型名称。例如,使用构造函数传递它

class Logger : ILogger {
    public Logger (Type clientType) {
        this.type = clientType;
    }
    public void Log(string msg)
    { Console.WriteLine(this.type.FullName + msg); }
}

会在里面工作,StockProvider我只能说

logger.Log (msg)

所以问题是:我是否能够以Logger这样一种通用的方式进行注册,以接收clientType请求记录器的客户端(无论是它StockProvider还是任何其他客户端类型)?请注意,我将记录器用作代码中可能广泛使用的某些类的示例。它也可能是一种事件发布者,想知道谁触发了事件

4

2 回答 2

2

您可以创建一个通用记录器,如:

    public interface ILogger<T> where T: class
    {
       void Log(string message, LogLevel level);
    }

    public class Logger<T> : ILogger<T>
       where T: class
    {
       public void Log(string message, LogLevel level) 
       {
            WriteLog(typeof(T).Name + ": " + message, level);
       }
    }

现在你必须ILogger在你的 DI 容器中注册一个通用实现,例如UnityContainer你可以这样做:

    IUnituContainer container = new UnityContainer()'
    container.RegisterType(typeof(ILogger<>), typeof(Logger<>));

接下来,您的提供者必须如下所示:

    public StockProvider (ILogger<StockProvider> logger) {}
于 2017-02-08T15:00:17.687 回答
0

使用 log4Net,您可以执行以下操作:

public class Import 
{
    private static ILog Log
    {
        get
        {
            if (LogManager.GetCurrentLoggers().Length == 0)
            {
                // load logger config with XmlConfigurator
                log4net.Config.XmlConfigurator.Configure();
            }
            return LogManager.GetLogger(typeof(Import));
        }
    }

在我的例子中,Import 是我的班级的名字,这很明显。您需要根据需要更改这段代码。

于 2017-02-08T15:04:42.797 回答