Ambari LogSearch中监控新服务日志

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 = 0L;

    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(30000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }
}

将它打成包,并按要求设置好。

3. 加入新组件.

因为logsearch只能对ambari管理的的服务进行监控,因此,我们需要将logtest这个服务加入到ambari中

  1. 将logtest这个服务加入到ambari托管中

(新增服务是ambari的一个功能,不具体展开,可以自行查找一下)

  1. 当logtest加入到ambari中后,其目录格式如下:
[root@hdp91 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 : 定义服务的各个组件,需要注意这个配置项:

<value>LOGTEST:logtest</value> 

这个配置项很重要,在它前面一项解释

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串联起来。

猜你喜欢

转载自blog.csdn.net/eyoulc123/article/details/78363114