C# 如何使TraceSource类的包装器线程安全

C# 如何使TraceSource类的包装器线程安全,c#,.net,logging,trace,C#,.net,Logging,Trace,我已经围绕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_

我已经围绕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。但正如我在问题的开头所提到的,我想对作为日志发送到文件或数据库的内容有更多的控制权。

我还不能评论,所以我会问你为什么要创建自定义日志而不是使用NLog。如果执行此操作,则NLog中的静态日志实例是线程安全的:

private static Logger logger = LogManager.GetLogger("MyClassName");
因为记录器是线程安全的,所以只需创建一次记录器并将其存储在静态变量中

请参阅此处的更多信息:

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


HTH

问题是,我们查看了Log4Net、Nlog等,但这些现成的记录器都没有向数据库插入日志。。他们所做的只是将日志写入硬盘上的文件中。如果我错了,请纠正我,因为这就是我对这些伐木工人的理解。为了实现我需要实现的目标,我还编写了一个自定义跟踪侦听器,它负责将日志插入数据库,日志可以写入数据库。这里有一些信息:很酷,但我还是被指示编写一个自定义记录器和自定义跟踪侦听器。所以我需要坚持我被要求做的事情。