def os
@os ||= (
host_os = RbConfig::CONFIG['host_os']
case host_os
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
:windows
when /darwin|mac os/
:macosx
when /linux/
:linux
when /solaris|bsd/
:unix
else
raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
end
)
end
之前用的方法是假定是windows, 如果不是的话根据异常处理来判断是否是Mac
在上篇: .NET 的 ELK 监控方案 里, 我们将 Logstash 的配置节点 output 这样写:
logstash 会自动从数据中找到 i 这个字段, 并结合 @timestamp 来指定这条数据到要写到哪个 index 下面去.
如果配置中没有指定 @timestamp 从哪里取值, logstash 会默认把第一次读到取这条数据时间做为 @timestamp .
但是请注意, logstash 使用的是 UTC 时间. 这个地方将会引发标题所描述的问题.
比如, 当前时间是 2018-08-17T00:29:59.618+08:00 , 转换为 UTC 时间就成了 2018-08-16T16:29:59.618Z
Logstash 把这个 UTC 时间用来确定数据该存到哪个 Index 里面, 这就导至了 本来是 8月17日的数据, 却被写到 8月16 日的索引下面去了.
如果只是用 Kibana 做为可视化工具, 问题不大.
但是我们每天大概能收集到 100G的日志, 搜索条件多样化 , 在加上对语法不熟悉, Kibana 已经不能给我们提供便捷的使用体验了.
但是对自制的查询工具而言, 又不能跨 index 查询(有重复的日志), 所以这个问题被无限放大了.
要解决这个问题, 又不能作大规模的改动, 最好的办法就是看有什么方法把 @timestamp 用中国时间来表示.
从百度上找了两篇文章, 说用 date filter 来修改时区, 但是写到 es 里的 @timestamp 依然是 UTC 时间, 估计也是行不通, 就没有继续在上面尝试.
和之前的配置比起来, 这个新配置多了一个节点: filter
用 ruby 脚本把事件的 timestamp 的本地时间赋值给 index_day (这个 index_day 并不存在于原始的日志数据中),
然后在 output 节点的 index 中使用这个 index_day. 这样一来每天8点之前的日志就会写到正确的 index 中了.
不过, 每天结束的那几分钟产生的日志有可能会被写到下一天的索引里去..
TimeZone 配置参见 Date Filter , logstash 将日志北京时间保存成utc
Filter Ruby 参见, Logstash Filter Ruby , 不要问我, 我也不会
Output elashtic Index 配置参见 Elasticsearch output plugin
make的时候需要调用ruby很多编译前的参数.一些信息make不知道的话会不知道如何建库.我个人的建议是根据你安装的ruby路径和版本信息把配置选项补充全.下面是我电脑上面的配置,你可以借鉴一下.据我分析应该能解决你的问题.
Provided configuration options:
--with-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/usr/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/local/ruby-2.1.2/rubies/ruby-2.1.2/bin/ruby