如何围绕TraceSource类线程安全包装

时间:2016-03-03 03:37:18

标签: c# .net logging tracing

我在TraceSource类周围编写了一个包装器(Custom Logger类),以便更好地控制其他开发人员在不同级别使用此自定义Logger和日志数据/消息的方式。

以下是仅针对详细,错误和信息级别实现的代码。

public class Logger : ILogger
{
    private const int DEF_ERROR_EVENT_ID = 2;
    private const int DEF_INFORMATION_EVENT_ID = 4;
    private const int DEF_DEBUG_EVENT_ID = 5;
    private static TraceSource source = null;

    public Logger(string nameOfComponent)
    {
         source = new TraceSource(nameOfComponent);
    }

    public  void LogDebug(Type type, string methodName)
    {
        if (type!=null)
            throw new ArgumentNullException(type.ToString());
        source.TraceEvent(TraceEventType.Verbose, DEF_DEBUG_EVENT_ID, string.Format("{0}.{1}",type.ToString(),methodName));
    }


    public  void LogError(string message, Exception ex)
    {
        if (String.IsNullOrEmpty(message) && ex == null)
            throw new ArgumentNullException(message, ex.ToString());
        source.TraceData(TraceEventType.Error, DEF_ERROR_EVENT_ID, message, ex);
    }

    public  void LogInformation(string message)
    {
        if (String.IsNullOrEmpty(message))
            throw new ArgumentNullException(message);
        source.TraceInformation(message);
    }
  }

我正在Logger类的非默认构造函数中初始化一个静态变量“source”(假设这个代码将在多线程环境中运行)这种做法在线程安全性方面很好?虽然MSDN文档说TraceSource是线程安全的,并且各种方法(如TraceSource.TraceData(),TraceSource.TraceEvent()等)也会在编写跟踪日志的所有跟踪侦听器周围考虑线程安全性。因为我正在计划中在我的Web应用程序中的每个类中单独实例化Logger类,如下所示。

   private ILogger log = new Logger("name of the source/class");

在多线程环境中这样做的最佳方法是什么?使用像Ninject或Autofac这样的DI容器会使Logger类成为线程安全的,或者我应该创建一个单例并使用它或在整个应用程序中重用它以使其成为线程安全的。如果我创建一个Logger类的单例实例,我面临的问题是我将无法将字符串作为参数传递给Logger类的非默认构造函数,并最终将相同的字符串传递给TraceSource类以了解名称运行中或运行中的源或组件。

有些人可能会说我为什么要重新发明轮子并在TraceSource周围创建一个包装器而不是直接使用TraceSource。但正如我在问题的开头提到的那样,我希望能够更好地控制作为日志发送到文件或数据库的内容。

1 个答案:

答案 0 :(得分:0)

我还不能发表评论 - 所以会问你为什么要创建自定义记录器而不是使用NLog。如果你这样做,那么NLog中的静态日志实例是线程安全的:

private static Logger logger = LogManager.GetLogger("MyClassName");
  

因为记录器是线程安全的,所以您只需创建一次记录器并将其存储在静态变量中。

在此处查看更多内容:https://github.com/NLog/NLog/wiki/Tutorial

Nlog具有高度可配置性,似乎适合您所描述的用例。

HTH