1

JSF 2(MyFaces with Faceletsページ)アプリケーションをまもなく本番環境に移行する準備をしています。現在、コンソールログ(WebSphere v8のSystemOut.log)は、次のような種類のメッセージでいっぱいになっています。

[3/26/13 16:42:33:744 CDT] 00000031 HtmlImageRend W   Component UIGraphic Form:errorIconSave has no attribute alt or attribute resolves to null. Path to component {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /view/groupagreement/products/volumebased/VolumeBasedProducts.xhtml][Class: javax.faces.component.html.HtmlBody,Id: commonLayoutId][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id1364021679_785179b][Class: javax.faces.component.html.HtmlForm,Id: Form][Class: javax.faces.component.html.HtmlBody,Id: j_id363369746_1d362e8b][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id363369746_1d362e61][Class: org.richfaces.component.UIRegion,Id: j_id363369746_1d362e4a][Class: org.richfaces.component.UIPopupPanel,Id: confirmationPopUpForWayFinder][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id363369746_1d362ffd][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id363369746_1d362fbc][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id363369746_1d362f9a][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id363369746_1d362f70][Class: javax.faces.component.html.HtmlGraphicImage,Id: errorIconSave]}
[3/26/13 16:42:33:746 CDT] 00000031 HtmlResponseW W   HTML nesting warning on closing div: element td rendered by component : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /view/groupagreement/products/volumebased/VolumeBasedProducts.xhtml][Class: javax.faces.component.html.HtmlBody,Id: commonLayoutId][Class: javax.faces.component.html.HtmlPanelGrid,Id: j_id1364021679_785179b]} not explicitly closed

この過剰なロギングはパフォーマンスを低下させる可能性があると感じています。アプリケーションをHTML仕様に適切にコーディングする必要があることは理解していますが、それはオフショアベンダーによって提供されたものであり、コードの品質を希望するほど制御することはできませんでした。この時点では、おそらくすべてのxhtmlファイルを修正する時間はありません(画像にalt属性を追加するなど)。

このロギングを無効にする方法はありますか?たとえば、web.xmlコンテキストパラメータ?MyFacesのドキュメントには何も見つかりませんでした。

4

2 に答える 2

2

私はこれを自分で解決することができました。

これらの警告を生成していたMyFacesコンポーネントのソースコードを調べました(たとえば、HtmlResponseWriterImplのgrepcodeソースリンク)。ソースから、これらの警告を出力する前にチェックされている他の構成パラメーターがないことはかなり明白です。しかしもちろん、java.util.loggingレベルチェックされています。したがって、解決策は、これらのコンポーネントからの警告を抑制するようにjava.util.logging(別名julまたはjdkロギング)を構成することです。

WebSphereインスタンスでjdkロギング構成ファイルを構成しようとした可能性がありますが、これは、実稼働環境(共有インフラストラクチャ、ロックダウンされたサーバー)でデプロイおよび管理するためのはるかに難しい変更です。そのため、Javaソリューションを使用することになりました。これはSpring Beanとして登録するクラスであり、そのinitメソッドは、提供されるロガー名のログレベルを変更します。

<bean id="setJdkLoggingToSevere" class="ca.mycompany.myapp.util.JdkLoggingLevelConfigurer" init-method="init">
    <property name="level" value="SEVERE" />
    <property name="loggerNames">
        <list>
            <value>org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl</value>
            <value>org.apache.myfaces.renderkit.html.HtmlImageRenderer</value>
            <value>org.apache.myfaces.renderkit.html.ext.HtmlImageRenderer</value>
            <value>org.apache.myfaces.shared.renderkit.html.HtmlImageRendererBase</value>
            <value>org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlImageRendererBase</value>
            <value>org.apache.myfaces.renderkit.html.HtmlLabelRenderer</value>
            <value>org.apache.myfaces.renderkit.html.HtmlGridRenderer</value>
            <value>org.apache.myfaces.renderkit.html.ext.HtmlGridRenderer</value>
            <value>org.apache.myfaces.shared.renderkit.html.HtmlGridRendererBase</value>
            <value>org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlGridRendererBase</value>
            <value>org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils</value>
            <value>org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils</value>
        </list>
    </property>
</bean>

これが私のJdkLoggingLevelConfigurerクラスの関連するメソッドです(myLoggerslf4jは私のアプリケーションのロギングフレームワークであるため、注はslf4jロガーです):

public void init() {
    if (this.getLoggerNames() != null) {

        Level level = Level.parse(this.getLevel());

        for (String loggerName : loggerNames) {
            Logger logger = Logger.getLogger(loggerName);
            if (logger != null) {
                myLogger.info("setting jdk logging for {} to {}", loggerName, level);
                logger.setLevel(level);
                this.loggers.add(logger);
            }
            else {
                myLogger.warn("unable to set jdk logging for {} to {} because logger was null",
                        loggerName, this.getLevel());
            }
        }
    }
}

上記を実行すると、警告メッセージは表示されなくなります。また、警告を発するmyfacesコンポーネントを見逃した場合(最初はいくつか見逃していました)、それらをスプリング構成に簡単に追加できます。

于 2013-04-03T02:36:08.370 に答える
0

HtmlImageRendererBaseではJULロガーが使用されるため、次の行を含むファイルlogging.propertiesをクラスパスに追加するだけです。

org.apache.myfaces.shared.renderkit.html.HtmlImageRendererBase.level = SEVERE
于 2013-10-07T14:05:44.840 に答える