因为公司业务需要要进行日志分析,所以就需要搭建一个日志采集和分析系统。而elk集采集,存储,分析和查询于一身,并且elk系统本身也比较成熟。
一:基础配置
elk组件都是基于java的,所以jdk是必须要到,最好是安装1.8版本,因为了解到最新版本的elk对于java版本有要求。
二:安装elasticsearch:
1:下载
下载网站:https://www.elastic.co/downloads;为避免出一些不必要的问题,logstash,elasticsearch和kibana最好下载同一版本。
2:安装
elasticsearch为了安全,所以不允许root用户启动,所以这里要为elasticsearch创建一个用户。
直接解压
3:修改配置文件
vi config/elasticsearch.yml
主要修改下面几项
cluster.name=es_cluster
node.name=node0
path.data=/tmp/elasticsearch/data
path.logs=/tmp/elasticsearch/logs
#当前hostname或IP,我这里是centos2
network.host=centos2
network.port=9200
启动
./bin/elasticsearch
启动过程中有什么问题可以看文章后面的问题总结,或许可以参照处理。
三:安装logstash:
1:下载
同elasticsearch。
2:安装
直接解压
3:设置配置文件:在config文件夹下新建文件logstash.config文件。
在logstash.config文件中添加简易配置内容:
input {
file {
path => "/var/log/messages" start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => ["localhost:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
4:启动
bin/logstash -f config/logstash.config
四:安装kibana:
1:下载
同elasticsearch。
2:安装
直接解压
3:配置
在congfig文件夹下kibana.yml文件修改以下配置:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.138.128:9200"
port是kibana监听的端口,host是ip,url是elasticsearch的地址和端口。
4:启动
先将elasticsearch启动,之后执行
./bin/kibana
启动之后打开http://localhost:5601来进行日志的搜索和查看。
五:常见问题总结:
1:启动elasticsearch报错:
max file descriptors [4096] for elasticsearchprocess likely too low, increase to at least [65536]
解决:
切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf 添加下面配置:vm.max_map_count=655360并执行命令:
sysctl –p
2:启动elasticsearch报错:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
报错是因为虚拟机本身只有1g内存,而elasticsearch默认分配内存是2g。文章后面还有对于elasticsearch内存的相关介绍。
解决:
将config/jvm.options 中的配置
-Xms2g
-Xmx2g 修改为
-Xms512m
-Xmx512m
3:启动logstash报错:
Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME.
解决:
logstash 和logstash.lib.sh 里面加上 export JAVACMD=`which java`
六:logstash+log4j的配置:
1:logstash配置:
input {
log4j {
host => "0.0.0.0"
port => 4560
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => ["localhost:9200"]
index => "console-%{+YYYY.MM.dd}"
document_type => "log4j_type"
}
}
}
logstash的配置支持if,else if和else的条件判断配置,如:
if "com.ayue.chat" in [path]{
elasticsearch{
hosts => ["localhost:9200"]
index => "chat-%{+YYYY.MM.dd}"
}
}
else if "com.ayue.battle" in [path]{
elasticsearch{
hosts => ["localhost:9200"]
index => "battle-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch{
hosts => ["localhost:9200"]
index => "console-%{+YYYY.MM.dd}"
document_type => "log4j_type"
}
}
2:log4j配置:
Properties配置
### \u8BBE\u7F6E###
log4j.rootLogger = debug,stdout,D,E,logstash
### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### \u8F93\u51FADEBUG \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=/Users/bee/Documents/elk/log4j/debug.log###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/bee/Documents/elk/log4j/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### \u8F93\u51FAERROR \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=/Users/bee/Documents/elk/log4j/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/bee/Documents/elk/log4j/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#\u8F93\u51FA\u65E5\u5FD7\u5230logstash
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.RemoteHost=192.168.138.128
log4j.appender.logstash.port=4560
log4j.appender.logstash.ReconnectionDelay=60000
log4j.appender.logstash.LocationInfo=true
xml配置
七:附:
1:logstash配置支持数据类型的强制转换,如:
filter{
if "com.ayue.taskHandler" in [path]{
mutate{
convert => ["message","integer"]
}
}
}
将路径含com.ayue.taskHandler的日志的message强制转换为integer类型。
2:logstash支持处理json文件,如
filter{
json{
source => "message"
#target => "doc"
#remove_field => ["message"]
}
}
logstash处理插入进elasticsearch后,json记录已经被直接解析成各字段,在kibana中可以方便的查询。
log4j也提供了生成符合logstash标准的json格式的配置文件:
3:关于elasticsearch内存:
(摘抄自https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html)
一个常见的问题是给 Elasticsearch 分配的内存 太 大了。 假设你有一个 64 GB 内存的机器, 天啊,我要把 64 GB 内存全都给 Elasticsearch。因为越多越好啊!
当然,内存对于 Elasticsearch 来说绝对是重要的,它可以被许多内存数据结构使用来提供更快的操作。但是说到这里, 还有另外一个内存消耗大户 非堆内存 (off-heap):Lucene。
Lucene 被设计为可以利用操作系统底层机制来缓存内存数据结构。 Lucene 的段是分别存储到单个文件中的。因为段是不可变的,这些文件也都不会变化,这是对缓存友好的,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
Lucene 的性能取决于和操作系统的相互作用。如果你把所有的内存都分配给 Elasticsearch 的堆内存,那将不会有剩余的内存交给 Lucene。 这将严重地影响全文检索的性能。
标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%。当然它也不会被浪费,Lucene 会很乐意利用起余下的内存。
如果你不需要对分词字符串做聚合计算(例如,不需要 fielddata )可以考虑降低堆内存。堆内存越小,Elasticsearch(更快的 GC)和 Lucene(更多的内存用于缓存)的性能越好。
即便你有足够的内存,也尽量不要 超过 32 GB。因为它浪费了内存,降低了 CPU 的性能,还要让 GC 应对大内存。
4:关于elasticsearch性能测试:
(摘抄自https://www.elastic.co/guide/cn/elasticsearch/guide/current/indexing-performance.html#segments-and-merging)
合理的测试方法如下:
如果想了解更多可以去https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html看看。