SharePoint トレースログの概要

SharePointで何かエラーが起きたら、トレースログ(ULSトレースログ、統合ログシステム トレースログ)に事象(エラー、情報)が書き込まれます。トレースログに出力されるログ内容は多岐に渡ります。トレースログに書き込まれる「何か」には、SharePointからデータベースへの書き込みエラーやタイマー(OWSTIMER)実行時のエラー、SharePointユーザーインターフェイスでの「操作ミス」、PowerShellの「入力ミス」などがあります。開発者は、トレースログAPI を使ってトレースログに独自のログを書き込めます。システム管理者(および開発者、運用担当者)は、PowerShellのGet-SPLogEventなどを使用してトレースログを参照したり、必要なログだけフィルタリングしたりできます。開発者ダッシュボードを使えば、トレースログが表示できます。

SharePoint トレースログの場所、ファイル

トレースログは、標準ではSharePoint Hive(¥Program Files¥Common Files¥Microsoft Shared¥Web Server Extensions¥14)のLOGSフォルダに格納されます。トレースログを格納する場所(フォルダ)は、[サーバーの全体管理]-[監視]-[診断ログの構成]で変更できます。トレースログのファイル名は、「コンピュータ名-年月日-時分.log」という形式です。既定では 30分に1ファイル作成され、ログファイル作成時の日時がログファイル名になります。

SharePoint トレースログ

SharePoint トレースログの出力内容

トレースログの1レコード(1行)には、事象の発生日時(Timestamp)、プロセス名(Process)、エリアとカテゴリ(Area,Category)、レベル(Level)、詳細メッセージ(Message)などがあります。事象の発生日時(Timestamp)は、PowerShellのGet-SPLogEventを使って表示すると...時分秒だけが表示されてしまいますが ちゃんと列名(Timestamp)まで指定すると、年月日時分秒が表示されます。プロセス名(Process)は、トレースログを出力したプロセス名で、タイマーの場合「OWSTIMER.exe」、SharePointユーザーインターフェイスの場合「w3wp.exe」、PowerShellの場合「PowerShell.exe」または「PowerShell_ise.exe」です。エリア(Area)は、SharePoint Foundation、Web Content Managementなどです。カテゴリ(Category)は、エリアごとに異なり General、Taxonomyなどがあります。トレースのレベルは、論理チェックに失敗した非定型の状態をあらわす Unexpected、問題をあらわす Monitorable、優先度の高いイベントを表す High、個別機能の成功/失敗メッセージ Medium、開発者のデバッグメッセージ VerboseとVerboseExがあります。イベントのレベルは、重大なエラーですぐに対処が必要な Critical、すぐに対処は不要なエラー Error、重大なエラーにつながる可能性のある警告 Warning、管理者に提供する情報 Informationがあります。トレースログを見る場合、まず始めに レベルで Critical、Exception、Unexpectedのログがないかをチェックしましょう。

SharePoint トレースログと関連のあるログ

トレースログで問題(レベル:Critical、Exception、Unexpected)を検出した場合、同様のログがWindowsイベントログにも登録されます。SharePointシステムの監視をおこなう場合は、トレースログではなくイベントログで監視した方が、他のエラー等も網羅できるので便利かもしれません。トレースログの問題が、SharePointユーザーインターフェイス(操作)によるエラーの場合、IISログを参照し、該当時刻にどのようなWebアクセスがあったかを解析する必要があります。トレースログの問題が、DeadLockなどのSQL Serverに関するものの場合、SQL Serverログを参照したり、SQL Server管理ツールでデータベース状態などの確認が必要です。

PowerShellのログ

SharePoint管理者操作を簡易にするために PowerShellでSharePonintのサイト、リストなどを作成したり、参照したり...とScriptを作って実行すると、実行は問題ないのですが ULSシステム トレースログに以下のログが出力される場合があります。

プロセス名PowerShell.exe
エリアSharePoint Foundation
カテゴリGeneral
レベルUnexpected
メッセージDetected use of SPRequest for previously closed SPWeb object.Please close SPWeb objects when you are done with all objects obtained from them, but not before.

「SPWebオブジェクト(SharePointサイトの情報を格納しているオブジェクト)は、実行前ではなく すべての実行後にクローズしてください。」というメッセージなのですが、心当たりがありません...。Scriptで SPWebのDisposeをちゃんとおこなっていても エラーがでます。シンプルなPowerShell Scriptコードでも、このエラーが出てしまいます。このエラーにより、SharePointサイト情報を格納しているメモリ解放がうまくいかず、サーバーのメモリを無駄に消費したままになる...のですが、サーバーのメモリがある下限を超えると、ガベージコレクションが走り、不要なメモリを解放してくれるので、「動作が重くなる可能性はあるが、システムがダウンすることはない」エラーです。

このエラーが出るパターンには、SPWebのプロパティを変更しているパターン(例:サイトのロゴ、サイドリンクバー有効化)、SPWebからリストを取得しているパターン(例:TryGetListメソッド)、SPWebのSharePointグループ関連のアクセスパターン(例:SiteGroupsのAdd)などがあります。サードパーティ製の市販製品でも、このエラーが発生してたりもします。システムダウンは起きない、他の製品でもエラーが出ている・・・とは言っても、直せるものならば直したいですよね。解決策としては、トレースログでメッセージから StackTraceの「場所」を手掛かりに Scriptの該当箇所を探し出し、その近辺を「Start-SPAssignment」「Stop-SPAssignment」で囲うことです。(TechNetの説明では...) Start-SPAssignmentは 新しい割り当てストアの開始、Stop-SPAssignmentは 割り当てストアの終了です。簡単にいえば、SPWebなどのオブジェクトに割り当てられるメモリの確保/破棄です。

(改善前) SharePointサイト情報を取得し、サイドリンクバーを無効化しています。

(改善後) 改善前のコードを Start-SPAssignmentとStop-SPAssignmentで囲っています。

Start-SPAssignmentとStop-SPAssignmentのオプションには、単純な割り当てを意味する 「-global」を指定しています。大雑把にPowerShellスクリプトのメイン処理を、SPAssignmentで囲むと...残念ながら PowerShell実行途中でエラーとなってしまいます。SPWebを取得してから、色々な処理を行っている場合、処理自体をシンプルに バラバラにして、SPAssignmentで囲う必要があります。


2018年の記事

2017年の記事


風水吉凶方位 風水吉凶方位 |  奇門遁甲 奇門遁甲 |  金運神社 金運神社 |  仏像 仏像 |  論語 論語 |  般若心経 般若心経 |  二十四節気 二十四節気 |  菜根譚 菜根譚 |  SharePoint活用 SharePoint |  OneNote活用 OneNote |  ICT活用 ICT