查看日志一直都是一个很困扰的问题,登录到服务器上查看几百兆的txt文件,从中找到某个问题可能会留下的日志记录...... 尤其是现在,在集群式部署的服务器原来越多的时候,找到一个异常记录几乎要翻遍每一台服务器,想想就崩溃了!这个时候就特别希望能有一个集中查看日志的方案来拯救我。
曾经找到一个名为log4Grid的项目,试用了一下。日志数据都保存到mssql数据库中,通过一个web项目来查询显示日志记录。只是实现了基本的日志数据收集和显示,项目没有持续更新,使用起来也不够稳定。不是一个成熟的日志收集项目。
log4net项目里有一个SimpleSocketServer的小应用,可以把多个服务器上的log4net日志集中到一个服务器上,然后再选择log4net的某种记录方式写下来。但是不能满足方便查看的要求。
一. jdk安装
ELK是运行在JVM上的所以也要安装jdk,jdk安装在Windows系统上后需要配置系统环境变量。详细配置可以看成是另外一件事,请自行搜索网上文章。
二. elasticsearch
elasticsearch 是ELK的核心负责存储和检索。
将elasticsearch 解压到一个目录下,在in目录下找到服务的安装、启动文件 service.bat:
三. kibana
kibana 是ELK中负责显示检索结果的。
将kibana 解压到一个目录下,将nssm复制到kibana的in目录下(为了简单所以直接复制nssm):
四. logstash
logstash在ELK中负责收集转化数据的,从日志中获取的数据由它传给elasticsearch。
将logstash解压到一个目录下,在in的同级目录下新建conf目录,在该目录下存放配置文件。
启动服务时使用 logstash.bat -f ..confxx.conf 的命令。
在logstash进入工作状态前,为了测试其能否正常工作,做了一个从日志文件获取数据的配置 example.conf:
input { file { path => "C:logslog.log" } } filter {} output { stdout { codec => rubydebug } }
当日志文件有新增时就会在控制台上输出。
input { log4j{ mode => "server" type=>"log4j-json" port=>4712 } } filter {} output { stdout { codec => rubydebug } elasticsearch { hosts => ["127.0.0.1"] } }
这就是在单机上配置ELK的关键点,跨服务器还没试过。
logstash的配置文件很容易出错误,最后我只放基本的配置,用ANSI不用中文不用注释。
对应的在系统内log4j要配置SocketAppender输出,log4j的properties配置:
log4j.rootLogger=info,logstash # Socket,logstash log4j.appender.logstash=org.apache.log4j.net.SocketAppender log4j.appender.logstash.Port=4712 log4j.appender.logstash.RemoteHost=localhost log4j.appender.logstash.ReconnectionDelay=60000 log4j.appender.logstash.LocationInfo=true
把新的输出配置logstash加到log4j.rootLogger= 后就能获得全部的日志输出。
log4j:WARN No appenders could be found for logger (org.apache.http.client.protoc ol.RequestAuthCache). log4j:WARN Please initialize the log4j system properly.