这货写了有一段时间了,今天抽空写一个使用的教程,暂且算教程吧。
首先建一个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*
因为前后加了星号,默认为重要信息
所以可以显示在列表中,而不需要展开详情查看
我觉得api执行时间也很重要
Trace.Write($" {timer.Elapsed.TotalMilliseconds} ms", "*API请求耗时*");
未完待续...
网友评论