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

在MVC中使用 blqw.Logger(2)

作者: 冰麟轻武 | 来源:发表于2017-04-27 19:48 被阅读41次

    Github源码

    上一篇介绍了在MVC中使用Trace写日志的例子
    今天介绍怎么使用TraceSource类来写日志

    因为blqw.Logger是基于微软的System.Diagnostics.Trace实现的,无论是Trace还是TraceSource都是可以直接使用的,所以日志埋点的时候不需要引用blqw.Logger.dll,只有在实际需要输出日志的项目中通过nuget安装并配置config文件即可。

    假设我在项目MVC中需要实现一个单独的翻译的组件:


    为了方便,我就直接建在一个解决方案里面了

    namespace Bing
    {
        public static class Translation
        {
            private const string START = "m:type=\"Edm.String\">";
            private const string END = "</d";
            private const string AUTH_TOKEN = "Basic NjBhYzBhNmQtMzkwMi00YTYwLTlhODItOWVhMDU1OTA0OGVhOmVKNk1UY3FRa2tVMlZISWVrcWFLdFBBVi9yQW56Zi9RVGIzY1NCcHFSQkU9";
            private const string URL = "https://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate";
            public static string ToZhCN(string text)
            {
                var www = new WebClient
                {
                    Headers =
                        {
                            ["Authorization"] = AUTH_TOKEN,
                            ["Accept"] = "application/xml"
                        },
                    Encoding = Encoding.UTF8
                };
                var xml = www.DownloadString(URL + "?To=%27zh-CHS%27&Text=%27" + Uri.EscapeDataString(text) + "%27");
                return GetText(xml);
            }
    
            static string GetText(string str)
            {
                var start = str.IndexOf(START);
                if (start < 0)
                {
                    return "翻译失败";
                }
                start += START.Length;
                var end = str.IndexOf(END, start);
                return str.Substring(start, end - start);
            }
        }
    }
    

    这样简单的实现一个bing的翻译功能,然后在MVC项目中添加一个API控制器。

        public class TranslationController : ApiController
        {
            [Route("api/trans")]
            public string Get(string en)
                => Bing.Translation.ToZhCN(en);
        }
    
    执行效果

    现在是没有日志的

    接下来为Translation组件增加日志

    为了方便使用,我直接使用了Trace.Listeners中的监听器

    namespace Bing
    {
        public static class Translation
        {
            ... ...
            private static readonly TraceSource _trace = InitTrace();
    
            private static TraceSource InitTrace()
            {
                var trace = new TraceSource("Bing.Translation", SourceLevels.Verbose);
                trace.Listeners.Clear();
                trace.Listeners.AddRange(Trace.Listeners);
                return trace;
            }
        }
    }
    

    例子中实现了一个简单版的,有兴趣可以点开这里看更复杂一点的例子

    日志埋点:

            public static string ToZhCN(string text)
            {
                _trace.TraceEvent(TraceEventType.Start, 0, "准备翻译:" + text);
                var timer = Stopwatch.StartNew();
                var www = new WebClient
                {
                    Headers =
                        {
                            ["Authorization"] = AUTH_TOKEN,
                            ["Accept"] = "application/xml"
                        },
                    Encoding = Encoding.UTF8
                };
                var xml = www.DownloadString(URL + "?To=%27zh-CHS%27&Text=%27" + Uri.EscapeDataString(text) + "%27");
                var result = GetText(xml);
                timer.Stop();
                _trace.TraceData(TraceEventType.Stop, 0, "翻译完成, 结果:" + result);
                _trace.TraceData(TraceEventType.Verbose, 0, "翻译耗时: " + timer.Elapsed.TotalMilliseconds + " ms");
                return result;
            }
    
    只出现了一条日志

    这里只出现了一条日志,是因为之前设置的默认输出等级是Verbose

    var trace = new TraceSource("Bing.Translation", SourceLevels.Verbose);
    

    可以改变配置文件


        <switches>
          <add name="Bing.Translation" value="All" />
        </switches>
    
    完成

    这样就可以显示全部日志了,所以埋点的时候可以根据日志的重要程度设置不同等级的日志

    特别重要的信息可以将eventid也就是第二个参数设置为Int32.MinValue

    _trace.TraceData(TraceEventType.Verbose, Int32.MinValue, "翻译耗时: " + timer.Elapsed.TotalMilliseconds + " ms");
    

    这样可以让这条信息显示在列表中...

    未完待续...

    相关文章

      网友评论

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

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