JSR-047 和共同記載支援

「日誌和追蹤分析器」為以下日誌記載公用程式新的和現有的使用者,提供了獨立式和外掛程式支援:

這個支援的詳細資料如下:

  1. 將日誌訊息匯出到日誌記載代理程式的功能
    org.eclipse.hyades.logging.java 套件下,java.util.logging.Handler 抽象類別的延伸可讓日誌程式配置成將日誌訊息匯出到「日誌記載代理程式」。
    這個 org.eclipse.hyades.logging.java.LoggingAgentHandler 處理常式會根據處理常式的過濾器和日誌記載層次, 來檢查是否可記載已寫入日誌程式的 java.util.logging.LogRecord 日誌訊息。如果要記載這個日誌訊息, 系統會建立一個「日誌記載代理程式」,其名稱與記載該訊息的日誌程式相同。該訊息會利用 org.eclipse.hyades.logging.java.XmlFormatter 來格式化,並寫入這個「日誌記載代理程式」中。
     
  2. 將日誌訊息轉換成 XML 的功能
    org.eclipse.hyades.logging.java 套件下,java.util.logging.Formatter 抽象類別的延伸可讓 org.eclipse.hyades.logging.java.LoggingAgentHandler 和其他處理常式將 java.util.logging.LogRecord 日誌訊息格式化成 XML。這個 org.eclipse.hyades.logging.java.XmlFormatter 格式製作程式會將 java.util.logging.LogRecord 訊息轉換成現行 org.eclipse.hyades.internal.logging.core.XmlGenerator 實作的 XML 對等項目,但排除掉 host、process 和 agent 等標籤。所產生的 XML 並未格式化,且巢狀層次上限設為 4。在進行格式化時,系統會檢查該物件是否實作 org.eclipse.hyades.logging.core.IExternalizableToXml 介面。如果是這樣的話,基於效能內部檢查的理由,系統會呼叫 externalizeCanonicalXmlString() API 來代替 XML 序列化。

    下列輸出說明日誌訊息("Hello World" 字串(「嚴重」日誌記載層次))的 XML 轉換:
       <LogRecord logging.util.id="java.util.logging.LogRecord_10468105484720000" 
       logging.util.agent_idref="org.eclipse.hyades.tests.java.JavaLoggingTest" 
       logging.util.MsgLoggerLevel="SEVERE" LoggerName="org.eclipse.hyades.tests.java.JavaLoggingTest" 
       ResourceBundleName="null" SequenceNumber="0" SourceClassName="org.eclipse.hyades.tests.java.JavaLoggingTest" 
       SourceMethodName="main" Message="Hello World" ThreadID="10" 
       Millis="1046810548171">
       	<ResourceBundle Instance_Name="ResourceBundle" Value="null"/>
    	<Level Instance_Name="Level" logging.util.id="java.util.logging.Level_10468105484720001"  
       		ResourceBundleName="sun.util.logging.resources.logging" Name="SEVERE" 
       		LocalizedName="SEVERE"><Class Instance_Name="Class" logging.util.id="java.lang.Class_10468105484720002" 
       		Name="java.util.logging.Level" Type="class" Package="java.util.logging" 
       		Modifers="public" Superclass="java.lang.Object" />
       	</Level>
       	<Array Instance_Name="Parameters" Value="null" />
    	<Throwable Instance_Name="Thrown" Value="null" />
    	<Class Instance_Name="Class" logging.util.id="java.lang.Class_10468105484820000" 
    	   Name="java.util.logging.LogRecord" Type="class" Package="java.util.logging" 
    	   Modifers="public" Superclass="java.lang.Object" />
      </LogRecord>

  3. 將繼承類別引導到現有的「Java 日誌記載 API」的功能
    如果要將 org.eclipse.hyades.logging.java14 繼承類別引導到 JDK 1.4.0 和以上版本的現有「Java 日誌記載 API」,您必須先將下列項目加入 JRE_HOME\lib\logging.properties 配置檔中,才能啟動 VM 或呼叫 java.util.logging.LogManager.readConfiguration() API:
    handlers= <your current handlers>, org.eclipse.hyades.logging.java.LoggingAgentHandler
    org.eclipse.hyades.logging.java.LoggingAgentHandler.formatter = org.eclipse.hyades.logging.java.XmlFormatter
    
     

    另外,您可以在執行時期分別利用 addHandler()setFormatter() API, 於 Logger(例如:處理常式)和 Handler(例如:格式製作程式)中以程式化的方式將 org.eclipse.hyades.logging.java14 外掛程式繼承類別搭配 JDK 1.4.0 和以上版本的現有「Java 日誌記載 API」一起使用。
     

  4. 將 Common Base Event 併入日誌記錄的功能
    org.eclipse.hyades.logging.java 套件下,java.util.logging.LogRecord 類別的延伸可讓您建立自訂的日誌記錄,以將 org.eclipse.hyades.logging.events.ICommonBaseEvent 併入 java.util.logging.LogRecord 中。

    這個 org.eclipse.hyades.logging.java.CommonBaseEventLogRecord 只是繼承了 java.util.logging.LogRecord,且包含 org.eclipse.hyades.logging.events.ICommonBaseEvent 的單一參照。您要負責在寫入 java.util.logging.Logger 之前, 先建立新的 org.eclipse.hyades.logging.java.CommonBaseEventLogRecord 物件。
     
  5. 允許過濾已記載的記錄並避免處理常式類別處理這些記錄的功能
    您可以設定 java.util.logging.Filter 介面的實作(如 org.eclipse.hyades.logging.java.CommonBaseEventFilter,僅准許順利記載 org.eclipse.hyades.logging.java.CommonBaseEventLogRecord )並在處理常式中記錄 java.util.logging.Level, 來過濾已記載的記錄並避免 org.eclipse.hyades.logging.java.LoggingAgentHandler 類別處理這些記錄。這些值可以在執行時期,分別利用 setFilter() and setLevel() API 以程式化的方式來設定。

    另外,您可以在啟動 VM 或呼叫 java.util.logging.LogManager.readConfiguration() API 之前,先將下列項目加入 JRE_HOME\lib\logging.properties 配置檔中:
    org.eclipse.hyades.logging.java.LoggingAgentHandler.level = <level>
    org.eclipse.hyades.logging.java.LoggingAgentHandler.filter = org.eclipse.hyades.logging.java.CommonBaseEventFilter
    
       
  6. 建立 java.lang.Objectjava.lang.Throwable 之自訂日誌程式的功能
    org.eclipse.hyades.logging.commons 套件下,org.apache.commons.logging.Log 介面的實作可讓您建立自訂的日誌程式,用以將 java.lang.Object java.lang.Throwable 記載到和日誌程式同名的「日誌記載代理程式」中。
    這個 org.eclipse.hyades.logging.commons.Logger 會根據日誌程式的日誌記載層次,來檢查是否可記載已寫入日誌程式的 java.lang.Object 和/或 java.lang.Throwable 日誌訊息。如果要記載日誌訊息,java.lang.Objectjava.lang.Throwable 日誌訊息會利用 org.eclipse.hyades.internal.logging.core.XmlGenerator 格式化,並寫入「日誌記載代理程式」中。在進行格式化時,系統會檢查該物件是否實作 org.eclipse.hyades.logging.core.IExternalizableToXml 介面。如果是這樣的話,基於效能內部檢查的理由,系統會呼叫 externalizeCanonicalXmlString() API 來代替 XML 序列化。如果要將 org.eclipse.hyades.logging.commons.Logger 類別引導到 org.apache.commons.logging.LogFactory 類別,您必須在 VM 啟動時設定下列系統內容:
    -Dorg.apache.commons.logging.Log=org.eclipse.hyades.logging.commons.Logger

預防措施

  1. 如果您記載了字串日誌訊息,您不可在訊息中內嵌 XML 片段。如果您在日誌訊息中內嵌 XML 片段,XML 內容會被正規化, 並加入 string 標籤的 value 屬性的值中。比方說,
    <String >logging.util.agent_idref>=>"AGENT_CREATE.LoggingUtilSample 
       logger.1045075846.538" >logging.util.MsgLoggerLevel>=>"FINEST"
       >Value>=>"&lt;tag attribute=&quot;value&quot;/&gt;">/>>
  2. 如果您使用了 com.ibm.etools.logging.util 獨立式日誌記載公用程式, 您必須將 hlcore.jar、hparse.jar、hexl.jar 和 hexr.jar 等 JAR 檔的路徑加入系統和 VM 類別路徑中。

 

相關概念
Common Base Event 模型

 

(C) Copyright IBM Corporation 2000, 2003. All Rights Reserved.