提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文是大数据架构技术架构图的一个重要分支,大数据的采集服务一般通过web接口的上报方式,web接口,1、写到kafka,2、通过log4j日志文件,两种方案各有优劣,1、直接写kafka,项目依赖比较重,需要加kafka组件,2、写log4j日志的方式,不需要引入kafka组件,实际项目中通过log4j配置每小时滚动生成日志比较多,我是目前采用方案2,实际如下图
一、log4j配置
引入log4j maven
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
如果同时配置log4j.xml和log4j.properties,则log4j.xml生效
web.xml 中配置 log4j的文件路径,不设置时默认在config目录平级
<!-- 加载Log4J 配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- 配置日志 end-->
log4j.xml
<!-- machineRecordFile 开始-->
<appender name="machineRecordFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="../webapps/recordlogs/records.log" />
<param name="Append" value="true" />
<param name="Threshold" value="info" />
<param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
<param name="BufferedIO" value="true" />
<!-- 8K为一个写单元 -->
<param name="BufferSize" value="8192" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] [%c(%L)] [%t] [%p]-%m%n" />
</layout>
</appender>
<appender name="asyncRecordFile" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="8192" />
<appender-ref ref="machineRecordFile" />
</appender>
<!-- machineRecordFile 结束-->
定义
RecordLogUtil.java 类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RecordLogUtil {
private static final Logger MACHINE_RECORD_LOG = LoggerFactory.getLogger("machineRecordLog");
public static void writeLog(String info){
MACHINE_RECORD_LOG.info(info);
}
}
在web接口中,写入日志:
String info =JacksonUtils.toJSONString(record);//将事件全部保存
RecordLogUtil.writeLog(info);
写入文件路径为webapps/recordlogs/records.log
二、filebeat
1、filebeat和beats的关系
首先filebeat是Beats中的一员。
Beats在是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。
目前Beats包含六种工具:
Packetbeat:网络数据(收集网络流量数据)
Metricbeat:指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
Filebeat:日志文件(收集文件数据)
Winlogbeat:windows事件日志(收集Windows事件日志数据)
Auditbeat:审计数据(收集审计日志)
Heartbeat:运行时间监控(收集系统运行时的数据)
2、filebeat是什么
Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
3、filebeat配置
配置日志文件写入kafka
新建filebeat-kafka.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/servers/tomcatServers/tomcat-record/t1/webapps/recordlogs/records.log
- /opt/servers/tomcatServers/tomcat-record/t2/webapps/recordlogs/records.log
fields:
filetype: records #这一行的key:value都可以自己定义
fields_under_root: true
output.kafka:
enabled: true
hosts: ["hadoop001:9092","hadoop002:9092","hadoop003:9092"]
topic: filebeat_records
keep_alive: 10s
4.启动filebeat
代码如下(示例):
nohup ./filebeat -e -c filebeat-kafka.yml &
三、logstash
安装hdfs插件
./bin/logstash-plugin install logstash-output-webhdfs
配置logstash配置,消费kafka写入hdfs
input {
kafka {
bootstrap_servers => "hadoop130:9092,hadoop131:9092,hadoop132:9092"
topics => ["filebeat_records","filebeat_hearts"] #多个topics
# codec => "json"
consumer_threads => 5
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
group_id => "logstash-to-hdfs" ##logstash 集群需相同
}
}
filter {
grok {
match => {
"message" => "\[%{DATA:uploadtimestamp}\] \[%{DATA:log}\] \[%{DATA:clientid}\] \[%{DATA:level}\]-%{GREEDYDATA:msgdata}"
}
}
date {
match => ["uploadtimestamp","yyyy-MM-dd HH:mm:ss"]
target => "time_local"
}
#定义日期
ruby {
code => "event.set('index.date', event.get('time_local').time.localtime.strftime('%Y-%m-%d'))"
}
#定义小时
ruby {
code => "event.set('index.hour', event.get('time_local').time.localtime.strftime('%H'))"
}
}
filter {
if "_grokparsefailure" in [tags] {
# drop {}
}
}
output {
if "_grokparsefailure" in [tags] {
file {
path => "/home/hadoop/logstash/logs/logstash-records-log-%{index.date}-%{index.hour}"
# codec => line {
# format => "%{message}"
# }
}
}
else if [fields][filetype] == "heart" {#这里对应 filebeat 定义的filetype
webhdfs {
host => "hd.m1"
port => 50070
user => "hadoop"
flush_size => 5000
idle_flush_time => 5
retry_interval => 3
path => "/input/heartData/%{index.date}/%{index.date}-%{index.hour}"
codec => line {
format => "%{message}"
}
}
}
else if [fields][filetype] == "records" {#这里对应 filebeat 定义的filetype
webhdfs {
host => "hd.m1"
port => 50070
user => "hadoop"
flush_size => 5000
idle_flush_time => 5
retry_interval => 3
path => "/input/machine_log/%{index.date}/%{index.date}-%{index.hour}"
codec => line {
format => "%{message}"
}
}
}
#stdout { codec => rubydebug }
# file {
# path => "/home/hadoop/logstash/logs/logstash-records-log-%{index.date}-%{index.hour}"
# codec => line {
# format => "%{message}"
# }
# }
}
启动logstash:nohup ./bin/logstash -f config/filebeat-logstash-hdfs.conf --config.reload.automatic &
查看hdfs 文件路径中:
总结
以上就是今天要讲采集日志到hdfs按小时分割的全部内容,如有不足之处,欢迎批评指正,谢谢。