Tapestryは SLF4J を広範囲にわたって使用し、 ページやコンポーネントクラスの生成や動作に関する詳細なログを記録します。
ページやコンポーネントのロガー名は、そのクラスの完全修飾クラス名です。そして、log4j.properties 内で設定することができます:
log4j.category.org.apache.tapestry5.integration.app1.pages.MerryChristmas=trace
Logger型のフィールドに @Inject アノテーションを使用することができます。 それによって、ページやコンポーネントのロガーが適切にインジェクトされます。
public class MyPage { @Inject private Logger logger; . . .
コンポーネントのどのメソッドに対しても Log アノテーションが使えます。 DEBUGレベルの場合、メソッドの入り口と出口で(そして、例外が発生した場合にも)ログが記録されます。 ログには、パラメータと戻り値も記録されます。これはデバッグの際、特にイベントハンドラメソッドにはとても便利です。
Tapestryはコンポーネントクラスをロードする時にコード修正を行います。このコード修正で何が行われたのかを調べたくなることがあるでしょう。 コンポーネントの2つ目のロガーとして、クラス名の前に "tapestry.transformer." を付けたロガーがあります。 このロガーが(デバッグレベルの場合)コード修正の結果を記録します。
例:
[DEBUG] MerryChristmas Finished class transformation: InternalClassTransformation[ public org.apache.tapestry5.integration.app1.pages.MerryChristmas extends java.lang.Object implements org.apache.tapestry5.runtime.Component, org.apache.tapestry5.runtime.RenderCommand add default method: public void postRenderCleanup() <default> add default method: public void setupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void beginRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void beforeRenderTemplate(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void afterRenderTemplate(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void beforeRenderBody(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void afterRenderBody(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void afterRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public void cleanupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2) <default> add default method: public boolean handleComponentEvent(org.apache.tapestry5.runtime.ComponentEvent $1) <default> add default method: public org.apache.tapestry5.ComponentResources getComponentResources() <default> add default method: public void containingPageDidLoad() <default> add default method: public void containingPageDidDetach() <default> add default method: public void containingPageDidAttach() <default> add field: protected final org.apache.tapestry5.internal.InternalComponentResources _$resources; replace method: public final org.apache.tapestry5.ComponentResources getComponentResources() return _$resources; add default method: public void render(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.RenderQueue $2) <default> replace method: public void render(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.RenderQueue $2) _$resources.queueRender($2); convert default constructor: initializer(); add constructor: org.apache.tapestry5.integration.app1.pages.MerryChristmas(org.apache.tapestry5.internal.InternalComponentResources $1) { _$resources = $1; initializer(); } ]
これは役に立つでしょうか? たぶん、役立つのはコンポーネントクラスのコード修正チェーンに組み込むコードをあなたが開発するときだけでしょう。 例えば、独自のフィールドアノテーションやメソッドアノテーションを用意する時です。
コンポーネントイベントの発生状況をデバッグすることもできます。コンポーネントのクラス名の前に "tapestry.events." を付けたロガーをデバッグレベルで使うことができます。 そのログには、イベント名、イベントソース、実行されたメソッド名が記録されます。
あるコンポーネントで処理されなかったイベントはそのコンポーネントのコンテナに送られることを覚えていますか; 同じイベントがコンテナのロガーでも記録されます。イベントが発生したコンポーネントを含んでいるページが、ログを記録する最後のステップとなります。
例:
[DEBUG] ActionLink Dispatch event: ComponentEvent[action from (self)] [DEBUG] ActionDemo Dispatch event: ComponentEvent[action from actionlink] [DEBUG] ActionDemo Invoking: org.apache.tapestry5.integration.app1.pages.nested.ActionDemo.onAction(java.lang.Long) (at ActionDemo.java:28) [DEBUG] ActionDemo Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] ActionDemo Invoking: org.apache.tapestry5.integration.app1.pages.nested.ActionDemo.onPassivate() (at ActionDemo.java:38)
ページレンダリングのすべてのステップのデバッグ出力を得られると便利なことがあります。 Tapestryのページレンダリングは、レンダリングコマンドをレンダリングキューに次々と渡していきます(ほとんどのコマンドは別のコマンド群をキューに積み増していきます)。
そのロガーは、ページのクラス名の前に "tapestry.render." を付けたロガーです。
これは、開始タグと終了タグの不一致による例外が発生した場合に特に役立ちます。
このログのほとんどはトレースレベルです。コマンド数と所要時間のログはデバッグレベルです。
. . . [TRACE] ActionDemo Executing: Text[Apache Software Foundation] [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: Text[ ] [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: Text[ ] [TRACE] ActionDemo Executing: Start[http://www.w3.org/1999/xhtml div] [TRACE] ActionDemo Executing: org.apache.tapestry5.internal.services.PageElementFactoryImpl$1@587e3a30 [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: Text[ ] [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: End [TRACE] ActionDemo Executing: AfterRenderTemplate[nested/ActionDemo:border] [TRACE] ActionDemo Executing: AfterRender[nested/ActionDemo:border] [TRACE] ActionDemo Executing: CleanupRender[nested/ActionDemo:border] [TRACE] ActionDemo Executing: org.apache.tapestry5.internal.structure.ComponentPageElementImpl$1@7efc0795 [TRACE] ActionDemo Executing: DTD[name=html; publicId=-//W3C//DTD XHTML 1.0 Strict//EN; systemId=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd] [TRACE] ActionDemo Executing: AfterRenderTemplate[nested/ActionDemo] [TRACE] ActionDemo Executing: AfterRender[nested/ActionDemo] [TRACE] ActionDemo Executing: CleanupRender[nested/ActionDemo] [TRACE] ActionDemo Executing: org.apache.tapestry5.internal.structure.ComponentPageElementImpl$1@7efc0795 [DEBUG] ActionDemo Executed 276 rendering commands (max queue depth: 141) in 0.025 seconds