上一篇介绍了在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");
这样可以让这条信息显示在列表中...
未完待续...
网友评论