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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1821136/,如需轉載,請註明出處,否則將追究法律責任。

相關文章