利用log4j+mongodb實現分布式系統中日志統一管理


背景

    在分布式系統當中,我們有各種各樣的WebService,這些服務可能分別部署在不同的服務器上,並且有各自的日志輸出。為了方便對這些日志進行統一管理和分析。我們可以將日志統一輸出到指定的數據庫系統中,而再由日志分析系統去管理。而這個儲存日志的數據庫目前最適合的還是mongodb,一是因為它輕便、簡單,與log4j整合方便,對系統的侵入性低。二是因為它與大型的關系型數據庫相比有不少優勢,比如查詢快速、儲存結構(json)利於擴展、免費等。

image

log4j與mongodb整合

1、首先安裝mongodb數據庫,具體安裝方法請百度;

2、在你的應用程序中引用以下類庫:

Mongo Java driver jar包 下載
Log4J jar包 注意版本,一定要1.2.16及以上。下載
log4mongo-java jar包 下載

3、在你的web項目中創建log4j.properties文件。

4、配置log4j.properties文件,使之整合mongodb:

   1:  log4j.rootLogger=INFO,stdout,MongoDB
   2:   
   3:  log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
   4:  log4j.appender.MongoDB.databaseName=logs
   5:  log4j.appender.MongoDB.collectionName=log
   6:  log4j.appender.MongoDB.hostname=ubuntu
   7:  log4j.appender.MongoDB.port=27017
   8:   
   9:  log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  10:  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  11:  log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

5、配置應用的日志輸出格式:

   1:  log4j.logger.com.cnblogs.leefreeman.servlet=INFO,action
   2:  log4j.appender.action.Threshold = INFO
   3:  log4j.appender.action=org.apache.log4j.DailyRollingFileAppender
   4:  log4j.appender.action.encoding=utf8
   5:  log4j.appender.action.File=/opt/logs/action.log
   6:  log4j.appender.action.DatePattern  =  '_'yyyy-MM-dd'.log'
   7:  log4j.appender.action.layout=org.apache.log4j.PatternLayout
   8:  log4j.appender.action.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

6、在應用程序中使用日志:

   1:  public class IndexServlet extends HttpServlet {
   2:      private static Logger logger = Logger.getLogger(IndexServlet.class);
   3:      private static final long serialVersionUID = -5244922269946905057L;
   4:   
   5:      @Override
   6:      protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   7:              throws ServletException, IOException {
   8:          logger.info("hello log4j+mongodb");
   9:          PrintWriter out = resp.getWriter();
  10:          out.print("hello world");
  11:          out.flush();  
  12:          out.close(); 
  13:      }
  14:  }

7、通過Mongodb客戶端系統,查看日志情況:

image

日志成功寫入mongdb數據庫,可以看到在數據庫中日志的結構相當清晰。

使用日志系統管理mongodb的日志

可以開發一個日志系統連接mongodb數據庫,進行日志數據的管理和分析。你也可以使用mongodb目前有的一些Web客戶端來管理,下面介紹兩個mongodb常用的Web客戶端:

mongovision:使用extjs作為前端,體驗較好,但需要java7。

image

 

rock_mongo:基於php的MongoDB管理工具。

image

mongodb的部署方式

在我們數據量不是太大的情況下,並且日志數據的重要性不是太強的時候,我們可以快速搭建出最簡單的mongodb單實例模式,來儲存日志數據。這種方式最簡單最快速。

image

當我們考慮到安全、災備等因素時,我們一般可以考慮主-從模式搭建mongodb服務器。

image

采用主-從模式后主節點掛掉了后從節點可以接替主機繼續服務。這種模式比單節點的高可用性要好很多。

如果有一天數據越來越多,你發現mongodb處理它們越來越吃力,你就得想辦法怎么讓它減壓。一般的做法是,部署多個從節點,來分擔主節點壓力。在這里我們可以想到Mysql的讀寫方案,同樣也適合Mongodb。

image

你可以讓主節點用於寫入,而從節點用於讀操作(根據你的應用讀和寫操作的比例來分配)。這樣讀寫分離,主從分擔數據庫操作壓力。

關於mongodb各種模式的具體部署配置方法,在這不再介紹有興趣可以查下資料。此外在面對海量數據時,還有很多針對性較強的集群方案,希望有經驗的朋友介紹一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM