ユーザーソリューションにおいてログを記録することの重要性について
こんにちは。SharePoint サポートの多田です。今回はユーザーソリューションにおいてログを記録することの重要性についてご案内します。
SharePoint 2010 以降から、SPDiagnosticsService クラスを使用することによって、診断ログへの書き込みが容易になりました。以下の通り、一行で診断ログに書き込むことが可能です。
try{
...
} catch (Exception ex) {
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("UserCode", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}
ログを記録することの重要性について
SharePoint 製品では既定で診断ログは記録されるようになっており、エラーが発生した場合のトラブルシューティングに使用します。
また、診断ログの設定にてログの出力レベルを詳細に変更することで、エラー発生時だけではなく、正常時のデバッグログを記録することでエラーの発生しない現象 (例. パフォーマンスの問題) などを追跡できます。特にエンタープライズにおけるシステムは、問題が発生した際の報告が不可欠となりますため、これらのログを残す動作は導入後のトラブルシューティングには必須のものになります。
お客様が作成した SharePoint のユーザーソリューションについても同じことが言えます。エラー発生時のログ、および正常時のデバッグログが記録されていない場合、ユーザーソリューション内で発生した問題を特定するのが困難になります。また、場合によっては現象が発生した後にトラブルシューティングを実施するため、ログを記録するコードを追記し、再ビルド & 展開する必要がございます。サービスインした後にこれらの作業を実施する場合は多大かつ緊急な労力とコストがかかることが予想されます。このため、ユーザーソリューション開発時に可能な限り発生し得る問題を予測し、ログを記録するよう計画いただくことを推奨いたします。
また、ユーザーソリューションのログを、テキストファイルなどの診断ログ以外の場所に出力することは、複数プロセスまたはスレッドからの競合を考慮する必要があります。診断ログという機構を使って、安全かつ効率的なロギング メカニズムをユーザーが使用できることはメリットが大きいと考えられます。
診断ログのレベル
診断ログのレベルは数種類ございます。その中で代表的なものを以下にご案内いたします。
Unexpected : 既定の設定で出力されます。予期しないエラーが発生した際に使用されるレベルになります。try ~ catch 句の catch の中で使用されることが多いです。
Medium : 既定の設定で出力されます。正常時において、特定の処理の開始や終了など、各処理の節目をログする際に使用されるレベルになります。
Verbose : 既定の設定では出力されません。出力する場合は診断ログの出力レベルを詳細にする必要があります。正常時のデバッグログを記録する目的で使用されます。
診断ログのエリアとカテゴリを指定する方法
診断ログには複数のエリアおよびそのエリアに含まれるカテゴリがあります。
例えば、以下の画像では "SharePoint Foundation" がエリア、"通知" がカテゴリになります。各エリア内に複数のカテゴリが存在する形になります。
上記にて紹介したログを記録するサンプルコードでは、ログを出力するための最小構成のコードとなります。
しかし、診断ログのエリアとカテゴリを指定していないため、エリアが "Unknown" で出力されます。この場合、診断ログのレベル設定ができないため、Vorbose レベルを含め、すべてのログが出力される形になります。診断ログのレベルに応じて、ログ出力の有無を変更する場合は、エリアとカテゴリを指定して、ログを記録する必要があります。
以下の例では、エリア "SharePoint Foundation"、カテゴリ "通知" のログを出力しています。
SPDiagnosticsService diagnosticsService = SPDiagnosticsService.Local;
SPDiagnosticsCategory cat = diagnosticsService.Areas["SharePoint Foundation"].Categories["Alerts"];
string format = "Test trace logging for category {0} in area {1} : {2}";
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Unexpected, format, cat.Name, cat.Area.Name, "Unexpected");
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Medium, format, cat.Name, cat.Area.Name, "Medium");
diagnosticsService.WriteTrace(1, cat, TraceSeverity.Verbose, format, cat.Name, cat.Area.Name, "Verbose");
※ エリア "SharePoint Foundation"、カテゴリ "通知" のトレースレベルは既定で "中" になっているため、上記の最後の行の Vorbose レベルのログは出力されません。出力する場合は、トレースレベルを "詳細" に変更する必要がございます。
独自のエリアとカテゴリを指定する方法
上記で紹介した方法は、既定のエリアとカテゴリを指定して、ログを出力する方法でしたが、ユーザーソリューション独自のエリアとカテゴリを作成することも可能でございます。
独自のエリアとカテゴリを作成すると、上記の画像のカテゴリ一覧に表示され、出力レベルを変更することが可能になります。方法は以下のブログ資料に記載されております。
タイトル : ULS ログのヒント パート 2
アドレス : https://blogs.msdn.com/b/sharepoint_jp/archive/2011/03/21/uls-2.aspx
参考資料
タイトル : SPDiagnosticsServiceBase.WriteTrace method
タイトル : SPDiagnosticsCategory class
タイトル : SharePoint 2010 のデバッグ機能とログ機能
アドレス : https://msdn.microsoft.com/ja-jp/library/office/gg512103(v=office.14).aspx
タイトル : TraceSeverity enumeration