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中
- 将logtest这个服务加入到ambari托管中
(新增服务是ambari的一个功能,不具体展开,可以自行查找一下)
- 当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的时候,创建的。我们需要配置的也就是这两个文件。
- 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 : 定义服务的各个组件,需要注意这个配置项:
<value>LOGTEST:logtest</value>
这个配置项很重要,在它前面一项解释
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串联起来。