这个案例中,tomcat产生的日志由filebeat收集,然后存取到redis中,再由logstash进行过滤清洗等操作,最后由elasticsearch存储索引并由kibana进行展示。

1、配置tomcat自定义日志

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".log"
pattern="{&quot;client_ip&quot;:&quot;%{X-Forwarded-For}i&quot;,&quot;direct_ip&quot;:&quot;%a&quot;,&quot;client user&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;timestamp&quot;:&quot;%{yyyy-MM-dd HH:mm:ss Z}t&quot;,&quot;request_method&quot;:&quot;%m&quot;,&quot;URI&quot;:&quot;%U&quot;,&quot;Protocol&quot;:&quot;%H&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;send bytes&quot;:&quot;%B&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;Referer&quot;:&quot;%{Referer}i&quot;,&quot;Agent version&quot;:&quot;%{User-Agent}i&quot;}"/>

需要注意的是第一个X-Forwarded-For表示获取一个ip列表,但只有第一个ip是真正的客户端ip,不过如果没有代理,直接访问tomcat,真正的ip是direct_ip。还有一个是时间格式,这里采用自定义时间格式,没有使用“%t”参数。

2、配置filebeat

- type: log

  # Change to true to enable this input configuration.
enabled: true # Paths that should be crawled and fetched. Glob based paths.
paths:
- /usr/local/tomcat/logs/localhost_access_log.*.log
#- c:\programdata\elasticsearch\logs\*
document_type: tomcat-accesslog
output.redis:
enable: true
hosts: ["172.16.0.54:6379"]
db:
timeout:
key: tomcat_accesslog_filter_index
password:

3、配置mysql

1)安装mariadb-server以及创建用户并授权访问mysql(最好不使用root用户)。

2)安装驱动步骤

先下载mysql-connector-java驱动:wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.47.tar.gz

然后在/usr/local/logstash/vendor目录下创建目录“(我这里是源码安装的logstash)

mkdir -pv  /usr/local/logstash/vendor/jar/jdbc

将上面的mysql驱动包(带有bin关键字的那个)移动到此目录下。

3)安装gem

yum install gem -y

然后配置gem源

gem sources --remove https://rubygems.org/ //或者
gem sources --add http://gems.ruby-china.com/

最后安装插件

cd /usr/local/logstash/bin
./logstash-plugin install logstash-output-jdbc

最后验证是否安装成功

/usr/local/logstash/bin/logstash-plugin | grep jdbc

[root@ELK-chaofeng07 logstash]# /usr/local/logstash/bin/logstash-plugin list | grep jdbc
logstash-input-jdbc
logstash-output-jdbc

4)进行配置logstash的配置文件,以.conf结尾即可

input{
redis {
host =>"172.16.0.54"
port =>
data_type => "list"
db => ""
password => ""
key => "tomcat_accesslog_filter_index"
codec => "json"
add_field => {
"[@metadata][mytomcat]" => "tomcat_accesslog_filter_log"
}
}
} filter {
if [@metadata][mytomcat] == "tomcat_accesslog_filter_log" {
mutate {
gsub => ["message","\\x","\\\x"]
}
if ( 'method":"HEAD' in [message] ) {
drop{}
}
json {
source => "message"
add_field => {"[@metadata][direct_ip]" => "%{direct_ip}"}
remove_field => "message"
remove_field => "prospector"
remove_field => "beat"
remove_field => "host"
remove_field => "input"
remove_field => "source"
remove_field => "offset"
remove_field => "fields"
remove_field => "@version"
}
date {
match => [ "timestamp","yyyy-MM-dd HH:mm:ss Z" ]
}
mutate {
split => ["client_ip",","]
}
mutate {
convert => ["body_bytes_sent","integer"]
convert => ["total_bytes_sent","integer"]
}
mutate {
replace => { "client_ip" => "%{client_ip[0]}"}
}
if [client_ip] == "-" {
if [@metadata][direct_ip] not in ["%{direct_ip}","-"]{
mutate {
replace => { "client_ip" => "%{direct_ip}" }
}
} else {
drop {}
}
}
geoip {
source => "client_ip"
target => ["geoip"]
add_field => ["[geoip][coordinates]", "%{[geoip][longitude]}"]
add_field => ["[geoip][coordinates]", "%{[geoip][latitude]}"]
}
mutate {
convert => ["[geoip][coordinates]","float"]
}
mutate {
remove_field => ["direct_ip"]
remove_field => ["timestamp"]
}
}
}
output{
if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags] and "_geoip_lookup_failure" not in [tags] {
jdbc{
connection_string => "jdbc:mysql://172.16.0.57:3306/elk?user=chaofeng&password=123456&useUnicode=true&characterEncoding=UTF8"
statement => ["INSERT INTO elklog(client_ip)VALUES(?)","client_ip"]
}
stdout{
codec => rubydebug
}
}

5)在mysql中创建数据库和表以及表结构

创建的数据库是:elk

创建的表是:elklog

表结构如下:

MariaDB [elk]> desc elklog;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| client_ip | varchar() | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
row in set (0.01 sec)

(6)效果图

难点:tomcat中的时间最好也进行自定义格式化,不然不好整

ELK收集tomcat访问日志并存取mysql数据库案例的更多相关文章

  1. ELK之收集tomcat访问日志

    把tomcat访问日志转换成json格式然后收集 修改配置文件conf/server.xml把日志输出改成json格式 添加logstash配置文件(日志按天切割可以使用*进行匹配所有)

  2. elk收集tomcat的日志

    logstash收集tomcat的日志 不要修改下tomcat中server.xml的日志格式,否则tomcat无法启动,试过多次,不行,就用自带的日志让logstash去收集 首先给tomcat日志 ...

  3. ELK收集tomcat状态日志

    1.先查看之前的状态日志输出格式:在logs/catalina.out这个文件中 最上面的日志格式我们可能不太习惯使用,所以能输出下面的格式是最好的,当然需要我们自定义日志格式,接下来看看如何修改 2 ...

  4. elk收集tomcat日志

    1.elk收集tomcat普通日志: 只在logstash节点增加如下文件,重启logstash即可: cat >>/home/logstash-6.3.0/config/tomcat_t ...

  5. ELK 收集 Tomcat日志以及修改Tomcat日志格式

    ELK 收集 Tomcat日志以及修改Tomcat日志格式 Tomcat日志 想要收集tomcat 日志 首先我们要对tomcat的日志有足够的了解 tomca日志分类 简单的说tomcat logs ...

  6. logstash收集nginx访问日志

    logstash收集nginx访问日志 安装nginx #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org ...

  7. Tomcat访问日志详细配置

    在server.xml里的<host>标签下加上 <Valve className="org.apache.catalina.valves.AccessLogValve&q ...

  8. linux系统tomcat项目部署和tomcat访问日志

    一.只用ip地址访问 先把端口号改成80,然后用 <Host name="localhost"  appBase="webapps"    137     ...

  9. Tomcat访问日志详细配置(转)

    在server.xml里的<host>标签下加上<Valve className="org.apache.catalina.valves.AccessLogValve&qu ...

随机推荐

  1. docker常用命令2

    Docker作为一种开源的.优秀的容器化技术,目前受到越来越多公司的运用,下面是我工作中常用到的一些命令. 1.删除一个容器(删除之前先要停止该容器) docker stop 容器IDdocker r ...

  2. ABP框架 sql语句(转载)

    ABP.Core实现SQL语句仓储,支持EF.Core兼容的数据库  来源:https://blog.csdn.net/qq_28699537/article/details/80522680?tds ...

  3. P、NP、NPC、NP-Hard问题到底是何方神圣?

    最近在做一个求解有向图中回路的问题,老师说求解图中全部回路是一个NP难问题.突然想到P.NP.NPC.NP-hard的描述一致不是很清楚,所以又学习了一下. 在解释这四个概念之前,我们需要先知道两个问 ...

  4. nginx 日子配置

    nginx access_log nginx 日志说明 不同用户防卫Nginx会把每个用户访问往咱的日志信息记录到指定的日志文件里,供网站管理员分析用户浏览行为等,此功能又ngx_http_log_m ...

  5. 【Java深入研究】10、红黑树

    一.红黑树介绍 红黑树是二叉查找树,红黑树的时间复杂度为: O(lgn) 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子 ...

  6. 详解Java中对象的软、弱和虚引用的区别

    对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...

  7. 字符串方法之padStart和padEnd

    ECMAScript 2017 有两个新的字符串方法:padStart和padEnd;  很有用啊啊,不用写if判断啦!开心脸 padStart在字符串开始出填充,padStart(num,‘要填充的 ...

  8. Laravel 系列入门教程(二)【最适合中国人的 Laravel 教程】

    本篇文章中,我将跟大家一起体验 Laravel 框架最重要的部分——路由系统. 如果你读过 2015 版的教程,你会发现那篇文章里大书特书的 Auth 系统构建已经被 Laravel 捎带手给解决了. ...

  9. log4j介绍

    log4j.properties文件的三种加载方式 1.默认自动加载 满足以下条件时: 1).配置文件名为log4j.properties 2).在classpath根目录下(即resources根目 ...

  10. 带你了解源码中的 ThreadLocal

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的<开发艺术探索>,后来是在研究 Vi ...