美文网首页.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