我刚刚被介绍到一个需要一些爱的旧Web应用程序。我想做的第一件事就是使用Elastic Search进行一些适当的记录并运行。
当前设置是,我们有多台服务器,其中多个IIS站点运行各自的站点副本。可以根据需要下载日志。这些站点都运行相同的应用程序,但适用于许多客户端。不幸的是,此网站不是为多个租户设计的。有很多问题要解决。这些站点在.NET 4.5.2和IIS 7.5上运行。但是,我要解决的第一个问题是使用集中式日志服务器来了解正在发生的事情。
IIS从上下文中注销不会显示有关它们来自哪个站点的任何信息。因此,仅将它们铲入Elastic并没有多大意义。我需要使用一些元数据来丰富每个日志,这些元数据可以告诉我这些数据来自何处。
我在Response对象上找到了一个函数AppendToLog
。这使我可以附加有关它是什么站点以及正在运行的版本的信息。
我已决定将此信息添加为JSON。例如{'site': 'SiteA', 'version': '4.3.2'}
。但是,这被附加在日志中的一个奇怪的位置。它被插入到cs-uri-stem
位置之后。由于cs-uri-query
在uri-stem之后,Elastic只是将未解析的JSON字符串放入url.query
字段中。我希望将其附加到日志的末尾,并希望能够将JSON解析为单个字段。但是日志中也没有字段头。
要插入新的日志信息,我已将其插入到HttpModule中的OnEndRequest
事件中,如下所示:
public class CustomIISLogModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
var helper = new EventHandlerTaskAsyncHelper(async (sender, args) =>
{
var app = (HttpApplication)sender;
var customLogEntry = new
{
Version = app.Context.Items.Contains("CorrelationId") ? app.Context.Items["CorrelationId"].ToString() : "-",
Site = app.Context.Items.Contains("Site") ? app.Context.Items["Site"].ToString() : "-"
};
app.Context.Response.AppendToLog(JsonConvert.SerializeObject(customLogEntry));
});
context.AddOnEndRequestAsync(helper.BeginEventHandler, helper.EndEventHandler);
}
}
到目前为止,我只是将FileBeat与IIS模块一起使用来提取日志。
我找不到任何有关如何实现将新的自定义字段添加到日志标题以及如何进行弹性搜索以解析字段值的文档或博客文章。我希望有人可以帮我一些帮助。
谢谢