日志记录插件

     前段时间用由于项目需要日志入库,由于AspNetCore下面的Log4Net不支持入库操作,

只能自己写了个插件用来日志入库具体代码如下:

 1  public class LogHelper
 2     {
 3 
 4         // 用于存放写日志任务的队列
 5         private Queue<Action> _queue;
 6 
 7         // 用于写日志的线程
 8         private Thread _loggingThread;
 9 
10         // 用于通知是否有新日志要写的“信号器”
11         private ManualResetEvent _hasNew;
12 
13         // 构造函数,初始化。
14         private LogHelper()
15         {
16             _queue = new Queue<Action>();
17             _hasNew = new ManualResetEvent(false);
18 
19             _loggingThread = new Thread(Process);
20             _loggingThread.IsBackground = true;
21             _loggingThread.Start();
22         }
23 
24         // 使用单例模式,保持一个Logger对象
25         private static readonly LogHelper _logger = new LogHelper();
26         private static LogHelper GetInstance()
27         {
28             //不安全代码
29             //lock (locker) {
30             //    if (_logger == null) {
31             //        _logger = new Logger();
32             //    }
33             //}
34             return _logger;
35         }
36 
37         // 处理队列中的任务
38         private void Process()
39         {
40             while (true)
41             {
42                 // 等待接收信号,阻塞线程。
43                 _hasNew.WaitOne();
44 
45                 // 接收到信号后,重置“信号器”,信号关闭。
46                 _hasNew.Reset();
47 
48                 // 由于队列中的任务可能在极速地增加,这里等待是为了一次能处理更多的任务,减少对队列的频繁“进出”操作。
49                 Thread.Sleep(100);
50 
51                 // 开始执行队列中的任务。
52                 // 由于执行过程中还可能会有新的任务,所以不能直接对原来的 _queue 进行操作,
53                 // 先将_queue中的任务复制一份后将其清空,然后对这份拷贝进行操作。
54 
55                 Queue<Action> queueCopy;
56                 lock (_queue)
57                 {
58                     queueCopy = new Queue<Action>(_queue);
59                     _queue.Clear();
60                 }
61 
62                 foreach (var action in queueCopy)
63                 {
64                     action();
65                 }
66             }
67         }
68 
69         private void WriteLog(LogModel content)
70         {
71             lock (_queue)
72             { // todo: 这里存在线程安全问题,可能会发生阻塞。
73                 // 将任务加到队列
74                 _queue.Enqueue(() =>LogDAL.InputDb(content));
75             }
76 
77             // 打开“信号”
78             _hasNew.Set();
79         }
80 
81         // 公开一个Write方法供外部调用
82         public static void Write(LogModel content)
83         {
84             // WriteLog 方法只是向队列中添加任务,执行时间极短,所以使用Task.Run。
85             Task.Run(() => GetInstance().WriteLog(content));
86         }
87     }

本插件主要用到2个类,LogModel 类--->数据库表里的映射,LogDAL类用来将对象入库操作。

具体调用方式如下

 

 LogHelper.Write(new LogModel(Level.Info, "ControllerName",
     "ActionName", "LogMessage"));

 

此日志插件可根据不同需要进行改造,只要调整入库操作为写文件流等操作就行。

 

上一篇:BIM工程信息管理系统-EF实体框架数据操作基类


下一篇:读串口