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(注意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 组件(我最初确实错过了一些),它们可以很容易地添加到 spring 配置中。

于 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 回答