每个人的场景,都各有不同。比如,你的全部日志一天大就10G以内的原始文本。既然是日志,那就不是非常重要了。
但是却很有必需进行查看。那么单节点就是最好的选择。
比如,阿里云的8C16G,可以处理20G一天的日志文本。或更多一些,
当然单个高效云盘IO不够,磁盘用SSD太贵,可以用四个高效云盘,LVM做阵列。空间IO都有了。
16G内存,还要跑kibana,logstash来格式化日志。这时,想要节省点内存,可以把logstash 去掉。rsyslog 直接写es
都单节点了,es的副本也设置0。直接写es,要注意mapping。因为logstash有个默认的写好的模版。
# cd /usr/local/logstash
# vi ./vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-7.3.6-java/lib/logstash/outputs/elasticsearch/elasticsearch-template-es5x.json
如果没有用上mapping,那么统计就会出问题。比如统计域名有多少个访问,没有mapping的话,默认只有分词。而没有keyword
说是说,www.baidu.com 按我们要求,这就是一个词。但是会被分成三个词。。
最简单的做法,就是把logstash的这个模版提交到es。并且命名索引时,以logstash 开头就可以。
# curl -XPUT ' -d@./vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-7.3.6-java/lib/logstash/outputs/elasticsearch/elasticsearch-template-es5x.json
------------------------------------------------------------------------------------
#举例,如果一条完整的日志是括号中的内容【2017-09-28 10:36:21 [test] info 192.168.10.1】
logstash 进行了grok 或什么的操作,最终写往es的数据,其实就是重组成一条json。
template(name="index_name" type="list") {
constant(value="logstash-business-") property(name="msg" position.from="1" position.to="4")
constant(value=".") property(name="msg" position.from="6" position.to="7")
constant(value=".") property(name="msg" position.from="9" position.to="10")
}
#首先定义一个模板,拼接好后,就是logstash-business-2017.09.28 。就是说,rsyslog 的output要说明写到哪一个索引中去。可以参考第二篇的第3个模版位置的拼接说明 。
这里给索引名定义时,是从日志原文中进行截取日期。而其他rsyslog 文章,有不少是从dateFormat="rfc3339" 中即系统时间截取。会有一个问题
比如我一个星期前的日志,在今天导入。dateFormat="rfc3339"取到的日期是今天的。一周前的日志存放到今天这个索引里,却不是一周前那一天的索引里。。
不是很奇怪吗?
只是放大了时间 来讲这个东西。因为 如果日志量大了,或是系统IO超高,rsyslog读取日志肯定受影响。无法实时处理日志。就会有不一致的情况 。差了几秒或十几秒之类
你在核对一天日志总数时,就对不上了。或者关键时候,要判断一条日志的时间,又乱了。。。
template(name="temp_name" type="list"){
constant(value="{") constant(value="\"@timestamp\":\"") #常量拼接,这一句得出: {"@timestamp":"
property(name="msg" position.from="1" position.to="10") constant(value="T") #参数,从原始日志中得到前10个字符 : 2017-09-28T
property(name="msg" position.from="12" position.to="19")constant(value="+08:00") #这一句得到: 10:36:21+08:00 ,跟上一句合起来就是2017-09-28T10:36:21+08:00
constant(value="\",\"hostname\":\"") property(name="hostname") #得到: ","hostname":"my-host-name 。这句的第一个"是补上一句的。
constant(value="\",\"log_name\":\"") constant(value="php_backend_log") #二个常量得到: ","log_name":"php_backend_log
constant(value="\",\"log_level\":\"") property(name="msg" field.delimiter="32" field.number="3") #得到: ","log_level" : "[test]
constant(value="\",\"domina\":\"") property(name="msg" field.delimiter="32" field.number="5") #得到: ","domina" : "
constant(value="\",\"IP\":\"") property(name="msg" field.delimiter="32" field.number="6") #得到: ","IP": "192.168.10.1
constant(value="\"}\n") # #得到: "}
}
红底的拼装起来,就是一条完整的json。
{"@timestamp":"2017-09-28T10:36:21+08:00","hostname":"my-host-name","log_name":"php_backend_log","log_level" : "[test]","domina" : "","IP": "192.168.10.1"}
# 说明 : @timestamp是es的默认字段,基本上画时间轴都是用这个字段。
hostname , log_name 这二个字段是自定义拼装上来的。为了看一条日志,然后瞬间定位到是来自哪台机器,哪个日志文本。
input(
type="imfile"
File="/tmp/1.log"
Severity="info"
Facility="user"
tag="nginx_access"
ruleset="log1"
)
ruleset( name="test" ) {
action (
type="omelasticsearch"
errorfile="/tmp/rsys-err.log"
template="temp_name" #前面定义的第2个模板名字
server="10.252.1.1" #对端es节点,多节点,逗号分隔
dynSearchIndex="on" #开启动态的索引名字
searchIndex="index_name" # 前面定义的第一个模板。 是为了让rsyslog知道从哪里得到这个索引名字
searchType="nginx" # 为这个"event"指定一个不同的type,你可以通过dynSearchType="on" 去拥有变量。若你指定了变量值。
bulkmode="on" #批量模式。 es可以同时索引多个documents(在同一个请求),这使得这种方法比索引一条日志行快
name="action_nginx-es1003" #队列名
queue.size="4000" #这是队列的最大大小数量的消息数量。注意,设置队列大小非常小的值(大约100以下消息)不支持,会导致不可预知的(不可预知的)结果
queue.dequeuebatchsize="20" # 同时出队的数据大小,配置的稍微大点会提高性能。但是要根据实际情况。
queue.discardseverity="8" # 丢弃消息等级设定,数字越低丟的越多,设置8代表禁止丢弃消息。
queue.discardmark="35000" # #超出3.5W后,会禁止新消息入队,丢弃消息。如果前一个被禁止, #那么丢弃数据将无针对性,
queue.highwatermark="3000" #当内存队列达到这么多时,开始回写磁盘。重要!!!
queue.lowwatermark="1000" #当内存队列小于这么多时,停止回写磁盘。
queue.type="linkedlist" #选择使用内存队列模式。
queue.maxdiskspace="1G" #限制磁盘队列大小
queue.maxfilesize="50M" #队列单文件尺寸大小。
queue.filename="action_nginx-es1003" #如果队列模式使用内存模式,同时在配置这个参数,意味激活磁盘附加队列。不能在这个参数指定目录可以用queue.spoolDirectory指定目录。
queue.checkpointinterval="2" # 创建磁盘队列,使用$
QueueType Disk 配置指令。可以通过指定检查时间间隔。0表示没有检查点。注意磁盘队列可以在每次写操作后通过非常可靠的issuing a (f)sync.从版本4.3.2,这可以要求通过“
queuesyncqueuefiles开/关与默认被关闭。激活此选项有性能消耗,所以它不开启也是有原因的。
queue.saveonshutdown="on" #在rsyslogd关闭时,要保存队列中数据。
)
stop
}
阅读(3011) | 评论(0) | 转发(0) |