阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

<code>背景/<code>

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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:

<code>                                                                           log4j.rootLogger=INFO,stdout,MongoDB
 
log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.databaseName=logs
log4j.appender.MongoDB.collectionName=log
log4j.appender.MongoDB.hostname=ubuntu
log4j.appender.MongoDB.port=27017
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n/<code>

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

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

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

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

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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

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

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

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

mongodb的部署方式

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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

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

阿里java第二面:利用log4j+mongodb實現分佈式系統中日誌統一管理

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

注意注意:以上分享的mongodb各種模式的具體部署配置方法,如果你想要一起學習轉發後關注我私信【資料】免費領取吧


分享到:


相關文章: