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将内容插入到我的DBpublic 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();
我会使用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。