Log4Net

日志记录InsightOps

InsightOps为log4net提供了一个插件。

要配置您的应用程序登录到insights,您需要执行以下任务:

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

设置

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

如果你想手动安装insighttops appender,你可以在这个GitHub库中下载完整的代码,将其中的R7InsightLog4net Visual Studio项目编译成一个DLL文件,然后在你的应用程序中引用这个文件。如果选择此选项,则必须自己安装log4net。

配置log4net和instops Appender

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

Log4net允许将日志消息发送到多个目的地。在log4net术语中,这样的输出目的地称为appender。Appenders必须实现log4net.Appenders。IAppender接口。insighttops Appender库提供了这样一个Appender组件,它是专门设计用来高效地将日志消息发送到insighttops的。

在log4net配置中使用 元素:< / appender >

         
1
< appender name = " InsightAppender " type = " log4net.Appender。InsightAppender R7Insight。Log4net”>
2
...
3.
< / appender >

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

  • 日志设置
  • InsightOps凭证

log4net日志设置

属性的子元素指定日志记录设置,以确定追加器如何操作 元素。insightsappender支持以下配置设置:< / appender >

  • 级别:应该包含的最低的Log4net日志级别。所有日志级别低于此级别的日志消息将被过滤掉,不会发送到insighttops。
  • Debug:设置为true将内部调试消息发送到Log4net内部日志记录器。
  • UseSsl:设置为true,使用SSL向InsightOps发送数据(更多信息见下面)。
  • “布局”:日志信息发送到insights前的布局。有关配置布局的更多信息,请参阅Log4net手册的配置部分。下面是一个用于InsightOps的appender配置示例:
         
1
< appender name = " InsightAppender " type = " log4net.Appender。InsightAppender R7Insight。Log4net”>
2
<调试价值= " true " / >
3.
<地区value = "欧盟" / >
4
< UseSsl价值= " true " / >
5
6
<布局type = " log4net.Layout.PatternLayout " >
7
.
8
> < /布局
9
< / appender >

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

         
1
【大会:log4net.Config.XmlConfigurator (ConfigFile = " Web。config", Watch = true)]

对于主机应用使用:

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

log4net InsightOps凭证

洞察凭据确定发送到哪个主机并记录日志消息。以下设置构成了insighttops凭据:

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

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

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

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

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

属性中指定凭据的示例 元素:< / appender >

         
1
< appender name = " InsightAppender " type = " log4net.Appender。R7InsightAppender R7Insight。Log4net”>
2
<令牌值= " bb61600f f766 - 451 e - b55f - 9204 f536a79f " / >
3.
...
4
< / appender >

属性中指定凭据的示例 元素。配置文件:

         
1
< appSettings >
2
<添加关键= "洞察力。令牌“价值= " bb61600f f766 - 451 e - b55f - 9204 f536a79f " / >
3.
< / appSettings >

下面是一个如何将凭证指定为Windows Azure角色配置设置的示例:

         
1
.
2
<角色名称= " MyRole " >
3.
<实例数= " 2 " / >
4
< ConfigurationSettings >
5
<设置name = "洞察力。令牌“价值= " bb61600f f766 - 451 e - b55f - 9204 f536a79f " / >
6
< / ConfigurationSettings >
7
< / Role&rt;
8
< / ServiceConfiguration >

log4net Web应用程序日志信息

在web应用程序中,使用Log4net的内置功能为每个日志消息记录额外的上下文信息通常是有帮助的。它与InsightOps的日志消息索引器结合使用时工作得特别好,该索引器可以识别传入日志消息中的任何键值对,并为这些键值对建立索引,以进行快速搜索和检索。

下面是一个示例,说明如何将额外的特定于web的上下文日志信息以InsightOps解析器能够识别和索引的格式添加到InsightOps appender的布局中:

         
1
< appender name = " InsightAppender " type = " log4net.Appender。R7InsightAppender R7Insight。Log4net”>
2
...
3.
<布局type = " log4net.Layout.PatternLayout " >
4
5
> < /布局
6
< / appender >

基于令牌的log4net日志记录

我们推荐的向insighttops发送消息的方法是通过令牌TCP端口10000。要使用这种方法,在insighttops用户界面中创建新日志时,选择Token TCP作为源类型,然后将打印的Token粘贴到Insight的值中。令牌凭证设置。

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

通过在appender定义中将useSsl日志设置为true, insighttops appender支持使用上述两种日志记录方法通过SSL/TLS发送日志数据。这样更安全,但可能对性能有影响。

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

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

在你想要登录的每个类中,如果还没有的话,在顶部添加以下using指令:

         
1
使用log4net;

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

         
1
private static readonly ILog m_Logger = LogManager.GetLogger(typeof({YOURCLASSNAMEHERE}).FullName);

请确保输入当前类的名称,而不是上面的名称。这将创建一个与当前类同名的日志记录器,它将根据代码名称空间层次结构组织log4net配置层次结构。这样既可以清晰地读取日志,又可以方便地为代码的不同区域配置不同的日志级别。

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

例子:

         
1
m_Logger。调试(“调试信息”);
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。调试(“主页查看。”);
10
ViewBag。信息= "欢迎访问ASP。净MVC !”;
11
m_Logger。Warn(“这是一个警告消息!”);
12
返回视图();
13
14

故障排除log4net

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

要禁用log4net内部调试消息,请设置log4net. internal。的调试设置 部分的应用程序配置或Web。配置文件为false:

         
1
< appSettings >
2
<添加关键= " log4net.Internal。调试“价值= " false " / >
3.
< / appSettings >

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

         
1
< appender name = " LeAppender " type = " log4net.Appender。InsightAppender R7Insight。Log4net”>
2
<调试value = " false " / >
3.
...
4
< / appender >

确保您遵循了关于AssemblyInfo.cs文件的自述部分。

关闭log4net的记录器

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

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

         
公共
1
2
//这将给后台线程一些时间来完成向InsightOps发送消息。
3.
var num等待= 3;
4
while (!R7InsightCore.Net.AsyncLogger.AreAllQueuesEmpty(TimeSpan.FromSeconds(5)) && num等待> 0)
5
numWaits——;
6