c# Web API在类之间共享日志类- ThreadStatic单例

本文关键字:日志 ThreadStatic 单例 共享 之间 Web API | 更新日期: 2023-09-27 18:15:32

我正在c#中构建一个web API。在web API中,我有多个功能。在同一个项目中,我还有其他用于拆分代码的类。在API中,我想要一个类,我可以添加数据,因为代码正在运行,而不管什么代码正在运行。

用例:在调用开始时,我想设置一个日志类,它将能够为我存储信息,以便在finally块中插入db。在代码的任何地方,我都希望能够向类中添加信息片段。一开始我会添加变量的信息。在中间,我将添加程序所做的事情,如果发生错误,则添加有关错误的特定信息。最后,我会设置执行时间。我相信如果我将这个类声明为静态,那么如果同时处理多个api,那么信息可能会发生变化。

我想我的问题是:我如何创建一个"全局"类,是线程安全的web API使用?

编辑:我需要在我的DB中存储这个类。要使用log4net,我需要编写一个自定义日志函数,使用自定义SQL将内容插入到我的DB
public string UserName { get; set; }
public string Endpoint { get; set; }
public string Response { get; set; }
public DateTime RequestTime { get; set; }
public DateTime ResponseTime { get; set; }
public string ServiceDescription { get; set; }
public string Controller { get; set; }
public string Version { get; set; }
public string ApplicationDescription { get; set; }
public string ApplicationVersion { get; set; }
public string Param1 { get; set; }
public string Param2 { get; set; }
public string Param3 { get; set; }
public string Param4 { get; set; }
public string Param5 { get; set; }
public string Param6 { get; set; }
public string Param7 { get; set; }
public string Param8 { get; set; }
public string Param9 { get; set; }
public string ParamBlob { get; set; }
public string IPAddress { get; set; }

编辑(解决方案):在巴达维亚回答后,我发现单例是可行的。经过测试,我看到这不是线程独立的。所以当我做了2个线程都编辑相同的数据和数据得到混合在2个线程之间。我解决这个问题的方法是:

public sealed class Logger
{
    [ThreadStatic]
    private static Logger instance = null;
    private static readonly object padlock = new object();
    public int test;
    Logger()
    {
    }
    public static Logger Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Logger();
                    }
                }
            }
            return instance;
        }
    }
}

下面的测试程序用于测试:

    var t = new Thread(_ =>
    {
        var x = Logger.Instance;
        x.test = 2;
        Console.WriteLine("t " + x.test);
        Thread.Sleep(30);
        Console.WriteLine("t after " + x.test);
    });
    var t1 = new Thread(_ =>
    {
        var y = Logger.Instance;
        y.test = 3;
        Thread.Sleep(10);
        Console.WriteLine("t1 " + y.test);
    });
    t.Start();
    t1.Start();
    Console.ReadLine();

c# Web API在类之间共享日志类- ThreadStatic单例

我会使用log4net来做日志记录。我已经成功地使用了它。它非常健壮,可以记录文件或数据库。配置示例请参见http://logging.apache.org/log4net/release/config-examples.html。

Update我认为最简单的方法是在调用开始时创建该类的实例,然后将其传递给其他各种类。在调用结束时,您可以将其存储到数据库中。这样就可以保护它不受其他API调用的影响。不需要全局类

对于全局线程安全类,你应该考虑单例设计模式

public class Logger {
     private static object _lock = new object();
     private static Logger _logger = null;
     public static Instance { get {
          if ( _logger == null ) {
             lock(_lock) {
                 if ( _logger == null ) {
                     _logger = new Logger();
                 }
             }
          }
     }
     private Logger() {}
     public void LogMessage(string message) {
          //code to log here, 
     }
}

还可以查看log4net,这是一个功能到达记录器,包括日志到db。