当前位置: 移动技术网 > IT编程>开发语言>.net > 日志记录插件

日志记录插件

2019年02月14日  | 移动技术网IT编程  | 我要评论

超好听手机铃声,寓言飞飞官网,潮流论坛

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

 

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网