Logger for Influxdb in Rails
今天,公司需要把log记录放在influxdb里面记录。因为log量比较大,所以放在influxdb这种时间序列数据库里检索起来比较快捷。
项目的框架是Ruby on Rails,下面我们就来介绍Rails里面用influxdb记录log的方法。全程使用了公司改进的一个开源框架:rails-influxdb-logger,喜欢的欢迎来点赞。
支持版本
- Rails 4 和 5
安装
首先添加这个gem:
gem 'influxdb-logger', '2.0.0'
接着执行:
$ bundle
或者这样安装:
$ gem install influxdb-logger
基础用法
在 config/environments/production.rb
(test.rb
, development.rb
) 中
source-ruby
config.logger = InfluxdbLogger::Logger.new(influxdb_tags: ... tags: ... settings: ... batch_size: ..., interval: ..., async: ...)
默认情况下, influxdb-logger 将记录 duration, db, format, location, message, message_type, method, params, path, severity, status, view
这一系列特定的字段 。
这就意味着我们的 influxdb-logger
使用配置的好处仅仅在于如何和influxdb交流:
source-ruby
config.logger = InfluxdbLogger::Logger.new(settings: {
database: ENV['INFLUXDB_DB_NAME'],
series: ENV['INFLUXDB_SERIES'],
username: ENV['INFLUXDB_USER'],
password: ENV['INFLUXDB_USER_PASSWORD']
})
高级用法
-
influxdb_tags
[Array]: 规定了一系列tag-set。 如果我们需要经常检查关于特定的controller
或action
的influxdb日志, 最好的方法就是利用influxdb_tags
给这两个字段打上tags来加快请求速度:
source-ruby
config.logger = InfluxdbLogger::Logger.new(infludb_tags: [:controller, :action], settings: ...)
-
tags
[Hash]: 如果其余的字段需要被发送到influxdb, 可以利用tags
, 例如ip信息代理:
source-ruby
config.logger = InfluxdbLogger::Logger.new(tags: {
remote_ip: -> request { request.remote_ip }
}, settings: ...)
通过的tags
可以是一个组成任何ruby基础类型的Hash
或者是一个lambda
。
-
settings
: 它定义了influxdb-logger
如何连接到influxdb数据库。 这里是关于它的详细文档:influxdb-ruby.
source-ruby
InfluxdbLogger::Logger.new(settings: {
host: 'influxdb',
retry: 3,
time_precision: 'ms',
database: ENV['INFLUXDB_DB_NAME'],
series: ENV['INFLUXDB_SERIES'],
username: ENV['INFLUXDB_USER'],
password: ENV['INFLUXDB_USER_PASSWORD']
})
-
batch_size
,interval
: 由于logging在任何拥有庞大用户数据库的应用程序环境中都是一个高频次的工作。这两个参数使日志记录操作的分批处理成为可能。
例如,我们可以让logger记录1000次
以上或者距离第一次记录超过1000ms
的logging操作:
source-ruby
InfluxdbLogger::Logger.new(batch_size: 1000, interval: 1000, settings: ...)
-
async
: 决定logger是否被异步地写入到influxdb, 默认是false
。阅读这里的代码以便了解它是如何工作的。
source-ruby
InfluxdbLogger::Logger.new(async: false, settings: ...)
网友评论