Log4Net

登录InsightOps

Insightops为Log4Net提供了插件。

要将应用程序配置为登录Insightops,您需要执行以下任务:

  • 创建InsightOps帐户。
  • 创建一个主机和日志来接收日志数据。
  • 将Plugin库和适当的InsightOps Appender库添加到应用程序中。
  • 在你的应用程序中配置Plugin和InsightOps appender。
  • 从应用程序发送日志消息。
  • 以下详细概述了这些步骤。

设置

将log4net和insighttops Target库添加到应用程序的最简单方法是安装R7Insight。Log4netNuget包. 此软件包将安装InsightOps目标库,并将作为依赖项自动安装log4net软件包。

如果希望手动安装InsightOps appender,可以下载此GitHub存储库中的完整代码,将其中的R7InsightLog4net Visual Studio项目编译为DLL文件,然后在应用程序中引用此文件。如果选择此选项,则必须自己安装log4net。

配置log4net和Insightops appender

常规log4net配置超出了本文的范围。有关如何配置log4net的详细信息,请参阅log4net手册的配置部分。

log4net允许将日志消息发送到多个目的地。在log4net术语中,这种输出目的地称为appender。Appenders必须实现log4net.appenders.iappender接口。Insightops Appender库提供了这样的Appender组件,专门用于以有效的方式将日志消息发送到InsigleOps。

Insightops Appender配置并以正常方式使用AN的正常方式添加到Log4Net配置中 元素:

         
1
2
...
3.

insighttops appender有两类设置,它们的配置有些不同:

  • 日志记录设置
  • Insightops凭证

log4net日志记录设置

日志记录设置确定appender的操作方式,并指定为 元素。insightsappender支持以下配置设置:

  • 级别:应该包括的最低日志记录级别。所有日志消息都将筛选出此级别下方的日志记录级别,不会发送到Insightops。
  • Debug:设置为true将内部调试消息发送到Log4net内部日志记录器。
  • USESSL:设置为true以使用SSL将数据发送到Insigrops(见下文获取更多信息)。
  • 布局:用于在将日志消息发送到InsightOps之前格式化日志消息的布局。有关配置布局的更多信息,请参阅Log4net手册的配置部分。下面是一个appender配置的示例,它适用于InsightOps:
         
1
2
<调试价值= " true " / >
3.
<区域值=“欧盟”/>
4
5
6
<布局类型=“log4net.layout.patternlayout”>
7
.
8
> < /布局
9

接下来,你需要在你的AssemblyInfo.cs文件中添加以下一行:

         
1
[程序集:log4net.Config.XmlConfigurator(ConfigFile=“Web.Config”,Watch=true)]

对于控制台应用程序,请使用:

         
1
[组装:log4net.Config.XmlConfigurator (ConfigFile =“App.config”,看= true))
2

log4net Insightops凭据

InsightOps凭据确定将日志消息发送到哪个主机和日志。以下设置构成InsightOps凭据:

令牌:要向其发送消息的日志的唯一令牌GUID。这在使用较新的基于令牌的日志记录时适用。

因此,可以比配置设置更灵活地指定Insightops凭据。你有三个选择:

  • 将凭据指定为子元素 元素(如果不需要增加灵活性)。
  • 属性中的设置指定凭据 元素在你的App.config och Web。配置文件。
  • 将凭证指定为云服务项目中的Windows Azure角色配置设置(仅在Windows Azure中运行应用程序时仅适用)。

InsightOps appender在内部使用CloudConfigurationManager类读取凭据值。此类按以下顺序查找每个凭据值:

  • 如果该值存在为Windows Azure角色配置设置,则使用该值。
  • 属性中的设置,则不存在该值 元素在你的App.config och Web。配置文件中,该值被使用。
  • 否则,如果该值作为 元素,则使用该值。
  • 如果在这些位置中没有找到该值,则会将错误记录到Log4net内部调试日志中,并将错误记录到insighttops。

下面是一个如何在中指定凭据的示例 元素:

         
1
2
<令牌值=“BB61600F-F766-451E-B55F-9204F536A79F”/>
3.
...
4

下面是一个如何在中指定凭据的示例 元素在App.config或Web.config文件中:

         
1
2
3.
< / appSettings >

以下是如何将凭据指定为Windows Azure角色配置设置的示例:

         
1
2
3.
<实例计数=“2”/>
4
5
6
7
< / Role&rt;
8

log4net Web应用程序日志信息

在web应用程序中,使用Log4net的内置功能记录每个日志消息的附加上下文信息通常很有帮助。这与InsightOps的log message indexer结合使用尤其有效,它可以识别传入日志消息中的任何键值对,并为这些键值对编制索引,以便快速搜索和检索。

以下是如何以Insightops解析器识别和索引的格式添加到Insightops Appender的布局中,以索引和索引的格式:

         
1
2
...
3.
<布局类型=“log4net.layout.patternlayout”>
4
5
> < /布局
6

基于令牌的log4net日志记录

我们推荐的方式向Insightops发送消息的方法是通过令牌TCP OVER端口10000。要使用此方法,请在Insightops UI中创建新登录时选择令牌TCP作为源类型,然后粘贴在登录旁边打印的令牌。Insight.Token凭据设置的值。

使用log4net通过SSL/TLS发送日志数据

Insightops Appender支持通过在Appender定义中将Usessl日志记录设置设置为True,通过上述日志记录方法通过SSL / TLS发送日志数据。这更安全,但可能会产生性能影响。

使用log4net从应用程序发送日志消息

安装和配置完成后,就可以将日志数据发送到InsightOps了。

在您希望从每个类中开始,如果它尚未存在,则在顶部使用指令添加以下内容:

         
1
使用log4net;

然后在类级别创建记录器对象:

         
1
私有静态只读ilogm_Logger=LogManager.GetLogger(typeof({YOURCLASSNAMEHERE}).FullName);

请务必输入当前类而不是上面的名称。这将创建具有与当前类相同名称的记录器,其根据代码命名空间层次结构组织Log4net配置层次结构。这在读取日志时提供清晰度,以及在为代码的不同区域配置不同的日志级别时提供便利性。

现在在这个类的代码中,你可以正常使用log4net记录日志,它会记录到Rapid7 Insight。

例子:

         
1
m_logger.debug(“调试消息”);
2
m_Logger。信息(“信息消息”);
3.
m_Logger。警告(“警告消息”);
4
m_Logger。错误(“错误信息”,前女友);

完整代码示例:

         
1
使用log4net;
2
3.
public class HomeController:控制器
4
5
private static readonly ILog m_Logger = log4net.LogManager.GetLogger(typeof(HomeController).FullName);
6
7
公共ActionResult指数()
8
9
m_logger.debug(“查看主页”);
10
ViewBag.Message=“欢迎使用ASP.NET MVC!”;
11
m_Logger。Warn(“这是一个警告消息!”);
12
返回视图();
13
14

log4net故障排除

默认情况下,InsightOps appender将自己的调试消息记录到log4net的内部日志记录器中。检查这些调试消息可以帮助弄清楚为什么将日志记录到InsightOps不能按预期工作。

要禁用log4net内部调试消息,请设置log4net. internal。的调试设置 您的app.config或web.config文件的部分为false:

         
1
2
3.
< / appSettings >

如果您希望在一般情况下保持log4net内部调试是启用的,但特别要禁用Insight日志记录器的调试消息,则可以更改 元素到FALSE:

         
1
2
<调试value = " false " / >
3.
...
4

确保您遵循此自述文件的部分,就您的汇编了.CO.CS文件。

关闭log4net的记录器

InsightOps appender保持一个日志消息的内部队列,并使用一个后台线程与InsightOps系统通信,该线程不断地从这个队列发送消息。因此,当应用程序关闭时,一些日志消息可能仍然留在队列中,在应用程序域关闭之前没有时间发送到InsightOps。

要解决这个潜在的问题,请考虑将以下代码添加到应用程序中,这将阻塞一段时间,以允许InsightOps appender完成对队列中所有消息的日志记录。AreAllQueuesEmpty()阻塞一段指定的时间,然后根据在方法返回之前队列是否有时间变为空,返回true或false。

         
公共
1
2
//这将给后台线程一些时间来完成向InsightOps发送消息。
3.
var numWaits=3;
4
while(!r7sightcore.net.asynclogger.areallqueuesempty(timespan.fromseconds(5))&& numwaits> 0)
5
numwait--;
6