搭建简易elk+log4j的日志分析系统

因为公司业务需要要进行日志分析,所以就需要搭建一个日志采集和分析系统。而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配置
<log4j:configuration xmlns:log4j=" http://jakarta.apache.org/log4j/" > 
       <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender" > 
             <layout class="org.apache.log4j.PatternLayout" > 
                   <param name="ConversionPattern" value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" /> 
             </layout> 
       </appender> 

     <appender name="socketAppender" class="org.apache.log4j.net.SocketAppender"> 
        <param name="remoteHost" value="localhost" /> 
        <param name="port" value="4560" /> 
        <param name="Threshold" value="INFO" /> 
        <param name="ReconnectionDelay" value="1000" /> 
        <param name="LocationInfo" value="true" /> 
      </appender>
   
       <root> 
             <priority value="info" /> 
             <appender-ref ref="ConsoleAppender" />
             <appender-ref ref="sockethubAppender" /> 
       </root> 
</log4j:configuration> 

七:附:

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格式的配置文件:

<appender name="LOGSTASH" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Encoding" value="UTF-8" />
		<param name="File" value="logs/logstash_game.log" />
		<param name="Append" value="true" />
		<param name="ImmediateFlush" value="true" />
		<layout class="net.logstash.log4j.JSONEventLayoutV1">
		</layout>
	</appender>

3:关于elasticsearch内存:

(摘抄自https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html)

把你的内存的(少于)一半给 Lucene编辑

一个常见的问题是给 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)

合理的测试方法如下:

  1. 在单个节点上,对单个分片,无副本的场景测试性能。
  2. 在 100% 默认配置的情况下记录性能结果,这样你就有了一个对比基线。
  3. 确保性能测试运行足够长的时间(30 分钟以上)这样你可以评估长期性能,而不是短期的峰值或延迟。一些事件(比如段合并,GC)不会立刻发生,所以性能概况会随着时间继续而改变的。
  4. 开始在基线上逐一修改默认值。严格测试它们,如果性能提升可以接受,保留这个配置项,开始下一项。


如果想了解更多可以去https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html看看。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值