美文网首页.NET
在MVC中使用 blqw.Logger(3)

在MVC中使用 blqw.Logger(3)

作者: 冰麟轻武 | 来源:发表于2017-04-28 19:44 被阅读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之类的地方只需要实现对应的实现即可

    未完待续...

    相关文章

      网友评论

      • 夫礼者:能不能总结一份日志的最佳实践,例如日志记录的格式,存储的层次。我现在在个业务型公司。只能自己摸索,心累得慌。
        夫礼者: @冰麟轻武blqw 我也一直在思考这样的问题,查过不少资料,也已经开始实践了。其实最大的苦恼是有想法,周围连个可商量的人都没有。好气啊
        冰麟轻武: @夫礼者 而且你也要思考啊,我讲的是方法,有了方法就可以创造。比如乐高积木,你有了万的方法就可以随便搭,往往一些最佳实践会扼杀人们的创造力
        冰麟轻武: @夫礼者 慢慢来,才3而已,循序渐进嘛

      本文标题:在MVC中使用 blqw.Logger(3)

      本文链接:https://www.haomeiwen.com/subject/wdsazttx.html