Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31972
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 102
  • 用 户 组: 普通用户
  • 注册时间: 2017-04-19 14:41
文章分类

全部博文(9)

文章存档

2017年(9)

我的朋友

分类: LINUX

2017-09-29 14:45:41

每个人的场景,都各有不同。比如,你的全部日志一天大就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) |
给主人留下些什么吧!~~