如何抑制MyFaces控制台的html警告?

时间:2013-03-26 21:56:18

标签: jsf-2 facelets myfaces

我们正准备尽快将我们的JSF 2(MyFaces with Facelets页面)应用程序移至Production。目前,我们的控制台日志(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文档中找不到任何内容。

2 个答案:

答案 0 :(得分:2)

我自己能够解决这个问题。

我查看了生成这些警告的MyFaces组件的源代码(e.g. grepcode source link for HtmlResponseWriterImpl)。从源头来看,很明显在打印这些警告之前没有检查其他配置参数。但是当然正在检查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类的相关方法(注意myLogger是一个slf4j记录器,因为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组件(我最初确实错过了一些),它们很容易被添加到弹簧配置中。

答案 1 :(得分:0)

在HtmlImageRendererBase中使用JUL记录器,只需将文件 logging.properties 添加到类路径中,包括以下行:

org.apache.myfaces.shared.renderkit.html.HtmlImageRendererBase.level = SEVERE