在MVC中使用 blqw.Logger(3)
2017-04-28 本文已影响48人
冰麟轻武
第一篇介绍如何使用Trace
记录日志
在MVC中使用 blqw.Logger(1)
第二篇介绍如何使用TraceSource
记录日志
在MVC中使用 blqw.Logger(2)
这篇说的是记录独立业务日志的方法(非全局日志)
回忆一下第一篇的配置
<system.diagnostics>
<trace autoflush="false" useGlobalLock="false">
<listeners>
<add name="Demo" type="SLSTraceListener, blqw.Logger" initializeData="d:\sls_logs"/>
</listeners>
</trace>
</system.diagnostics>
现在增加一个配置<sources>
,这里我配置的是SystemLogTraceListener
,这个侦听器会将日志写到windows系统的事件记录器中,侦听器的名字就是事件记录器中的“来源”。
<system.diagnostics>
<sources>
<source name="Business">
<listeners>
<clear/>
<add name="BusinessLog" type="SystemLogTraceListener, blqw.Logger" />
</listeners>
</source>
</sources>
<trace autoflush="false" useGlobalLock="false">
<listeners>
<add name="Demo" type="SLSTraceListener, blqw.Logger" initializeData="d:\sls_logs"/>
</listeners>
</trace>
</system.diagnostics>
在代码中增加一个TraceSource
实例
private static readonly TraceSource _trace = new TraceSource("Business", SourceLevels.All);
写日志
_trace.TraceData(TraceEventType.Verbose, 0, "balabala");
一个比较完整的Demo
public class TestController : ApiController
{
private static readonly TraceSource _trace = new TraceSource("Business", SourceLevels.All);
public string Get(int id)
{
_trace.TraceData(TraceEventType.Verbose, 0, "记录业务日志,收到请求id=" + id);
Trace.WriteLine("测试一下日志哦:id=" + id, "测试");
return "value";
}
}
测试接口
![](https://img.haomeiwen.com/i5397898/36673daf12d0c4bd.png)
然后到事件记录器中去看日志
![](https://img.haomeiwen.com/i5397898/4ec80edc1bead7e1.png)
我还可以建立一个完全自己控制的日志记录器
public class MyTraceListener : TraceListenerBase
{
public MyTraceListener(string initializeData = null)
: base(true, initializeData)
{
}
protected override WriteQueue CreateQueue() => new WriteQueue(new Wirter(this), 10 * 10000);
class Wirter : FileWriter
{
public Wirter(MyTraceListener listener)
{
DirectoryPath = listener.InitializeData;
Initialize(listener);
}
public override void Append(LogItem item)
{
if (!item.IsFirst && !item.IsLast)
{
ChangeFileIfFull();
Append($"{item.Time:yyyy-MM-dd HH:mm:ss}\t{item.Level}\t{item.Message}");
if (item.Content != null)
{
var ee = (item.Content as IEnumerable)?.GetEnumerator() ?? item.Content as IEnumerator;
if (ee != null)
{
while (ee.MoveNext())
{
Append(ee.ToString());
}
}
else
{
Append(item.Content.ToString());
}
}
AppendLine();
}
}
}
}
这依然是一个比较简单的例子,如果要更多功能可以看看 TraceListenerBase
和 IWriter
的注释,这里就做一个抛砖引玉
改配置
<system.diagnostics>
<sources>
<source name="Business">
<listeners>
<clear/>
<add name="BusinessLog" type="SystemLogTraceListener, blqw.Logger" />
<add name="MyLog" type="MyTraceListener, WebApplication2" initializeData="d:\mylog" />
</listeners>
</source>
</sources>
<trace autoflush="false" useGlobalLock="false">
<listeners>
<add name="Demo" type="SLSTraceListener, blqw.Logger" initializeData="d:\sls_logs"/>
</listeners>
</trace>
<switches>
<add name="Bing.Translation" value="All" />
</switches>
</system.diagnostics>
如果不知道type应该填什么可以先跑一下这段代码,取前面2节就好
typeof(MyTraceListener).AssemblyQualifiedName
![](https://img.haomeiwen.com/i5397898/2883171b0ceece18.png)
测试接口 id=999
![](https://img.haomeiwen.com/i5397898/34870ca425235f90.png)
![](https://img.haomeiwen.com/i5397898/ea6005fb697fe24e.png)
<source>节点 中的配置不影响 <trace>节点
如果想把日志记录到数据库 或者redis,mq之类的地方只需要实现对应的实现即可
未完待续...