天天看點

Ambari LogSearch中監控新服務日志1. 介紹2. 準備3. 加入新元件.4. 總結:

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中

  1. 将logtest這個服務加入到ambari托管中

(新增服務是ambari的一個功能,不具體展開,可以自行查找一下)

  1. 當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的時候,建立的。我們需要配置的也就是這兩個檔案。

  1. 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這個服務的日志

  1. 配置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,下面是結合文檔的一些說明。

  1. Service_name : 定義服務名稱
  2. component_mappings : 定義服務的各個元件,需要注意這個配置項:

這個配置項很重要,在它前面一項解釋

Logsearch component logid mapping list (e.g.: COMPONENT1:logid1,logid2;COMPONENT2:logid3)

可以看出來,LOGTEST是component的名稱,而logtest為logid,也就是我們在metainfo.xml中配置的那個

  1. 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. 總結:

  1. 配置簡單(隻需要配置兩個檔案metainfo.xml與 xxx-logsearch.xml)
  2. 整個過程一定要注意logid這個值,它負責将metainfo.xml與xxx-logsearch.xml串聯起來。