1. 介紹
LogSearch是一個內建在HDP的釋出包的日志監控工具,它分為兩個部分:logsearch portal(下面簡稱為portal)與 logsearch logfeeder(簡稱為logfeeder) 。LogSearch依賴于Solr(在ambari上,它的名字叫Ambari Infra) 。其工作流程:
logfeeder監控相應的日志檔案,并将它們存儲到Solr中,使用者可以通過portal查詢各個元件的日志。
它滿足了我們大數多人對于日志的要求,如:分時段統計, 各個告警級别統計, 圖表展示, 使用者登入資訊統計等。
相對于ELK來說,使用HDP的使用者,配置就相當簡單了。沒有代碼開發量
2. 準備
在這個例子,我們以LogTest這個元件為例,展示将logTest這個元件的日志是如何加入到logsearch中。
2.1 代碼準備
我們的服務名為LogTest, 它的代碼也很簡單,就是不斷的生成日志。其代碼如下:
package com.test.logtest;
import org.apache.log4j.Logger;
public class LogTestMain {
private static Logger logger = Logger.getLogger(LogTestMain.class);
private static long count = L;
public static void main(String[] args){
while(true){
count++;
logger.fatal("This is a fatal log. count = " + count);
logger.error("This is an error log. count = " + count);
logger.warn("This is a warn log. count = " + count);
logger.info("This is an info log. count = " + count);
logger.debug("This is a debug log. count = " + count);
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
将它打成包,并按要求設定好。
3. 加入新元件.
因為logsearch隻能對ambari管理的的服務進行監控,是以,我們需要将logtest這個服務加入到ambari中
- 将logtest這個服務加入到ambari托管中
(新增服務是ambari的一個功能,不具體展開,可以自行查找一下)
- 當logtest加入到ambari中後,其目錄格式如下:
[[email protected] services]# tree LOGTEST/
LOGTEST/
├── configuration
│ └── logtest-logsearch-conf.xml
├── metainfo.xml
└── package
├── archive.zip
└── scripts
└── logtest.py
其中logtest-logsearch-conf.xml是logsearch需要的檔案,而metainfo.xml是logtest加入到ambari的時候,建立的。我們需要配置的也就是這兩個檔案。
- metainfo.xml配置
<metainfo>
<schemaVersion>2.0</schemaVersion>
<services>
<service>
<name>LOGTEST</name>
<displayName>LOGTEST</displayName>
<version>1.0.0</version>
<comment>LOGTEST is a test log sample</comment>
<components>
<component>
<name>Log Test</name>
<displayName>LogTest</displayName>
<category>MASTER</category>
<cardinality>1+</cardinality>
<commandScript>
<script>scripts/logtest.py</script>
<scriptType>PYTHON</scriptType>
<timeout>10000</timeout>
</commandScript>
<!-- 這個logs标簽很重要。如果沒有,logseach 的portal界面測無法顯示 -->
<logs>
<log>
<logId>logtest</logId>
<primary>true</primary>
</log>
</logs>
</component>
</components>
</service>
</services>
</metainfo>
metainfo.xml這個配置檔案是被ambari-server讀取,并展示的。其中這個标簽比較重要,它會關聯後面的logtest-logsearch-conf.xml配置檔案。是以一定要配置.
注:不知道是什麼原因,hdp的官方說明中,把這一部分省略了,導緻我當初配置的時候,logsearch的web頁面無法看到logtest這個服務的日志
- 配置logtest-logsearch-conf.xml
<configuration supports_final="false"
supports_adding_forbidden="true">
<!-- 服務名稱 -->
<property>
<name>service_name</name><!--這一項的值,不要改它 -->
<display-name>Service name</display-name> <!--這個例子,依照zookeeper的配置完成的,zk這一項也是這個名字,可以不用管它 -->
<description>Service name for Logsearch Portal (label)</description>
<value>LogTest</value> <!--服務名稱 -->
<on-ambari-upgrade add="true" />
</property>
<property>
<name>component_mappings</name> <!-- 這個參數的值,不要改動 -->
<display-name>Component mapping</display-name>
<description>Logsearch component logid mapping list (e.g.:
COMPONENT1:logid1,logid2;COMPONENT2:logid3)</description>
<value>LOGTEST:logtest</value> <!--前面一個為元件名稱,後面一個為元件的值,後面一個值比較重要, 與下面的type值,還有metainfo.xml的logid的值保持一緻 -->
<on-ambari-upgrade add="true" />
</property>
<property>
<name>content</name>
<display-name>Logfeeder Config</display-name>
<description>Metadata jinja template for Logfeeder which contains grok
patterns for reading service specific logs.</description>
<value>
{
"input": [
{
"type": "logtest",
"rowtype": "service",
"path": "{{default('/configurations/logtest_env/lt_log_dir', '/var/log/logtest')}}/logtest*.log"
}
],
"filter": [
{
"filter": "grok",
"conditions": {
"fields": {
"type": [
"logtest"
]
}
},
"log4j_format": "%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n",
"multiline_pattern": "^(%{TIMESTAMP_ISO8601:logtime})",
"message_pattern": "(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}-%{SPACE}%{LOGLEVEL:level}%{SPACE}\\[%{DATA:thread_name}\\@%{INT:line_number}\\]%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}",
"post_map_values": {
"logtime": {
"map_date": {
"target_date_pattern": "yyyy-MM-dd HH:mm:ss,SSS"
}
}
}
}
]
}
</value>
<value-attributes>
<type>content</type>
<show-property-name>false</show-property-name>
</value-attributes>
<on-ambari-upgrade add="true" />
</property>
</configuration>
這一個檔案是被logsearch讀取。這其中就會配置監控檔案的位置,日志的格式,監控日志的名稱等。這一個檔案一共可以分為三個部分。HDP有一個地方講解這個配置(可以參考https://community.hortonworks.com/articles/105297/adding-new-service-component-to-log-search-in-amba.html,下面是結合文檔的一些說明。
- Service_name : 定義服務名稱
- component_mappings : 定義服務的各個元件,需要注意這個配置項:
這個配置項很重要,在它前面一項解釋
Logsearch component logid mapping list (e.g.: COMPONENT1:logid1,logid2;COMPONENT2:logid3)
可以看出來,LOGTEST是component的名稱,而logtest為logid,也就是我們在metainfo.xml中配置的那個
-
content : 這一項就是配置各個logid對應的日志的資訊了。它可以分為兩個部分input與 filter
對于input,有下列幾項:type, rowtype與path,這幾個參數的意義如下:
參數 | 說明 |
---|---|
type | metainfo.xml與component-mapping中提到的logid |
rowtype | 設定為”service” |
path | 日志所在的路徑,以及日志名稱 |
第二塊就是”filter”,它是負責過濾日志等資訊(因為很多都類似,是以我是直接拷貝過來的)。具體各個參數的含義,可以參考:
https://github.com/apache/ambari/blob/trunk/ambari-logsearch/ambari-logsearch-logfeeder/docs/filter.md
對于xxx-logsearch.xml這樣的配置檔案,其實也是比較清楚。對于ambari來說,我們的logtest為一個Service,是以,它首先就需要定義service_name名稱,也就是我們的第一項。一個service可能由多個component組成,象HDFS這個Service,它就是由Namenode 與DataNode組成的, 是以,當我們定義完成service之後,就需要定義component了,明确的告訴logsearch,這個Service由哪些個compoent組成,也就是我們定義的第二項component-mapping, 當這些定義完成後,還需要告訴logsearch從哪裡去找這些檔案,并以哪種方式進行過濾。也就是第三項了,也就是各個component的log4j的配置資訊了。
4. 總結:
- 配置簡單(隻需要配置兩個檔案metainfo.xml與 xxx-logsearch.xml)
- 整個過程一定要注意logid這個值,它負責将metainfo.xml與xxx-logsearch.xml串聯起來。