我们正准备尽快将我们的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文档中找不到任何内容。
答案 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