Application Insights 不会将带有附加异常对象的 log4net 日志消息发送到 Azure
Application Insights doesn't sent log4net log message with appended exception object to Azure
我们当前的项目包括一个 ASP.NET 应用程序以及一些较小的控制台应用程序。我们正在使用 Microsoft Application Insights 来管理 ASP.NET 应用程序。
现在我们想在控制台应用程序中集成 Application Insights,以便能够将我们的日志记录集中到 Azure。
我们的遗留日志记录是使用 Log4Net 实现的。在控制台应用程序中配置 Application Insights Core 及其相应的 Log4Net Appender 后,我们能够按预期在 Azure 中看到我们的日志条目。来自控制台应用程序的每条日志消息都会发送到 Azure,但我们会附加一个额外对象的日志除外。例如,我们的严重级别为 Error 的日志消息包含异常对象作为第二个参数:
Log.Error("This looks like an error", ex);
Azure 中根本不显示这些日志条目。它们仅在将异常对象放入消息中时显示:
Log.Error($"This looks like an error. Exception: {ex}");
所以似乎有关于来自 Log4Net 的异常对象的大小限制而不是实际消息?如果是这样,这是否可以任何方式配置?因为更改整个项目中的每个 'Log.Error();' 不是一个选项。
我们的 ApplicationInsights.config
文件:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<InstrumentationKey>[Our key]</InstrumentationKey>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
<TelemetryProcessors>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<ExcludedTypes>Trace;Exception</ExcludedTypes>
</Add>
</TelemetryProcessors>
</ApplicationInsights>
编辑:
Log4Net 配置:
<!-- ... -->
<!-- Configuration of logfile and console appender -->
<!-- ... -->
<root>
<level value="ALL" />
<appender-ref ref="logfile" />
<appender-ref ref="console" />
<appender-ref ref="aiAppender" />
</root>
<appender name="aiAppender" type="Microsoft.ApplicationInsights.Log4NetAppender.ApplicationInsightsAppender, Microsoft.ApplicationInsights.Log4NetAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
其他附加程序没有问题。
您需要配置log4net,您现在只配置Application Insights。
要采取的步骤:
- 配置log4net
- 添加一个 application insights appender 让 log4net 记录到 application insights
接下来看你用的是什么版本。我看到您正在使用 .net 核心,它可能是针对其他版本的 application insights dll 构建的。尝试获取最新版本的 Microsoft.ApplicationInsights.Log4NetAppender.
Microsoft.ApplicationInsights.Log4NetAppender latest version
我明白了。导致问题的原因是,一旦您将异常对象附加到 Log4Net 的任何日志记录方法:
Log.Error(message, exception);
Log.Warn(message, exception);
Log.Info(message, exception);
特定日志条目在 Application Insights[=25= 中未作为 trace 处理,而是作为 exception 处理].因此,调整 Azure 中 Application Insights 选项卡中的过滤器以显示 exceptions 就足够了。现在我也可以在 Azure 中看到 Log.Error(message, exception)
条目。
我不知道为什么要这样处理,因为这使得第三方软件处理日志更加复杂(例如:Exceptions doesn't have explicit message 字段在 Application Insights 等)。
只要您传递异常,无论您使用何种类型的日志记录方法,它都会被记录为异常.. 如果您希望它被记录为跟踪,您不应该传递异常。有道理
我们当前的项目包括一个 ASP.NET 应用程序以及一些较小的控制台应用程序。我们正在使用 Microsoft Application Insights 来管理 ASP.NET 应用程序。
现在我们想在控制台应用程序中集成 Application Insights,以便能够将我们的日志记录集中到 Azure。
我们的遗留日志记录是使用 Log4Net 实现的。在控制台应用程序中配置 Application Insights Core 及其相应的 Log4Net Appender 后,我们能够按预期在 Azure 中看到我们的日志条目。来自控制台应用程序的每条日志消息都会发送到 Azure,但我们会附加一个额外对象的日志除外。例如,我们的严重级别为 Error 的日志消息包含异常对象作为第二个参数:
Log.Error("This looks like an error", ex);
Azure 中根本不显示这些日志条目。它们仅在将异常对象放入消息中时显示:
Log.Error($"This looks like an error. Exception: {ex}");
所以似乎有关于来自 Log4Net 的异常对象的大小限制而不是实际消息?如果是这样,这是否可以任何方式配置?因为更改整个项目中的每个 'Log.Error();' 不是一个选项。
我们的 ApplicationInsights.config
文件:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<InstrumentationKey>[Our key]</InstrumentationKey>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
<TelemetryProcessors>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<ExcludedTypes>Trace;Exception</ExcludedTypes>
</Add>
</TelemetryProcessors>
</ApplicationInsights>
编辑:
Log4Net 配置:
<!-- ... -->
<!-- Configuration of logfile and console appender -->
<!-- ... -->
<root>
<level value="ALL" />
<appender-ref ref="logfile" />
<appender-ref ref="console" />
<appender-ref ref="aiAppender" />
</root>
<appender name="aiAppender" type="Microsoft.ApplicationInsights.Log4NetAppender.ApplicationInsightsAppender, Microsoft.ApplicationInsights.Log4NetAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
其他附加程序没有问题。
您需要配置log4net,您现在只配置Application Insights。
要采取的步骤:
- 配置log4net
- 添加一个 application insights appender 让 log4net 记录到 application insights
接下来看你用的是什么版本。我看到您正在使用 .net 核心,它可能是针对其他版本的 application insights dll 构建的。尝试获取最新版本的 Microsoft.ApplicationInsights.Log4NetAppender.
Microsoft.ApplicationInsights.Log4NetAppender latest version
我明白了。导致问题的原因是,一旦您将异常对象附加到 Log4Net 的任何日志记录方法:
Log.Error(message, exception);
Log.Warn(message, exception);
Log.Info(message, exception);
特定日志条目在 Application Insights[=25= 中未作为 trace 处理,而是作为 exception 处理].因此,调整 Azure 中 Application Insights 选项卡中的过滤器以显示 exceptions 就足够了。现在我也可以在 Azure 中看到 Log.Error(message, exception)
条目。
我不知道为什么要这样处理,因为这使得第三方软件处理日志更加复杂(例如:Exceptions doesn't have explicit message 字段在 Application Insights 等)。
只要您传递异常,无论您使用何种类型的日志记录方法,它都会被记录为异常.. 如果您希望它被记录为跟踪,您不应该传递异常。有道理