log4netでApplication Insightsにログを出力する方法

はじめに

忘れないようにメモとして残しておきます。
.Net FrameworkのConsoleアプリを対象としています。

Visual StudionのNugetで必要なライブラリをインストール

log4netをインストール

www.nuget.org
f:id:nori-tech:20190714143149p:plain

Application Insightsをインストール

www.nuget.org
f:id:nori-tech:20190714142916p:plain

ローカルにApplicationInsights.configが生成されるので、InstrumentationKeyタグを追加する。
またApplicationInsights.configの完全版のため、不要なタグ(設定)は削除すること。
TelemetrySinkはログのサンプリングに関わるので、すべてのログをApplication Insightsに送信する場合は削除する。
docs.microsoft.com

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <InstrumentationKey>your instrumentkey</InstrumentationKey>
  <TelemetryInitializers>
    <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector"/>
    <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
    <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureWebAppRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
    <Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer"/>
  </TelemetryInitializers>
  <!-- 以下省略 -->
</ApplicationInsights>

log4net用のAppenderをインストール

www.nuget.org
f:id:nori-tech:20190714143400p:plain
app.configに必要な情報が登録される。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <log4net>
        <root>
            <level value="ALL" />
            <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>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

コンソールアプリでログ出力

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp14
{
    class Program
    {
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            var logger = LogManager.GetLogger(typeof(ConsoleApp14.Program));
            for (int i = 1; i <= 100; i++)
            {
                logger.Info("test:" + i);
            }
            // 最後にFlushメソッドを実行
            LogManager.Flush(5000);
            Console.ReadKey();
        }
    }
}

ログ出力結果

Application Insightsにログが出力された。
f:id:nori-tech:20190714145657p:plain

補足

log4netなので、app.configにappenderを追加すればコンソールやファイルに同じログを出力することが可能

 <log4net>
    <root>
      <level value="INFO" />
      <appender-ref ref="aiAppender" />
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ConsoleAppender"/>
    </root>
    <appender name="aiAppender" type="Microsoft.ApplicationInsights.Log4NetAppender.ApplicationInsightsAppender, Microsoft.ApplicationInsights.Log4NetAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger] - %message%newline" />
      </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger] - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value = "C:\Work\MyLog.log" />
      <appendToFile value = "true" />
      <rollingStyle value = "Size" />
      <maxSizeRollBackups value = "100" />
      <maximumFileSize value = "10MB" />
      <staticLogFileName value = "true" />
      <!-- 複数プロセスから書き込みOK -->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger] - %message%newline" />
      </layout>
    </appender>
  </log4net>