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

在MVC中使用 blqw.Logger(1)

作者: 冰麟轻武 | 来源:发表于2017-04-26 20:33 被阅读66次

    Github源码

    这货写了有一段时间了,今天抽空写一个使用的教程,暂且算教程吧。

    首先建一个MVC项目,为了简单一个我直接使用WebApi了。

    nuget安装blqw.Logger

    安装完之后在Web.Config中会出现以下配置

      <system.diagnostics>
        <sources>
          <source name="blqw.Logger" switchValue="Error"/>
          <!-- 该节点可删除 -->
        </sources>
        <trace autoflush="false" useGlobalLock="false">
          <listeners>
            <add name="{日志文件夹名称}" 
                     type="SLSTraceListener, blqw.Logger" 
                     initializeData="{日志文件路径,可忽略,默认'bin\..\sls_logs'}"
                     level="{记录日志的等级,可忽略,默认All,设置值请参考System.Diagnostics.SourceLevels}"
                     queueMaxLength="{缓存队列长度,默认50000000}"/>
          </listeners>
        </trace>
      </system.diagnostics>
    

    改成这样

      <system.diagnostics>
        <trace autoflush="false" useGlobalLock="false">
          <listeners>
            <add name="Demo" 
                    type="SLSTraceListener, blqw.Logger" 
                    initializeData="d:\sls_logs"/>
          </listeners>
        </trace>
      </system.diagnostics>
    

    Global.asax中加入如下代码

        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
    
            public override void Init()
            {
                BeginRequest += (a, b) => Trace.WriteLine("BeginRequest");
                PreSendRequestContent += (a, b) => Trace.Flush();
                base.Init(); 
            }
        }
    

    主要是init()里面 BeginRequest 事件作为第一个事件,在里面输入第一个日志,用于生成上下文日志id
    在最后一个事件 PreSendRequestContent 中调用Trace.Flush()用于输出日志到文件。

    ps:关于事件的顺序,可以参考下面这张图,之前我也搞错了,吧Flush写在EndRequest里,造成部分日志丢失

    然后在ApiController的代码

        public class TestController : ApiController
        {
            public string Get(int id)
            {
                Trace.WriteLine("测试一下日志哦:id=" + id, "测试");
                return "value";
            }
        }
    

    直接运行看效果

    访问
    找到本地的look.html文件,打开 选择文件 选择文件 点击看详情 详情

    这个就是刚才的日志,但是只有两条。
    然后我们可以稍微改造一下。

    public override void Init()
    {
        BeginRequest += (a, b) =>
        {
            var application = (HttpApplication)a;
            application.Context.Items["api_timer"] = Stopwatch.StartNew();
            var req = application.Context.Request;
    
            Trace.Write(Trace.CorrelationManager.ActivityId, "LogID");
            Trace.Write(req.UserHostAddress, "IP");
            Trace.Write(req.Url.ToString(), "*URL*");
            Trace.Write(req.UserHostName, "UserHostName");
            foreach (var name in req.Headers.AllKeys)
            {
                Trace.Write(req.Headers[name], $"Header:{name}");
            }
        };
        PreSendRequestContent += (a, b) =>
        {
            var application = (HttpApplication)a;
            var timer = application.Context.Items["api_timer"] as Stopwatch;
            if (timer != null)
            {
                timer.Stop();
                Trace.Write($" {timer.Elapsed.TotalMilliseconds} ms", "API请求耗时");
            }
            Trace.Flush();
        };
        base.Init();
    }
    

    现在输出的日志就是这样的


    其中*URL*因为前后加了星号,默认为重要信息
    所以可以显示在列表中,而不需要展开详情查看

    Paste_Image.png

    我觉得api执行时间也很重要

    Trace.Write($" {timer.Elapsed.TotalMilliseconds} ms", "*API请求耗时*");
    

    未完待续...

    相关文章

      网友评论

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

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