.NET

在MVC中使用 blqw.Logger(3)

2017-04-28  本文已影响48人  冰麟轻武

Github源码

第一篇介绍如何使用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";
        }
    }

测试接口


然后到事件记录器中去看日志


我还可以建立一个完全自己控制的日志记录器

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();
            }
        }
    }
}

这依然是一个比较简单的例子,如果要更多功能可以看看 TraceListenerBaseIWriter 的注释,这里就做一个抛砖引玉

改配置

  <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

测试接口 id=999

image.png

<source>节点 中的配置不影响 <trace>节点

如果想把日志记录到数据库 或者redis,mq之类的地方只需要实现对应的实现即可

未完待续...

上一篇 下一篇

猜你喜欢

热点阅读