真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志

這篇文章主要介紹“如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志”,在日常操作中,相信很多人在如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站專注于芒市企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城建設(shè)。芒市網(wǎng)站建設(shè)公司,為芒市等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

我的團(tuán)隊(duì)和我正在創(chuàng)建一個(gè)由一組RESTful JSON服務(wù)組成的服務(wù)平臺(tái),該平臺(tái)中的每個(gè)服務(wù)在平臺(tái)中的作用就是分別提供一些獨(dú)特的功能和/或數(shù)據(jù)。由于平臺(tái)中產(chǎn)生的日志四散各處,所以我們想,要是能將這些日志集中化處理一下,并提供一個(gè)能夠讓我們查看、過(guò)濾、排序和搜索我們所有的日志的基本型的日常查看工具就好了。我們還想讓我們的日志是異步式的,因?yàn)槲覀兛刹幌朐趯懭罩镜臅r(shí)候(比方說(shuō),可能會(huì)將日志直接寫入數(shù)據(jù)庫(kù)),讓我們提供的服務(wù)因?yàn)閷懭罩径鴷簳r(shí)被阻擋住。

如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志

實(shí)現(xiàn)這個(gè)目標(biāo)的策略非常簡(jiǎn)單明了。

  1. 安裝ActiveMQ

  2. 創(chuàng)建一個(gè)log4j的日志追加器,將日志寫入隊(duì)列(log4j自帶了一個(gè)這樣的追加器,不過(guò)現(xiàn)在讓我們自己來(lái)寫一個(gè)吧。) 

  3. 寫一個(gè)消息偵聽器,從MQ

    第37行:log4j將一個(gè)LoggingEvent對(duì)象作為參數(shù)對(duì)append方法進(jìn)行調(diào)用,這個(gè)LoggingEvent對(duì)象表示了對(duì)logger的一次調(diào)用,它封裝了每一個(gè)日志項(xiàng)的所有信息。

    第41和42行:將指向JMS的uri作為參數(shù),創(chuàng)建一個(gè)連接工廠對(duì)象,在我們的情況下,該uri指向的是我們的ActiveMQ服務(wù)器。

    第45, 46和49行: 我們同JMS服務(wù)器建立一個(gè)連接和會(huì)話。會(huì)話有多種打開模式。在Auto_Acknowledge模式的會(huì)話中,消息的應(yīng)答會(huì)自動(dòng)發(fā)生。Client_Acknowledge 模式下,客戶端需要對(duì)消息的接收和/或處理進(jìn)行顯式地應(yīng)答。另外還有兩種其它的模式。有關(guān)細(xì)節(jié),請(qǐng)參考文檔http://download.oracle.com/javaee/1.4/api/javax/jms/Session.html

    第52行: 創(chuàng)建一個(gè)隊(duì)列。將隊(duì)列的名字作為參數(shù)發(fā)送給連接

    下面讓我們看看這里面發(fā)生了什么事情。

    第19行:We我們實(shí)現(xiàn)了的Log4J日志追加器接口,該接口要求我們實(shí)現(xiàn)三個(gè)方法:requiresLayout, closeappend。我們將暫時(shí)簡(jiǎn)化處理過(guò)程,實(shí)現(xiàn)所需的append方法。在對(duì)logger進(jìn)行調(diào)用時(shí)這個(gè)方法就會(huì)被調(diào)用。

    第56行: 我們將發(fā)送模式設(shè)置為Non_Persistent。另一個(gè)可選的模式是Persistent ,在這種模式下,消息會(huì)持久化到一個(gè)持久性存儲(chǔ)系統(tǒng)中。持久化模式會(huì)降低系統(tǒng)速度,但能增加了消息傳遞的可靠性。

    第58行: 這行我們做了很多事。首先我將一個(gè)LoggingEvent對(duì)象封裝到了一個(gè)LoggingEventWrapper對(duì)象之中。這么做是因?yàn)?em>LoggingEvent對(duì)象有一些屬性不支持序列化,另外還有一個(gè)原因是我想記錄一些額外的信息,比如IP地址和主機(jī)名。接下來(lái),使用JMS的會(huì)話對(duì)象,我們把一個(gè)對(duì)象(LoggingEventWrapper對(duì)象)做好了發(fā)送前的準(zhǔn)備。

    第61行: 我將該對(duì)象發(fā)送到了隊(duì)列中。

    下面所示是LoggingEventWrapper的代碼。

    import java.io.Serializable;  import java.net.InetAddress;  import java.net.UnknownHostException;   import org.apache.log4j.EnhancedPatternLayout;  import org.apache.log4j.spi.LoggingEvent;   /**   * Logging Event Wraps a log4j LoggingEvent object. Wrapping is required by some information is lost   * when the LoggingEvent is serialized. The idea is to extract all information required from the LoggingEvent   * object, place it in the wrapper and then serialize the LoggingEventWrapper. This way all required data remains   * available to us.   * @author faheem   *   */  public class LoggingEventWrapper implements Serializable{       private static final String ENHANCED_PATTERN_LAYOUT = "%throwable";      private static final long serialVersionUID = 3281981073249085474L;      private LoggingEvent loggingEvent;       private Long timeStamp;      private String level;      private String logger;      private String message;      private String detail;      private String ipAddress;      private String hostName;       public LoggingEventWrapper(LoggingEvent loggingEvent){          this.loggingEvent = loggingEvent;           //Format event and set detail field          EnhancedPatternLayout layout = new EnhancedPatternLayout();          layout.setConversionPattern(ENHANCED_PATTERN_LAYOUT);          this.detail = layout.format(this.loggingEvent);      }       public Long getTimeStamp() {          return this.loggingEvent.timeStamp;      }       public String getLevel() {          return this.loggingEvent.getLevel().toString();      }       public String getLogger() {          return this.loggingEvent.getLoggerName();      }       public String getMessage() {          return this.loggingEvent.getRenderedMessage();      }       public String getDetail() {          return this.detail;      }       public LoggingEvent getLoggingEvent() {          return loggingEvent;      }       public String getIpAddress() {          try {              return InetAddress.getLocalHost().getHostAddress();          } catch (UnknownHostException e) {              return "Could not determine IP";          }      }       public String getHostName() {          try {              return InetAddress.getLocalHost().getHostName();          } catch (UnknownHostException e) {              return "Could not determine Host Name";          }      }  }

    消息偵聽器

    消息偵聽器會(huì)對(duì)隊(duì)列(或話題)進(jìn)行“偵聽”。一旦有新消息添加到了隊(duì)列中,onMessage 方法就會(huì)得到調(diào)用。

    import javax.jms.JMSException;  import javax.jms.Message;  import javax.jms.MessageListener;  import javax.jms.ObjectMessage;   import org.apache.log4j.Logger;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Component;   @Component public class LogQueueListener implements MessageListener  {      public static Logger logger = Logger.getLogger(LogQueueListener.class);       @Autowired     private ILoggingService loggingService;       public void onMessage( final Message message )      {          if ( message instanceof ObjectMessage )          {              try{                  final LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)((ObjectMessage) message).getObject();                  loggingService.saveLog(loggingEventWrapper);              }              catch (final JMSException e)              {                  logger.error(e.getMessage(), e);              } catch (Exception e) {              logger.error(e.getMessage(),e);          }          }      }  }

    第23行: 檢查從隊(duì)列中拿到的對(duì)象是否是ObjectMessage的實(shí)例

    第26行: 從消息中提取出LoggingEventWrapper對(duì)象

    第27行:調(diào)用服務(wù)方法將日志持久化

    Spring配置

                                                               

    第5到9行: 使用代理標(biāo)簽建立一個(gè)嵌入式消息代理。既然我用的是外部消息代理,所以我就不需要它了。

    第12行: 給出你想要連接的隊(duì)列的名字

    第14行: 代理服務(wù)器的URI

    15到19行:連接工廠的設(shè)置

    26到28行:消息偵聽器的設(shè)置,這里可以指定用于從隊(duì)列中讀取消息的并發(fā)現(xiàn)線程的個(gè)數(shù)

    當(dāng)然,上面的例子做不到讓你能夠拿來(lái)就用。你還需要包含所有的JMS依賴庫(kù)并實(shí)現(xiàn)完成日志持久化任務(wù)的服務(wù)。但是,我希望本文能夠?yàn)槟闾峁┮粋€(gè)相當(dāng)不錯(cuò)的思路。

    到此,關(guān)于“如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


    網(wǎng)站名稱:如何使用Log4j、ActiveMQ和Spring實(shí)現(xiàn)異步日志
    網(wǎng)站鏈接:
    http://weahome.cn/article/psdehj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部