2012-10-19 64 views
1

我對Web服務世界相當陌生,但具有log4j的知識。使用log4j將日誌發送到Java中的Web服務

我需要實現的功能是將日誌消息發送到Web服務,而不是使用Web服務附加程序發送到文件。

我通過在上搜索來閱讀GoogleWebServiceAppenderlog4j類之一,但我無法驗證這一點。

log4j.appender.CONSOLE=main.WSAppender 
log4j.appender.CONSOLE.endpoint=http://localhost:8080/Logging/services/logging?w‌​sdl 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n 
WSAppender.java extends AppenderSkeleton, can't resolve endpoint, hostname in append()  

if (endpoint == null) { 
    System.out.println("no endpoint set. Check configuration file"); 
    System.out.println("[" + hostname + "] " + this.layout.format(event)); 
    return; 
} 
+0

到目前爲止,您有沒有嘗試使用過的任何代碼?如果你需要一些幫助,你將需要首先展示一些研究。使用一些代碼,它會給我們一些地方開始,而不是爲你實現這個。告訴我們你卡在哪裏。你唯一的另一個希望是,如果有人出現,誰知道這裏面和外面,並願意發佈一個完整的解決方案。祝你好運! – jmort253

+0

你好,你對克雷格的評論讓我覺得你應該一次採取這一步。你收到什麼錯誤信息?你在資源鏈接中獲得了多少?你提供的細節越多,幫助就越容易,而且你會得到更好的答案。希望這可以幫助! – jmort253

+0

我猜測log4j.properties文件沒有被拾取,我在eclipse中使用了axis2實現,並且可以看到已經存在的文件。所以我在上面添加了它。基本上端點需要從某個地方挑選,因爲錯誤消息顯而易見,「端點」無法解析爲變量 –

回答

6

當你擴展類AppenderSkeleton我假設你應該初始化你應該覆蓋public void activateOptions()方法的webservice類。我寫過DatabaseAppender和JmsAppender log4j記錄器,我總是發現我必須初始化db連接或jms連接,或者在你的情況下使用public void activateOptions()方法中的webservice屬性。

然後像往常一樣在append(LoggingEvent)方法,你只需調用web服務。

我可能會建議實施一個BlockingQueue來存儲所有的LoggingEvent對象,這樣如果您收到日誌消息的涌入,它們將排隊並異步發送到Web服務。

更新到包括模板的Log4j類

嘗試使用下面的模板。我在重要部分添加了評論。基本上在activateOptions和processEvent方法是你初始化你的「連接」併發送你的事件對象的地方。可以是DB,JMS,WebService等等。

package mypackage; 

     import java.util.concurrent.BlockingQueue; 
     import java.util.concurrent.LinkedBlockingQueue; 
     import java.util.concurrent.TimeUnit; 
     import org.apache.log4j.AppenderSkeleton; 
     import org.apache.log4j.helpers.LogLog; 
     import org.apache.log4j.spi.LoggingEvent; 

     public class WebServiceAppender extends AppenderSkeleton { 

      private static final BlockingQueue<LoggingEvent> loggingEventQueue = new LinkedBlockingQueue<LoggingEvent>(); 
      private static WebServiceAppender instance; 
      private static Thread thread = null; 

      //Your custom properties for your web service 

      private String property1; 
      private String property2; 
      private String property3; 

      static { 
       thread = new Thread(new Runnable() { 
        public void run() { 
         processQueue(); 
        } 
       }); 

       thread.setDaemon(true); 
       thread.start(); 
      } 

      private static void processQueue() { 
       while(true) { 
        try { 
         LoggingEvent event = loggingEventQueue.poll(1L, TimeUnit.SECONDS); 
         if (event != null) { 
          instance.processEvent(event); 
         } 
        } 
        catch(InterruptedException e) { 
         // No operations. 
        } 
       } 
      } 

      private final void processEvent(LoggingEvent loggingEvent) { 
       if(loggingEvent != null) { 
        //Send the loggingEvent object or you can 
        //get data out of it and package it in another 
        //java class and send that, to your web service. 

        //Web Service is invoked here 
       } 
      } 

      public synchronized void close() { 
       // The synchronized modifier avoids concurrent append and close operations 

        if(this.closed) { 
         return; 
       } 

       closeWS(); 
       thread.interrupt(); 

       LogLog.debug("Closing appender [" + name + "]."); 
       this.closed = true; 
      } 

      private void closeWS() { 
       try { 
        //Close the webservice connection 
        //or whatever here. 
       } 
       catch(Exception ex) { 
        LogLog.error("Error while closing WebServiceAppender [" + name + "].", ex); 
       } 
      } 

      public boolean requiresLayout() { 
       //Does not need a layout because 
       //we are sending serialized events 
       //to an external source 
       return false; 
      } 

      @Override 
      public void activateOptions() { 
       instance = this; 
       try { 
        LogLog.debug("Getting web service properties."); 

        if(property1 != null) { 
         //Do something with your property 
        } 

        if(property2 != null) { 
         //Do something with your property 
        } 

        if(property3 != null) { 
         //Do something with your property 
        } 

        //Initialize your web-service connection and objects here 
        LogLog.debug("Web Service created."); 
       } 
       catch(Exception ex) { 
        LogLog.error("Error while activating options for WebServiceAppender [" + name + "].", ex); 
       } 
      } 

      /* 
      * These methods are set from the log4j properties file like: 
      * log4j.appender.WS=mypackage.WebServiceAppender 
      * log4j.appender.WS.property1=bla 
      * log4j.appender.WS.property2=ble 
      * log4j.appender.WS.property3=blo 
      */ 

      public final String getProperty1() { 
       return property1; 
      } 

      public final String getProperty2() { 
       return property2; 
      } 

      public final String getProperty3() { 
       return property3; 
      } 

      public final void setProperty1(String property1) { 
       this.property1 = property1; 
      } 

      public final void setProperty2(String property2) { 
       this.property2 = property2; 
      } 

      public final void setProperty3(String property3) { 
       this.property3 = property3; 
      } 

      @Override 
      protected void append(LoggingEvent event) { 
       loggingEventQueue.add(event); 
      } 

      @Override 
      public void finalize() { 
       close(); 
       super.finalize(); 
      } 
     } 
+0

這有幫助,但我是Queue的新手,會嘗試學習並實施您的建議。另外我想知道'JMSAppender'是否可用於將日誌發送到Web服務 –

+0

可能不是,JMSAppender只是通過JMS連接將日誌發送到JMS主題。如果你想我可以更新我的答案,幷包括代碼與存根(stub)來製作一個自定義的appender。 –

+0

非常感謝代碼,這將幫助我快速構建應用程序! –

2

我建議你看看這篇文章:http://www.ibm.com/developerworks/webservices/library/ws-log4j/index.html

它詳細說明如何使用的WebServiceAppender。

啊,Google!

+0

感謝@craigmj,我首先檢查了這篇文章,但我感到困惑,因爲有代碼片段,而且我正在迷失,因爲我把所有的東西放在哪裏 –

+0

嗨克雷格,雖然這個鏈接可能會有所幫助,但如果鏈接斷裂,你的答案將毫無用處。堆棧溢出的最佳答案包含的例子和解釋不僅有助於原始提問者,而且還有助於未來很多未來的訪問者。請考慮製作一個[編輯]來改進你的答案。這不僅能夠幫助其他人,還能讓你獲得更多讚賞!祝你好運!:) – jmort253

+0

嗨@ jmort253,這是一個很好的觀點。但是很少複製整個DeveloperWorks文章,人們會如何解決這個問題? (因爲在這種情況下,DW文章是相當詳細的...) – craigmj

相關問題