Graylog2+ELK日志系统

本文介绍了一种改进的日志系统部署方案,采用Graylog结合ELK栈实现高性能日志采集、处理及告警功能。通过优化配置,系统负载显著降低,实现了零延迟处理。

现状:
之前的日志系统,采用是两台ELK,每天日志量在120G-160G,机器负载在18%左右,日志处理延迟在30分钟左右,改造后,同样两台机器,机器负载高峰时在10%左右,处理零延迟,并且支持告警,
改造后日志系统结构图如下:
Graylog2+ELK日志系统
Graylog stream内部结构:
Graylog2+ELK日志系统

安装包版本:
redis 3.2.8
mongodb-3.4.4
logstash 5.2.2
graylog-2.3.2
elasticsearch-5.6.3
jdk版本要求1.8.0_144以上
一:redis安装
1.主机,
A组:192.168.1.205(主)/192.168.1.204
B组:192.168.1.168(主)/192.168.1.167
2.安装主从搭建略,网上例子很多,内存设置大点,关闭内存淘汰机制即可
二:mongodb
1.主机
192.168.1.207(3000)
192.168.1.206(3000)
192.168.1.205(3000)
2.副本集搭建,很简单,网上搜索,graylog只存储一些配置信息,所以mongodb不要配置多大缓冲池
三:elasticsearch安装,由于graylog-2.3.2支持5.6.x以上版本
1,由于机器有限,这里只配置了两台elasticsearch,建议至少三台
192.168.1.205:9200
192.168.1.168:9200
主机192.168.1.205 elasticsearch配置:(以下作为参考)
vim /application/elasticsearch/config/elasticsearch.yml
cluster.name: log
node.name: master-205
node.master: true
node.data: true
#node.tag: elk-master-205
path.conf: /application/elasticsearch
path.data: /data/elasticsearch/elasticsearch_data
#path.work: /data/elasticsearch/elasticsearch_tmp
path.logs: /data/elasticsearch/elasticsearch_log
node.max_local_storage_nodes: 1
#index.number_of_shards: 3
#index.number_of_replicas: 1

#bootstrap.mlockall: true
network.bind_host: 192.168.1.205
network.host: ['192.168.1.205', '192.168.1.168']
network.publish_host: 192.168.1.205
http.port: 9200

gateway.recover_after_nodes: 1
bootstrap.system_call_filter: false
gateway.recover_after_time: 10m
#gateway.expected_nodes: 2
#discovery.zen.minimum_master_nodes: 1
#discovery.zen.ping.timeout: 30s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_interval: 60s
discovery.zen.fd.ping_retries: 6
discovery.zen.ping.unicast.hosts: ['192.168.1.205', '192.168.1.168']

#index.merge.scheduler.max_thread_count: 2
#index.translog.durability: async
#
#index.search.slowlog.threshold.query.warn: 10s
#index.search.slowlog.threshold.query.info: 5s
#index.search.slowlog.threshold.query.debug: 1s
#index.search.slowlog.threshold.query.trace: 20ms
#
#index.search.slowlog.threshold.fetch.warn: 1s
#index.search.slowlog.threshold.fetch.info: 800ms
#index.search.slowlog.threshold.fetch.debug: 500ms
#index.search.slowlog.threshold.fetch.trace: 20ms
#
#index.indexing.slowlog.threshold.index.warn: 10s
#index.indexing.slowlog.threshold.index.info: 5s
#index.indexing.slowlog.threshold.index.debug: 1s
#index.indexing.slowlog.threshold.index.trace: 50ms

#monitor.jvm.gc.young.warn: 800ms
#monitor.jvm.gc.young.info: 500ms
#monitor.jvm.gc.young.debug: 20ms

#monitor.jvm.gc.old.warn: 5s
#monitor.jvm.gc.old.info: 2s
#monitor.jvm.gc.old.debug: 1s

http.cors.enabled: true
http.cors.allow-origin: "*"
#http.cors.allow-headers: Authorization
http.max_content_length: 1024mb

#xpack.security.enabled: false
#xpack.monitoring.enabled: false
#xpack.graph.enabled: false
#xpack.watcher.enabled: false

thread_pool.bulk.size: 9
thread_pool.bulk.queue_size: 1000
thread_pool.index.size: 9
thread_pool.index.queue_size: 1000

vim /application/elasticsearch/bin/elasticsearch
添加如下配置,最大不超过32g
ES_JAVA_OPTS="-Xms18g -Xmx18g"

主机192.168.1.168 elasticsearch配置:(以下作为参考)
cluster.name: log
node.name: slave-168
node.master: true
node.data: true
path.conf: /application/elasticsearch
path.data: /data/elasticsearch/elasticsearch_data
#path.work: /data/elasticsearch/elasticsearch_tmp
path.logs: /data/elasticsearch/elasticsearch_log
node.max_local_storage_nodes: 1
#index.number_of_shards: 3
#index.number_of_replicas: 1

#bootstrap.mlockall: true
network.bind_host: 192.168.1.168
network.host: ['192.168.1.205', '192.168.1.168']
network.publish_host: 192.168.1.168
http.port: 9200

gateway.recover_after_nodes: 1
bootstrap.system_call_filter: false
gateway.recover_after_time: 10m
#gateway.expected_nodes: 2
#discovery.zen.minimum_master_nodes: 1
#discovery.zen.ping.timeout: 30s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_interval: 60s
discovery.zen.fd.ping_retries: 6
discovery.zen.ping.unicast.hosts: ['192.168.1.205', '192.168.1.168']

#index.merge.scheduler.max_thread_count: 2
#index.translog.durability: async
#
#index.search.slowlog.threshold.query.warn: 10s
#index.search.slowlog.threshold.query.info: 5s
#index.search.slowlog.threshold.query.debug: 1s
#index.search.slowlog.threshold.query.trace: 20ms
#
#index.search.slowlog.threshold.fetch.warn: 1s
#index.search.slowlog.threshold.fetch.info: 800ms
#index.search.slowlog.threshold.fetch.debug: 500ms
#index.search.slowlog.threshold.fetch.trace: 20ms
#
#index.indexing.slowlog.threshold.index.warn: 10s
#index.indexing.slowlog.threshold.index.info: 5s
#index.indexing.slowlog.threshold.index.debug: 1s
#index.indexing.slowlog.threshold.index.trace: 50ms

#monitor.jvm.gc.young.warn: 800ms
#monitor.jvm.gc.young.info: 500ms
#monitor.jvm.gc.young.debug: 20ms

#monitor.jvm.gc.old.warn: 5s
#monitor.jvm.gc.old.info: 2s
#monitor.jvm.gc.old.debug: 1s

http.cors.enabled: true
http.cors.allow-origin: "*"
#http.cors.allow-headers: Authorization
http.max_content_length: 1024mb

#xpack.security.enabled: false
#xpack.monitoring.enabled: false
#xpack.graph.enabled: false
#xpack.watcher.enabled: false

thread_pool.bulk.size: 9
thread_pool.bulk.queue_size: 1000
thread_pool.index.size: 9
thread_pool.index.queue_size: 1000

vim /application/elasticsearch/bin/elasticsearch
添加如下配置,最大不超过32g
ES_JAVA_OPTS="-Xms18g -Xmx18g"

四:Graylog安装
1.到官网上下载tar包,解压到指定目录,受机器限制这里只配置两个节点
2.192.168.1.205需要配置如下:
is_master = true
node_id_file = /etc/graylog/server/node-id
#=pwgen -N 1 -s 96|yum install pwgen
password_secret=E8yBY19BBOts0rN9Djy6NhGfFarXNbsjlsHnZQZS3rDalV8OpRs4gyWkl2MQsRj2ctGOGZi2G6s1c2y2V8TNyeyZH4eiv2B3
root_username = admin
#echo -n yourpassword | shasum -a 256或echo -n yourpassword | sha256sum
root_password_sha2 =8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
root_timezone =Asia/Shanghai
rest_listen_uri = http://192.168.1.205:19000/api/
web_listen_uri = http://192.168.1.205:29000/
elasticsearch_hosts = http://192.168.1.205:9200,http://192.168.1.168:9200
elasticsearch_index_prefix = graylog
stale_master_timeout = 100000
mongodb_uri = mongodb://192.168.1.205:3000,192.168.1.206:3000,192.168.1.207:3000/graylog
3.192.168.1.168需要配置如下:
is_master = false
node_id_file = /etc/graylog/server/node-id
#=pwgen -N 1 -s 96|yum install pwgen
password_secret=E8yBY19BBOts0rN9Djy6NhGfFarXNbsjlsHnZQZS3rDalV8OpRs4gyWkl2MQsRj2ctGOGZi2G6s1c2y2V8TNyeyZH4eiv2B3
#echo -n yourpassword | shasum -a 256或echo -n yourpassword | sha256sum
root_username = admin
#此处设置登录密码
root_password_sha2 =8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
root_timezone =Asia/Shanghai
rest_listen_uri = http://192.168.1.168:19000/api/
web_listen_uri = http://192.168.1.168:29000/
elasticsearch_hosts = http://192.168.1.205:9200,http://192.168.1.168:9200
elasticsearch_index_prefix = graylog
stale_master_timeout = 100000
mongodb_uri = mongodb://192.168.1.205:3000,192.168.1.206:3000,192.168.1.207:3000/graylog
根据自己环境调整
vim /application/graylog-2.3.2/bin/graylogctl
take variables from environment if set
GRAYLOGCTL_DIR=${GRAYLOGCTL_DIR:=$(dirname "$GRAYLOGCTL")}
GRAYLOG_SERVER_JAR=${GRAYLOG_SERVER_JAR:=graylog.jar}
GRAYLOG_CONF=${GRAYLOG_CONF:=/etc/graylog/server/server.conf}
GRAYLOG_PID=${GRAYLOG_PID:=/tmp/graylog.pid}
LOG_FILE=${LOG_FILE:=log/graylog-server.log}
LOG4J=${LOG4J:=}
DEFAULT_JAVA_OPTS="-Djava.library.path=${GRAYLOGCTL_DIR}/../lib/sigar -Xms3g -Xmx3g -XX:NewRatio=1 -server -XX:+ResizeTLAB -XX:+UseConcMarkSweepGC -XX:+CMSConcurrentMTEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow"
JAVA_OPTS="${JAVA_OPTS:="$DEFAULT_JAVA_OPTS"}"
4.启动
/application/graylog-2.3.2/bin/graylogctl start
5.启动成功打开http://192.168.1.205:29000 可以查看节点状态,配置多少个节点就显示多少节点状态
Graylog2+ELK日志系统
Graylog2+ELK日志系统
五:配置实例
1.采集日志到redis中(启动:logstash -f /application/logstash/config/ads.conf)
.vim /application/logstash/config/ads.conf
input {
file {
path => "/home/ads/logs/product/common-error.log"
type => "ads-error"
codec => multiline {
pattern => "^%{TIMESTAMPISO8601} "
negate => true
what => previous
charset => "GBK"
}
}
file {
path => "/home/ad/logs///*/accesslog
*.log"
type => "ads-access"
}
}

filter {
mutate {
add_field => { server => "192.168.1.121"}
}
}

output {

if [type] == "ads-error" {
redis {
host => ["192.168.1.205", "192.168.1.168"]
data_type => "list"
shuffle_hosts => true
key => "common-error"
}
} else if [type] == "ads-access" {
redis {
host => ["192.168.1.205", "192.168.1.168"]
data_type => "list"
shuffle_hosts => true
key => "ads-access"
}
}
}
2.从redis中取出日志至graylog中
安装gelf模块
/application/logstash/bin/logstash-plugin install logstash-output-gelf
下载:GeoLite2-City.mmdb
vim /application/logstash/config/ads.conf
input {
redis {
host => "192.168.1.205"
data_type => "list"
key => "ads-access"
threads => 2
}
redis {
host => "192.168.1.168"
data_type => "list"
key => "ads-access"
threads => 2
}
}

filter {
mutate {
gsub => ["message", "\x", "\\x"]
}
grok {
match => { "message" => "%{COMMONNGINX}" }
}

if [x_forwarded_for] =~ ',' {
split {
field => "x_forwarded_for"
terminator => [","]
}
}

if [x_forwarded_for] =~ ' '{
mutate {
gsub => ["x_forwarded_for", " ", ""]
}
}
if [x_forwarded_for] {
grok {
match => ["x_forwarded_for", "%{IP:GEOIP}"]
}
}
if [request] =~ 'checkstatus.jsp' {
drop {}
}
if [tags] =~ 'grokparsefailure' {
drop {}
}

grok {
match => {
"referer" => ["%{URIPROTO}://%{URIHOST:referer_domain}"]
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
mutate {
convert => { "bytes" => "integer" }
}
mutate {
convert => { "response_time" => "integer" }
}
mutate {
convert => { "response_body_length" => "integer" }
}
if [GEOIP] and [GEOIP] != "127.0.0.1" {
geoip {
source => "GEOIP"
target => "geoip"
database => "/application/logstash/data/GeoLite2-City.mmdb"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float"]
}
}
}
output {
if [GEOIP] {
gelf {
host => "192.168.1.205"#如果graylog多节点机器配置了负载均衡,写负载均衡IP
port => 12201

}
}
}
3.graylog配置
Graylog2+ELK日志系统
Graylog2+ELK日志系统
就可以收集到日志了,
六:邮件告警
vim /etc/graylog/server/server.conf
transport_email_enabled =true
transport_email_hostname =smtp.xxxx.com
transport_email_port =25
transport_email_use_auth = true
transport_email_use_tls = false
transport_email_use_ssl = false
transport_email_auth_username =xxxxxx
transport_email_auth_password =xxxxxx
transport_email_subject_prefix = [graylog]
transport_email_from_email =xxxxx@xxxxx.com
transport_email_web_interface_url = http://192.168.1.205:29000
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统
七:配置数据流,过滤相应的数据到指定的indices
默认情况收集到数据都存储在elasticsearch graylog索引集中(如下图)
Graylog2+ELK日志系统
Graylog2+ELK日志系统
按工程创建相应的索引集合
Graylog2+ELK日志系统
Graylog2+ELK日志系统
创建stream
Graylog2+ELK日志系统
创建rules
Graylog2+ELK日志系统
Graylog2+ELK日志系统
Graylog2+ELK日志系统

转载于:https://blog.51cto.com/8184738/2046550

## 什么是graylog Graylog 是一个简单易用、功能较全面的日志管理工具,相比 ELK 组合, 优点: - 部署维护简单 - 查询语法简单易懂(对比ES的语法…) - 内置简单的告警 - 可以将搜索结果导出为 json - 提供简单的聚合统计功能 - UI 比较友好 - 当然, 拓展性上比 ELK 差很多。 整套依赖: - Graylog 提供 graylog 对外接口 - Elasticsearch 日志文件的持久化存储和检索 - MongoDB 只是存储一些 Graylog 的配置 ## 安装 > 可以是裸机安装,也可以是docker安装,这里用docker安装 环境要求: - centos7.4 - cpu2个 内存2G 参考: https://hub.docker.com/r/graylog2/graylog/ ### 环境准备 ``` mkdir /root/graylog && cd /root/graylog //挂载目录 mkdir -p mongo_data graylog_journal es_data //配置文件目录 mkdir -p ./graylog/config cd ./graylog/config wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.0/config/graylog.conf wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.0/config/log4j2.xml //提前准备镜像 docker pull mongo:3 docker pull graylog/graylog:3.0 docker pull elasticsearch:5.6.9 ``` ### docker-compose.yml ``` version: '2' services: # MongoDB: https://hub.docker.com/_/mongo/ mongo: image: mongo:3 volumes: - ./mongo_data:/data/db - /etc/localtime:/etc/localtime # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/docker.html elasticsearch: image: elasticsearch:5.6.9 volumes: - ./es_data:/usr/share/elasticsearch/data - /etc/localtime:/etc/localtime environment: - http.host=0.0.0.0 - transport.host=localhost - network.host=0.0.0.0 # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/security-settings.html#general-security-settings - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 mem_limit: 1g # Graylog: https://hub.docker.com/r/graylog/graylog/ graylog: image: graylog/graylog:3.0 volumes: - ./graylog_journal:/usr/share/graylog/data/journal - ./graylog/config:/usr/share/graylog/data/config - /etc/localtime:/etc/localtime environment: # CHANGE ME! - GRAYLOG_PASSWORD_SECRET=somepasswordpepper # Password: admin - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # 这里需要修改为要暴露的机器的地址 - GRAYLOG_HTTP_EXTERNAL_URI=http://10.121.60.2:9000/ links: - mongo - elasticsearch ports: # Graylog web interface and REST API - 9000:9000 # Syslog TCP - 514:514 # Syslog UDP - 514:514/udp # GELF TCP - 12201:12201 # GELF UDP - 12201:12201/udp # GELF HTTP - 12202:12202 ``` ### 启动 `docker-compose -f docker-compose.yml up -d` 通过http://10.121.60.2:9000/访问web,admin/admin ### 修改配置 - email相关(告警需要) ``` transport_email_enabled = true transport_email_hostname = smtp.163.com transport_email_port = 994 transport_email_use_auth = true transport_email_use_tls = true transport_email_use_ssl = true transport_email_auth_username = 17191093767@163.com transport_email_auth_password = zhim123456 transport_email_subject_prefix = [graylog] transport_email_from_email = 17191093767@163.com transport_email_web_interface_url = http://10.121.60.2:9000 ``` ## 使用 ### 配置添加Inputs > Graylog 节点能够接受数据的类型称之为input,常见的有GELF TCP, GELF UDP, GELF HTTP. 说明:GELF TCP, GELF UDP可以使用同一个端口,HTTP需要另起端口,原因不解释。 - 添加三个input,过程略,tcp,udp端口使用默认的12201,http端口使用12202。 - 验证 ``` // udp echo -n '{ "version": "1.1", "host": "example.org", "short_message": "A short message info with udp", "level": 1, "_some_info": "foo", "_tag": "test11" }' | nc -w10 -u 10.121.60.2 12201 // tcp echo -n -e '{ "version": "1.1", "host": "example.org", "short_message": "A short message with tcp", "level": 1, "_some_info": "foo" }'"\0" | nc -w10 10.121.60.2 12201 //http curl -X POST -H 'Content-Type: application/json' -d '{ "version": "1.1", "host": "example.org", "short_message": "A short message with http", "level": 5, "_some_info": "foo" }' 'http://10.121.60.2:12202/gelf' ``` ### docker 日志添加到graylog ``` docker run --log-driver=gelf \ --log-opt gelf-address=udp://10.121.60.2:12201 \ --log-opt tag=test1 \ -v /etc/localtime:/etc/localtime \ -it nginx /bin/bash ``` docker-compose.yaml ``` services: mongo: logging: driver: "gelf" options: gelf-address: "udp://10.121.60.2:12201" tag: mongo volumes: - /etc/localtime:/etc/localtime ``` ### java日志直接发送到graylog > 使用logback ``` 10.121.60.2 12201 <!--An example of overwriting the short message pattern--> %ex{short}%.100m <!-- Use HTML output of the full message. Yes, any layout can be used (please don't actually do this)--> %d{MM-dd HH:mm:ss.SSS} [%thread] %-5level \(%F:%L\) - %msg %n true true true true requestId:long <!--Facility is not officially supported in GELF anymore, but you can use staticFields to do the same thing--> tag business-server ``` ## 系统使用 功能菜单说明 - search 日志查询面板 ![](assets/2018-07-10-11-52-07.png) - streams 将日志对象按照filed定义为stream,默认的stream为all messages ![](assets/2018-07-10-11-52-22.png) - alerts 告警相关,选择一个stream对象定义告警条件和通知方式,当stream里面的日志满足条件时候告警并通知 ![](assets/2018-07-10-11-52-35.png) - dashboards 图形面板 ![](assets/2018-07-10-11-52-53.png) - source 告警所在主机 ![](assets/2018-07-10-11-53-37.png) - system 系统配置 ![](assets/2018-07-10-11-53-52.png) ### 查询条件 [官方说明文档](http://docs.graylog.org/en/3.0/pages/queries.html) > 关键字不分大小写 - 单个关键字查询 `ssh` - 多关键字查询,含有ssh or login `ssh login` - 含有某个字符串查询 `ssh login` - 同时含有多个关键字查询 `opening index" AND db` - 根据字段值查询 `tag:couchdb.peer0.org1.ygsoft.com` - 含有多个tag的查询,某条记录只要其中一个字段满足即可 ``` tag: (orderer.ygsoft.com couchdb.peer0.org1.ygsoft.com) or tag: orderer.ygsoft.com couchdb.peer0.org1.ygsoft.com ``` - 含有完全匹配字段 `tag:"ssh login"` - 含有某个字段的记录: `_exists_:tag` - 不含有某个字段的记录: `NOT _exists_:tag` - AND OR `"ssh login" AND source:example.org` `("ssh login" AND (source:example.org OR source:another.example.org)) OR _exists_:always_find_me` - NOT ``` "ssh login" AND NOT source:example.org NOT example.org ``` 注意: AND, OR, and NOT 只能大写. - 通配符 ? 表示单个字符 星号表示0个和多个字符 ``` source:*.org source:exam?le.org source:exam?le.* ``` 注意:默认首字母不能使用通配符,因为这样会使用大量的内存;强行开启修改配置文件`allow_leading_wildcard_searches = true` - 当某关键字不确认顺序的时候使用~ ``` ssh logni~ source:exmaple.org~ 结果可以匹配 ssh login and example.org ``` - 以下字符在使用的时候必须用反斜杠转义 ``` && || : \ / + - ! ( ) { } [ ] ^ " ~ * ? Example: resource:\/posts\/45326 ``` ### 查询条件可以保存下来 使用 save search criteria 按钮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值