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.appender>
insighttops appender有两类设置,它们的配置有些不同:
- 日志记录设置
- Insightops凭证
log4net日志记录设置
日志记录设置确定appender的操作方式,并指定为
- 级别:应该包括的最低日志记录级别。所有日志消息都将筛选出此级别下方的日志记录级别,不会发送到Insightops。
- Debug:设置为true将内部调试消息发送到Log4net内部日志记录器。
- USESSL:设置为true以使用SSL将数据发送到Insigrops(见下文获取更多信息)。
- 布局:用于在将日志消息发送到InsightOps之前格式化日志消息的布局。有关配置布局的更多信息,请参阅Log4net手册的配置部分。下面是一个appender配置的示例,它适用于InsightOps:
1 2<调试价值= " true " / >3.<区域值=“欧盟”/>4 5 6<布局类型=“log4net.layout.patternlayout”>7. 8> < /布局9appender>
接下来,你需要在你的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凭据。你有三个选择:
- 将凭据指定为子元素
元素(如果不需要增加灵活性)。 appender> - 属性中的设置指定凭据
元素在你的App.config och Web。配置文件。 - 将凭证指定为云服务项目中的Windows Azure角色配置设置(仅在Windows Azure中运行应用程序时仅适用)。
InsightOps appender在内部使用CloudConfigurationManager类读取凭据值。此类按以下顺序查找每个凭据值:
- 如果该值存在为Windows Azure角色配置设置,则使用该值。
- 属性中的设置,则不存在该值
元素在你的App.config och Web。配置文件中,该值被使用。 - 否则,如果该值作为
元素,则使用该值。 appender> - 如果在这些位置中没有找到该值,则会将错误记录到Log4net内部调试日志中,并将错误记录到insighttops。
下面是一个如何在中指定凭据的示例
1 2<令牌值=“BB61600F-F766-451E-B55F-9204F536A79F”/>3....4appender>
下面是一个如何在中指定凭据的示例
1 2 3.< / appSettings >
以下是如何将凭据指定为Windows Azure角色配置设置的示例:
1 2 3.<实例计数=“2”/>4 5 67< / Role&rt;8
log4net Web应用程序日志信息
在web应用程序中,使用Log4net的内置功能记录每个日志消息的附加上下文信息通常很有帮助。这与InsightOps的log message indexer结合使用尤其有效,它可以识别传入日志消息中的任何键值对,并为这些键值对编制索引,以便快速搜索和检索。
以下是如何以Insightops解析器识别和索引的格式添加到Insightops Appender的布局中,以索引和索引的格式:
1 2...3.<布局类型=“log4net.layout.patternlayout”>45> < /布局6appender>
基于令牌的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。
例子:
1m_logger.debug(“调试消息”);2m_Logger。信息(“信息消息”);3.m_Logger。警告(“警告消息”);4m_Logger。错误(“错误信息”,前女友);
完整代码示例:
1使用log4net;23.public class HomeController:控制器4{5private static readonly ILog m_Logger = log4net.LogManager.GetLogger(typeof(HomeController).FullName);67公共ActionResult指数()8{9m_logger.debug(“查看主页”);10ViewBag.Message=“欢迎使用ASP.NET MVC!”;11m_Logger。Warn(“这是一个警告消息!”);12返回视图();13}14}
log4net故障排除
默认情况下,InsightOps appender将自己的调试消息记录到log4net的内部日志记录器中。检查这些调试消息可以帮助弄清楚为什么将日志记录到InsightOps不能按预期工作。
要禁用log4net内部调试消息,请设置log4net. internal。的调试设置
1 2 3.< / appSettings >
如果您希望在一般情况下保持log4net内部调试是启用的,但特别要禁用Insight日志记录器的调试消息,则可以更改
1 2<调试value = " false " / >3....4appender>
确保您遵循此自述文件的部分,就您的汇编了.CO.CS文件。
关闭log4net的记录器
InsightOps appender保持一个日志消息的内部队列,并使用一个后台线程与InsightOps系统通信,该线程不断地从这个队列发送消息。因此,当应用程序关闭时,一些日志消息可能仍然留在队列中,在应用程序域关闭之前没有时间发送到InsightOps。
要解决这个潜在的问题,请考虑将以下代码添加到应用程序中,这将阻塞一段时间,以允许InsightOps appender完成对队列中所有消息的日志记录。AreAllQueuesEmpty()阻塞一段指定的时间,然后根据在方法返回之前队列是否有时间变为空,返回true或false。
公共
1{2//这将给后台线程一些时间来完成向InsightOps发送消息。3.var numWaits=3;4while(!r7sightcore.net.asynclogger.areallqueuesempty(timespan.fromseconds(5))&& numwaits> 0)5numwait--;6}