欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

日志记录插件

程序员文章站 2022-05-14 09:42:01
前段时间用由于项目需要日志入库,由于AspNetCore下面的Log4Net不支持入库操作, 只能自己写了个插件用来日志入库具体代码如下: 本插件主要用到2个类,LogModel 类 >数据库表里的映射,LogDAL类用来将对象入库操作。 具体调用方式如下 此日志插件可根据不同需要进行改造,只要调整 ......

     前段时间用由于项目需要日志入库,由于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"));

 

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