normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

AppInsights の Java SDK が出力するログを確認したい場合

Application Insights を利用する場合、設定ファイルが読み込まれたか?何か内部エラーが発生していないか等を詳細に確認したい場合がある。その際に利用できる InternalLogger について紹介する。

有効化する - コンソール出力編

以下のように ApplicationInsights.xml の SDKLogger タグを追加する。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">
        "中略"
	<SDKLogger>
	</SDKLogger>
	<DisableTelemetry>false</DisableTelemetry>
</ApplicationInsights>

ソースコードを確認すると理解できるが、SDKLogger タグが存在している場合に初期化処理が実行されるようになっている。

デフォルトでは以下のように CONSOLE に最初が"AI"として情報が出力される設定になっている。

情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
AI: INFO 30-11-2015 00:08, 19: Registering WebApp with name 'AppInsightWebApp'
AI: INFO 30-11-2015 00:08, 19: Configuration file has been successfully found as resource
AI: WARN 30-11-2015 00:08, 19: 'MaxTelemetryBufferCapacity': null value is replaced with '500'
AI: WARN 30-11-2015 00:08, 19: 'FlushIntervalInSeconds': null value is replaced with '5'
AI: TRACE 30-11-2015 00:08, 19: Using Http Client version 4.3+
AI: TRACE 30-11-2015 00:08, 19: No back-off container defined, using the default 'EXPONENTIAL'
AI: WARN 30-11-2015 00:08, 19: 'Channel.MaxTransmissionStorageCapacityInMB': null value is replaced with '10'
AI: TRACE 30-11-2015 00:08, 19: C:\Users\"username"\AppData\Local\Temp\AISDK\native\1.0.1 folder exists
AI: TRACE 30-11-2015 00:08, 19: Java process name is set to 'javaw'
AI: TRACE 30-11-2015 00:08, 19: Successfully loaded library 'applicationinsights-core-native-win64.dll'
AI: TRACE 30-11-2015 00:08, 19: Registering PC 'JSDK_ProcessMemoryPerformanceCounter'
AI: TRACE 30-11-2015 00:08, 19: Registering PC 'JSDK_ProcessCpuPerformanceCounter'
AI: TRACE 30-11-2015 00:08, 19: Registering PC 'JSDK_WindowsPerformanceCounterAsPC'
AI: INFO 30-11-2015 00:08, 19: Registered WebApp 'AppInsightWebApp' key='AppInsightWebApp'
AI: INFO 30-11-2015 00:08, 19: Successfully registered the filter 'ApplicationInsightsWebFilter'
11 30, 2015 12:08:29 午前 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-nio-8080"]
11 30, 2015 12:08:29 午前 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["ajp-nio-8009"]
11 30, 2015 12:08:29 午前 org.apache.catalina.startup.Catalina start
情報: Server startup in 2452 ms
AI: TRACE 30-11-2015 00:08, 32: InProcessTelemetryChannel sending telemetry

有効化する - ファイル出力編

AppInsights Java SDKソースコードを確認すると SDKLoggerXmlElement にて JAXB を利用して拡張機能が実装されていることが分かる。
InternalLogger を確認すると CONSOLE 以外にも FILE が存在するので、さっそく試すと以下のエラーが出力された。

AI: INFO 30-11-2015 00:14, 19: Registering WebApp with name 'AppInsightWebApp'
AI: INFO 30-11-2015 00:14, 19: Configuration file has been successfully found as resource
AI: SDK Internal Logger internal error while initializing 'FILE': 'Unique log file prefix is not defined'.

上記から prefix の文字を含めて設定する必要があるらしいことが分かる。SDKLoggerXmlElement.java を確認すると設定項目があるので、以下を設定する。

	<SDKLogger type="FILE">
		<UniquePrefix>AppInsightWebApp</UniquePrefix>
	</SDKLogger>

無事アプリケーションが起動すると %TEMP%\javasdklogs\AppInsightWebApp-2015-11-29-23-20-05-JavaSDKLog3742616972029564770.jsl としてファイルが作成された。
ソースコードを確認すると File.createTempFile( uniquePrefix + LOG_FILE_PREFIX, LOG_FILE_SUFFIX, baseFolder) としてファイルを作成していることが確認できる。