如何使 TraceSource 类线程周围的包装器安全

本文关键字:包装 安全 周围 线程 何使 TraceSource | 更新日期: 2023-09-27 18:37:11

我已经围绕TraceSource类编写了一个包装器(自定义记录器类),以便更好地控制其他开发人员使用此自定义记录器的方式,并在各个级别记录数据/消息。

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

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。但正如我问题开头提到的,我希望更好地控制作为日志发送到文件或数据库的内容。

如何使 TraceSource 类线程周围的包装器安全

我还

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

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

由于记录器是线程安全的,因此您只需创建一次记录器并将其存储在静态变量中即可。

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

Nlog 是高度可配置的,似乎适合您描述的用例。