2013-03-26 77 views
1

我們正在準備將我們的JSF 2(MyFaces with Facelets頁面)應用程序移至生產環境。目前,我們的控制檯日誌(在WebSphere V8 SystemOut.log中)與大量的這類消息的填充:如何抑制MyFaces控制檯的html警告?

[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

我應該注意到,我們使用的是SLF4J使用log4j的實現。爲了控制MyFaces日誌記錄,我們需要根據[這個myfaces問題]中的一些答案將java.util.logging重定向到slf4j(http://stackoverflow.com/questions/8012595/tomcat-logging-with- SLF4J-和log4j的)? – 2013-03-26 22:04:57

+0

在進一步調查中,SLF4J的jul-to-slf4j橋看起來並不是我們想要的,因爲即使日誌記錄關閉,它也會影響性能。 (請參閱此處的[性能說明](http://www.slf4j.org/legacy.html#jul-to-slf4j)) – 2013-03-27 16:08:27

回答

2

我能夠自己解決這個問題。

我查看了產生這些警告的MyFaces組件的源代碼(e.g. grepcode source link for HtmlResponseWriterImpl)。從源代碼可以看出,在打印這些警告之前,沒有其他配置參數被檢查。但是當然,java.util.logging級別被檢查。因此,解決方案只需配置java.util.logging(又名jul或jdk日誌記錄)來抑制這些組件的警告。

我本可以嘗試在我們的WebSphere實例中配置jdk日誌記錄配置文件,但這在我們的生產環境(共享基礎架構,鎖定服務器)中部署&更加困難。所以我結束了使用Java的解決方案 - 這是我註冊爲一個Spring bean類,它的init方法改變logger名稱的日誌記錄級別它提供:

<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組件(我最初確實錯過了一些),它們可以很容易地添加到彈簧配置中。

0

在HtmlImageRendererBase的JUL記錄器的使用,所以一個簡單的文件添加logging.properties到類路徑中包括以下行:

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

在共享服務器上「向類路徑添加文件」不一定非常簡單聲音。它會將文件包含在我的WAR的WEB-INF/classes目錄中嗎?如果是這樣,那將不會與服務器上的其他應用程序發生衝突,並且會是一個很好的解決方案。 (當然,我需要添加幾行到logging.properties - 根據我的解決方案下面的許多Renderer類。) – 2013-10-08 14:16:07

+0

好吧,理解:在我的環境中,將此條目添加到日誌記錄中就足夠了。在WEB-INF/classes中的屬性 - 但我不知道這是否會在共享服務器中工作。 – 2013-10-09 15:11:08