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

xz43發表於2015-11-02

背景

    在分散式系統當中,我們有各種各樣的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各種模式的具體部署配置方法,在這不再介紹有興趣可以查下資料。此外在面對海量資料時,還有很多針對性較強的叢集方案,希望有經驗的朋友介紹一下。

相關文章