logstash-logger-yajl 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.rubocop.yml +1156 -0
- data/.travis.yml +26 -0
- data/Appraisals +23 -0
- data/CHANGELOG.md +203 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +880 -0
- data/Rakefile +23 -0
- data/gemfiles/rails_3.2.gemfile +9 -0
- data/gemfiles/rails_4.0.gemfile +9 -0
- data/gemfiles/rails_4.1.gemfile +9 -0
- data/gemfiles/rails_4.2.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +9 -0
- data/lib/logstash-event.rb +1 -0
- data/lib/logstash-logger.rb +11 -0
- data/lib/logstash-logger/buffer.rb +336 -0
- data/lib/logstash-logger/configuration.rb +29 -0
- data/lib/logstash-logger/device.rb +67 -0
- data/lib/logstash-logger/device/aws_stream.rb +94 -0
- data/lib/logstash-logger/device/balancer.rb +40 -0
- data/lib/logstash-logger/device/base.rb +73 -0
- data/lib/logstash-logger/device/connectable.rb +131 -0
- data/lib/logstash-logger/device/file.rb +23 -0
- data/lib/logstash-logger/device/firehose.rb +42 -0
- data/lib/logstash-logger/device/io.rb +11 -0
- data/lib/logstash-logger/device/kafka.rb +57 -0
- data/lib/logstash-logger/device/kinesis.rb +44 -0
- data/lib/logstash-logger/device/multi_delegator.rb +36 -0
- data/lib/logstash-logger/device/redis.rb +69 -0
- data/lib/logstash-logger/device/socket.rb +21 -0
- data/lib/logstash-logger/device/stderr.rb +13 -0
- data/lib/logstash-logger/device/stdout.rb +14 -0
- data/lib/logstash-logger/device/tcp.rb +86 -0
- data/lib/logstash-logger/device/udp.rb +12 -0
- data/lib/logstash-logger/device/unix.rb +18 -0
- data/lib/logstash-logger/formatter.rb +51 -0
- data/lib/logstash-logger/formatter/base.rb +73 -0
- data/lib/logstash-logger/formatter/cee.rb +11 -0
- data/lib/logstash-logger/formatter/cee_syslog.rb +22 -0
- data/lib/logstash-logger/formatter/json.rb +11 -0
- data/lib/logstash-logger/formatter/json_lines.rb +11 -0
- data/lib/logstash-logger/formatter/logstash_event.rb +6 -0
- data/lib/logstash-logger/logger.rb +106 -0
- data/lib/logstash-logger/multi_logger.rb +153 -0
- data/lib/logstash-logger/railtie.rb +51 -0
- data/lib/logstash-logger/silenced_logging.rb +83 -0
- data/lib/logstash-logger/tagged_logging.rb +40 -0
- data/lib/logstash-logger/version.rb +3 -0
- data/lib/logstash/event.rb +272 -0
- data/lib/logstash/namespace.rb +15 -0
- data/lib/logstash/util.rb +105 -0
- data/lib/logstash/util/fieldreference.rb +49 -0
- data/logstash-logger.gemspec +42 -0
- data/samples/example.crt +16 -0
- data/samples/example.key +15 -0
- data/samples/file.conf +11 -0
- data/samples/redis.conf +12 -0
- data/samples/ssl.conf +15 -0
- data/samples/syslog.conf +10 -0
- data/samples/tcp.conf +11 -0
- data/samples/udp.conf +11 -0
- data/samples/unix.conf +11 -0
- data/spec/configuration_spec.rb +27 -0
- data/spec/constructor_spec.rb +30 -0
- data/spec/device/balancer_spec.rb +31 -0
- data/spec/device/connectable_spec.rb +74 -0
- data/spec/device/file_spec.rb +15 -0
- data/spec/device/firehose_spec.rb +41 -0
- data/spec/device/io_spec.rb +13 -0
- data/spec/device/kafka_spec.rb +32 -0
- data/spec/device/kinesis_spec.rb +41 -0
- data/spec/device/multi_delegator_spec.rb +31 -0
- data/spec/device/redis_spec.rb +52 -0
- data/spec/device/socket_spec.rb +15 -0
- data/spec/device/stderr_spec.rb +16 -0
- data/spec/device/stdout_spec.rb +31 -0
- data/spec/device/tcp_spec.rb +120 -0
- data/spec/device/udp_spec.rb +9 -0
- data/spec/device/unix_spec.rb +23 -0
- data/spec/device_spec.rb +97 -0
- data/spec/formatter/base_spec.rb +125 -0
- data/spec/formatter/cee_spec.rb +15 -0
- data/spec/formatter/cee_syslog_spec.rb +43 -0
- data/spec/formatter/json_lines_spec.rb +14 -0
- data/spec/formatter/json_spec.rb +10 -0
- data/spec/formatter/logstash_event_spec.rb +10 -0
- data/spec/formatter_spec.rb +79 -0
- data/spec/logger_spec.rb +128 -0
- data/spec/logstash_event_spec.rb +139 -0
- data/spec/multi_logger_spec.rb +59 -0
- data/spec/rails_spec.rb +91 -0
- data/spec/silenced_logging_spec.rb +31 -0
- data/spec/spec_helper.rb +111 -0
- data/spec/syslog_spec.rb +32 -0
- data/spec/tagged_logging_spec.rb +32 -0
- metadata +385 -0
data/.travis.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
language: ruby
|
2
|
+
dist: trusty
|
3
|
+
sudo: false
|
4
|
+
cache: bundler
|
5
|
+
before_install:
|
6
|
+
- gem update --system
|
7
|
+
- gem install bundler
|
8
|
+
after_success:
|
9
|
+
bundle exec codeclimate-test-reporter
|
10
|
+
rvm:
|
11
|
+
- 2.2.7
|
12
|
+
- 2.3.4
|
13
|
+
- 2.4.1
|
14
|
+
- 2.5.0
|
15
|
+
- jruby-9.1.5.0
|
16
|
+
- rubinius-3
|
17
|
+
gemfile:
|
18
|
+
- gemfiles/rails_4.2.gemfile
|
19
|
+
- gemfiles/rails_5.0.gemfile
|
20
|
+
- gemfiles/rails_5.1.gemfile
|
21
|
+
matrix:
|
22
|
+
allow_failures:
|
23
|
+
- rvm: rubinius-3
|
24
|
+
addons:
|
25
|
+
code_climate:
|
26
|
+
repo_token: 4d712355fa2863c0f33f413eeede4e52cc221c4bc989a692d97574b1f6010b69
|
data/Appraisals
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#appraise "rails-3.2" do
|
2
|
+
#gem "rails", "~> 3.2.18"
|
3
|
+
#end
|
4
|
+
|
5
|
+
appraise "rails-4.0" do
|
6
|
+
gem "rails", "~> 4.0.0"
|
7
|
+
end
|
8
|
+
|
9
|
+
appraise "rails-4.1" do
|
10
|
+
gem "rails", "~> 4.1.1"
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise "rails-4.2" do
|
14
|
+
gem "rails", "~> 4.2.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
appraise "rails-5.0" do
|
18
|
+
gem "rails", "~> 5.0.0"
|
19
|
+
end
|
20
|
+
|
21
|
+
appraise "rails-5.1" do
|
22
|
+
gem "rails", "~> 5.1.0"
|
23
|
+
end
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
## 0.27.0
|
2
|
+
|
3
|
+
- Merge in logstash-event and change the default JSON library to Yajl
|
4
|
+
|
5
|
+
## 0.26.1
|
6
|
+
|
7
|
+
- Fix: Support for SSL with the TCP device without an SSL context in Ruby
|
8
|
+
2.4+. [#144](https://github.com/dwbutler/logstash-logger/issues/144)
|
9
|
+
|
10
|
+
## 0.26.0
|
11
|
+
|
12
|
+
- Allow user configuration of the logger class. [#129](https://github.com/dwbutler/logstash-logger/pull/129)
|
13
|
+
- Fix: Allow type to be a string for multi_logger and syslog. [#131](https://github.com/dwbutler/logstash-logger/pull/131)
|
14
|
+
- Fix: Cancelled events are being logged. [#133](https://github.com/dwbutler/logstash-logger/issues/133)
|
15
|
+
- Fix: Expose method to reset logger state. [#138](https://github.com/dwbutler/logstash-logger/pull/138)
|
16
|
+
- Use specific AWS SDK gems. [#136](https://github.com/dwbutler/logstash-logger/pull/136)
|
17
|
+
- Adds support for using the default AWS credential provider chain. [#141](https://github.com/dwbutler/logstash-logger/pull/141)
|
18
|
+
|
19
|
+
## 0.25.1
|
20
|
+
|
21
|
+
- Skip message truncating when there is no message field. [#130](https://github.com/dwbutler/logstash-logger/pull/130)
|
22
|
+
|
23
|
+
## 0.25.0
|
24
|
+
|
25
|
+
- Drops support for Rails 3.2, MRI Ruby < 2.2, and JRuby 1.7, since these have been EOL'ed.
|
26
|
+
- Adds support for customizing events on a per-logger level. [#113](https://github.com/dwbutler/logstash-logger/pull/113)
|
27
|
+
|
28
|
+
## 0.24.1
|
29
|
+
|
30
|
+
- Fixes logging of a hash with symbol keys. [#116](https://github.com/dwbutler/logstash-logger/pull/116)
|
31
|
+
|
32
|
+
## 0.24.0
|
33
|
+
|
34
|
+
- Adds support for AWS Firehose. [#121](https://github.com/dwbutler/logstash-logger/pull/121)
|
35
|
+
|
36
|
+
## 0.23.0
|
37
|
+
|
38
|
+
- Adds support for SSL host verification to the TCP device. [#114](https://github.com/dwbutler/logstash-logger/pull/114)
|
39
|
+
- Fixes `NoMethodError` when `nil` tags are used in tagged logging. [#123](https://github.com/dwbutler/logstash-logger/issues/123)
|
40
|
+
|
41
|
+
## 0.22.1
|
42
|
+
|
43
|
+
- Fixes compatibility with ActiveJob. [#112](https://github.com/dwbutler/logstash-logger/issues/112)
|
44
|
+
|
45
|
+
## 0.22.0
|
46
|
+
|
47
|
+
- Adds support for writing to Amazon Kinesis. [#111](https://github.com/dwbutler/logstash-logger/pull/111)
|
48
|
+
|
49
|
+
## 0.21.0
|
50
|
+
|
51
|
+
- Support for merging top level configuration in MultiLogger and
|
52
|
+
MultiDelegator. [#108](https://github.com/dwbutler/logstash-logger/pull/108)
|
53
|
+
|
54
|
+
## 0.20.1
|
55
|
+
|
56
|
+
- Fixes missing require for URI [#107](https://github.com/dwbutler/logstash-logger/pull/107)
|
57
|
+
|
58
|
+
## 0.20.0
|
59
|
+
|
60
|
+
- Adds support for logging debug/error information for the connectable device's buffer. [#102](https://github.com/dwbutler/logstash-logger/pull/102)
|
61
|
+
|
62
|
+
## 0.19.2
|
63
|
+
|
64
|
+
- Fixes mutex and memory leak issues when resetting buffer.
|
65
|
+
[#97](https://github.com/dwbutler/logstash-logger/issues/97)
|
66
|
+
[#98](https://github.com/dwbutler/logstash-logger/issues/98)
|
67
|
+
[#99](https://github.com/dwbutler/logstash-logger/issues/99)
|
68
|
+
|
69
|
+
## 0.19.1
|
70
|
+
|
71
|
+
- Fixes compatibility with `ActiveRecord::SessionStore`. [#96](https://github.com/dwbutler/logstash-logger/pull/96)
|
72
|
+
|
73
|
+
## 0.19.0
|
74
|
+
|
75
|
+
- Flush buffered messages when exiting. [#92](https://github.com/dwbutler/logstash-logger/pull/92)
|
76
|
+
|
77
|
+
## 0.18.1
|
78
|
+
|
79
|
+
- Fixes usage of ActiveSupport without Rails. [#90](https://github.com/dwbutler/logstash-logger/pull/90)
|
80
|
+
|
81
|
+
## 0.18.0
|
82
|
+
|
83
|
+
This release removes the dependency on `stud` and vendors in a forked version
|
84
|
+
of `Stud::Buffer`. This improves the buffering behavior of LogStashLogger by
|
85
|
+
flushing all log messages in a background thread by default. This eliminates
|
86
|
+
blocking behavior and exceptions bubbling up to the main process.
|
87
|
+
|
88
|
+
- Fixes `Attempt to unlock a mutex which is not locked (ThreadError)`.
|
89
|
+
[#88](https://github.com/dwbutler/logstash-logger/issues/88)
|
90
|
+
|
91
|
+
## 0.17.0
|
92
|
+
- Support for logger silencing. [#87](https://github.com/dwbutler/logstash-logger/pull/87)
|
93
|
+
- Fixes Rails 5 support. [#86](https://github.com/dwbutler/logstash-logger/issues/86)
|
94
|
+
- Fixes support for tagged logging in MultiLogger.
|
95
|
+
|
96
|
+
## 0.16.0
|
97
|
+
|
98
|
+
This release is focused on improving the reliability of LogStashLogger.
|
99
|
+
Connectable log devices are now less likely to block or
|
100
|
+
raise an exception, which avoids impacting the operation of the program. There was
|
101
|
+
also a fix to avoid leaking connections.
|
102
|
+
|
103
|
+
- Allow log messages to be dropped. [#81](https://github.com/dwbutler/logstash-logger/pull/81)
|
104
|
+
- Provide `max_message_size` option. [#80](https://github.com/dwbutler/logstash-logger/pull/80)
|
105
|
+
- Unify error logging. [#82](https://github.com/dwbutler/logstash-logger/pull/82)
|
106
|
+
- Drop message when there is an unrecoverable error. [#83](https://github.com/dwbutler/logstash-logger/pull/83)
|
107
|
+
- Safely close connection when reconnecting. [#84](https://github.com/dwbutler/logstash-logger/pull/84)
|
108
|
+
|
109
|
+
## 0.15.2
|
110
|
+
- Fixes Windows support. [#64](https://github.com/dwbutler/logstash-logger/issues/64)
|
111
|
+
|
112
|
+
## 0.15.1
|
113
|
+
- Fixes MultiLogger overriding each logger with the default formatter. [#61](https://github.com/dwbutler/logstash-logger/issues/61)
|
114
|
+
|
115
|
+
## 0.15.0
|
116
|
+
- Adds buffering and automatic retry support for all connectable outputs. [#35](https://github.com/dwbutler/logstash-logger/pull/35)
|
117
|
+
|
118
|
+
## 0.14.1
|
119
|
+
- Fixes MultiLogger tagged logging in Rails. [#60](https://github.com/dwbutler/logstash-logger/pull/60)
|
120
|
+
|
121
|
+
## 0.14.0
|
122
|
+
- Support for Syslog output. [#59](https://github.com/dwbutler/logstash-logger/pull/59)
|
123
|
+
|
124
|
+
## 0.13.0
|
125
|
+
- Support for sending messages to multiple loggers. Each one can have a different formatter. [#58](https://github.com/dwbutler/logstash-logger/pull/58)
|
126
|
+
- Fixes tagged logging support when using a custom formatter.
|
127
|
+
|
128
|
+
## 0.12.0
|
129
|
+
- Support for other formatters, including custom formatters. [#56](https://github.com/dwbutler/logstash-logger/pull/56)
|
130
|
+
- Support for CEE output.
|
131
|
+
|
132
|
+
## 0.11.0
|
133
|
+
- Support for balancer log device. [#55](https://github.com/dwbutler/logstash-logger/pull/55)
|
134
|
+
|
135
|
+
## 0.10.3
|
136
|
+
- Merge URI and non-URI configuration. [#54](https://github.com/dwbutler/logstash-logger/pull/54)
|
137
|
+
|
138
|
+
## 0.10.2
|
139
|
+
- Fix for Custom Events can't access tags from Tagged Logging. [#48](https://github.com/dwbutler/logstash-logger/issues/48)
|
140
|
+
|
141
|
+
## 0.10.1
|
142
|
+
- Fix for Redis URI parsing issue. [#41](https://github.com/dwbutler/logstash-logger/issues/41)
|
143
|
+
|
144
|
+
## 0.10.0
|
145
|
+
- Support for logging to Kafka. [#37](https://github.com/dwbutler/logstash-logger/issues/37)
|
146
|
+
|
147
|
+
## 0.9.0
|
148
|
+
- Support for customizing the fields on all logged messages via configuration. [#32](https://github.com/dwbutler/logstash-logger/pull/32)
|
149
|
+
|
150
|
+
## 0.8.0
|
151
|
+
- Support for logging to stderr. [#24](https://github.com/dwbutler/logstash-logger/pull/25)
|
152
|
+
- Support multiple log outputs. [#28](https://github.com/dwbutler/logstash-logger/pull/28)
|
153
|
+
|
154
|
+
## 0.7.0
|
155
|
+
- Support for logging to a generic IO object.
|
156
|
+
- Support for overriding IO in stdout logger. [#20](https://github.com/dwbutler/logstash-logger/pull/20)
|
157
|
+
- Support for configuring logger with a URI. [#22](https://github.com/dwbutler/logstash-logger/pull/22)
|
158
|
+
- Support logging any object. [#23](https://github.com/dwbutler/logstash-logger/issues/23)
|
159
|
+
|
160
|
+
## 0.6.2
|
161
|
+
- Allow type to be specified as a string. [#19](https://github.com/dwbutler/logstash-logger/pull/19)
|
162
|
+
|
163
|
+
## 0.6.1
|
164
|
+
- Don't mutate options passed to LogStashLogger. [#18](https://github.com/dwbutler/logstash-logger/pull/18)
|
165
|
+
|
166
|
+
## 0.6.0
|
167
|
+
- Support for logging to a file.
|
168
|
+
- Support for logging to a Redis list.
|
169
|
+
- Support for logging to a local Unix socket.
|
170
|
+
- Railtie supports file logger, using default log path and `config.autoflush_log` configuration.
|
171
|
+
- All `LogStashLogger` types now support a `sync` option, which controls if each message is automatically flushed.
|
172
|
+
|
173
|
+
## 0.5.0
|
174
|
+
- Support for tagged logging. The interface was extracted from `ActiveSupport::TaggedLogging`
|
175
|
+
and outputs to the `tags` key.
|
176
|
+
- The `(host, port, type)` constructor has been deprecated in favor of an options hash constructor.
|
177
|
+
- Support for using SSL for TCP connections.
|
178
|
+
- Support for configuring logger to write to STDOUT.
|
179
|
+
- Support for Rails configuration.
|
180
|
+
- Fixed output to STDOUT in Rails console (Rails 4+).
|
181
|
+
- `host` is no longer required for TCP/UDP. It will default to `0.0.0.0`, the same default port that logstash listens on.
|
182
|
+
- Changed event key `source` to `host` to match what the latest logstash expects.
|
183
|
+
- Output event timestamp consistently even if `Time#to_json` is overridden.
|
184
|
+
- Major refactoring which will lead the way to support other log types.
|
185
|
+
|
186
|
+
## 0.4.1
|
187
|
+
- Fixed support for `LogStash::Event` v1 format when logging a hash. Extra data
|
188
|
+
now goes to the top level instead of into the `@fields` key.
|
189
|
+
|
190
|
+
## 0.4.0
|
191
|
+
- Support for new `LogStash::Event` v1 format. v0 is supported in 0.3+.
|
192
|
+
|
193
|
+
## 0.3.0
|
194
|
+
- Added support for logging to a UDP listener.
|
195
|
+
|
196
|
+
## 0.2.1
|
197
|
+
- Fixed to use Logstash's default time format for timestamps.
|
198
|
+
|
199
|
+
## 0.2.0
|
200
|
+
- Better use of Ruby Logger's built-in LogDevice.
|
201
|
+
|
202
|
+
## 0.1.0
|
203
|
+
- Initial release. Support for logging to a TCP listener.
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 David Butler
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,880 @@
|
|
1
|
+
# LogStashLogger
|
2
|
+
[](https://travis-ci.org/dwbutler/logstash-logger) [](https://codeclimate.com/github/dwbutler/logstash-logger) [](http://codecov.io/github/dwbutler/logstash-logger?branch=master) [](https://badge.fury.io/rb/logstash-logger)
|
3
|
+
|
4
|
+
LogStashLogger extends Ruby's `Logger` class to log directly to
|
5
|
+
[Logstash](https://www.elastic.co/products/logstash).
|
6
|
+
It supports writing to various outputs in logstash JSON format. This is an improvement over
|
7
|
+
writing to a file or syslog since Logstash can receive the structured data directly.
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
* Can write directly to a logstash listener over a UDP or TCP/SSL connection.
|
12
|
+
* Can write to a file, Redis, Kafka, Kinesis, Firehose, a unix socket, syslog, stdout, or stderr.
|
13
|
+
* Logger can take a string message, a hash, a `LogStash::Event`, an object, or a JSON string as input.
|
14
|
+
* Events are automatically populated with message, timestamp, host, and severity.
|
15
|
+
* Writes in logstash JSON format, but supports other formats as well.
|
16
|
+
* Can write to multiple outputs.
|
17
|
+
* Log messages are buffered and automatically re-sent if there is a connection problem.
|
18
|
+
* Easily integrates with Rails via configuration.
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
Add this line to your application's Gemfile:
|
23
|
+
|
24
|
+
gem 'logstash-logger'
|
25
|
+
|
26
|
+
And then execute:
|
27
|
+
|
28
|
+
$ bundle
|
29
|
+
|
30
|
+
Or install it yourself as:
|
31
|
+
|
32
|
+
$ gem install logstash-logger
|
33
|
+
|
34
|
+
## Usage Examples
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
require 'logstash-logger'
|
38
|
+
|
39
|
+
# Defaults to UDP on 0.0.0.0
|
40
|
+
logger = LogStashLogger.new(port: 5228)
|
41
|
+
|
42
|
+
# Specify host and type (UDP or TCP) explicitly
|
43
|
+
udp_logger = LogStashLogger.new(type: :udp, host: 'localhost', port: 5228)
|
44
|
+
tcp_logger = LogStashLogger.new(type: :tcp, host: 'localhost', port: 5229)
|
45
|
+
|
46
|
+
# Other types of loggers
|
47
|
+
file_logger = LogStashLogger.new(type: :file, path: 'log/development.log', sync: true)
|
48
|
+
unix_logger = LogStashLogger.new(type: :unix, path: '/tmp/sock')
|
49
|
+
syslog_logger = LogStashLogger.new(type: :syslog)
|
50
|
+
redis_logger = LogStashLogger.new(type: :redis)
|
51
|
+
kafka_logger = LogStashLogger.new(type: :kafka)
|
52
|
+
stdout_logger = LogStashLogger.new(type: :stdout)
|
53
|
+
stderr_logger = LogStashLogger.new(type: :stderr)
|
54
|
+
io_logger = LogStashLogger.new(type: :io, io: io)
|
55
|
+
|
56
|
+
# Use a different formatter
|
57
|
+
cee_logger = LogStashLogger.new(
|
58
|
+
type: :tcp,
|
59
|
+
host: 'logsene-receiver-syslog.sematext.com',
|
60
|
+
port: 514,
|
61
|
+
formatter: :cee_syslog
|
62
|
+
)
|
63
|
+
|
64
|
+
custom_formatted_logger = LogStashLogger.new(
|
65
|
+
type: :redis,
|
66
|
+
formatter: MyCustomFormatter
|
67
|
+
)
|
68
|
+
|
69
|
+
lambda_formatted_logger = LogStashLogger.new(
|
70
|
+
type: :stdout,
|
71
|
+
formatter: ->(severity, time, progname, msg) { "[#{progname}] #{msg}" }
|
72
|
+
)
|
73
|
+
|
74
|
+
ruby_default_formatter_logger = LogStashLogger.new(
|
75
|
+
type: :file,
|
76
|
+
path: 'log/development.log',
|
77
|
+
formatter: ::Logger::Formatter
|
78
|
+
)
|
79
|
+
|
80
|
+
# Send messages to multiple outputs. Each output will have the same format.
|
81
|
+
# Syslog cannot be an output because it requires a separate logger.
|
82
|
+
multi_delegating_logger = LogStashLogger.new(
|
83
|
+
type: :multi_delegator,
|
84
|
+
outputs: [
|
85
|
+
{ type: :file, path: 'log/development.log' },
|
86
|
+
{ type: :udp, host: 'localhost', port: 5228 }
|
87
|
+
])
|
88
|
+
|
89
|
+
# Balance messages between several outputs.
|
90
|
+
# Works the same as multi delegator, but randomly chooses an output to send each message.
|
91
|
+
balancer_logger = LogStashLogger.new(
|
92
|
+
type: :balancer,
|
93
|
+
outputs: [
|
94
|
+
{ type: :udp, host: 'host1', port: 5228 },
|
95
|
+
{ type: :udp, host: 'host2', port: 5228 }
|
96
|
+
])
|
97
|
+
|
98
|
+
# Send messages to multiple loggers.
|
99
|
+
# Use this if you need to send different formats to different outputs.
|
100
|
+
# If you need to log to syslog, you must use this.
|
101
|
+
multi_logger = LogStashLogger.new(
|
102
|
+
type: :multi_logger,
|
103
|
+
outputs: [
|
104
|
+
{ type: :file, path: 'log/development.log', formatter: ::Logger::Formatter },
|
105
|
+
{ type: :tcp, host: 'localhost', port: 5228, formatter: :json }
|
106
|
+
])
|
107
|
+
|
108
|
+
# The following messages are written to UDP port 5228:
|
109
|
+
|
110
|
+
logger.info 'test'
|
111
|
+
# {"message":"test","@timestamp":"2014-05-22T09:37:19.204-07:00","@version":"1","severity":"INFO","host":"[hostname]"}
|
112
|
+
|
113
|
+
logger.error '{"message": "error"}'
|
114
|
+
# {"message":"error","@timestamp":"2014-05-22T10:10:55.877-07:00","@version":"1","severity":"ERROR","host":"[hostname]"}
|
115
|
+
|
116
|
+
logger.debug message: 'test', foo: 'bar'
|
117
|
+
# {"message":"test","foo":"bar","@timestamp":"2014-05-22T09:43:24.004-07:00","@version":"1","severity":"DEBUG","host":"[hostname]"}
|
118
|
+
|
119
|
+
logger.warn LogStash::Event.new(message: 'test', foo: 'bar')
|
120
|
+
# {"message":"test","foo":"bar","@timestamp":"2014-05-22T16:44:37.364Z","@version":"1","severity":"WARN","host":"[hostname]"}
|
121
|
+
|
122
|
+
# Tagged logging
|
123
|
+
logger.tagged('foo') { logger.fatal('bar') }
|
124
|
+
# {"message":"bar","@timestamp":"2014-05-26T20:35:14.685-07:00","@version":"1","severity":"FATAL","host":"[hostname]","tags":["foo"]}
|
125
|
+
```
|
126
|
+
|
127
|
+
## URI Configuration
|
128
|
+
You can use a URI to configure your logstash logger instead of a hash. This is useful in environments
|
129
|
+
such as Heroku where you may want to read configuration values from the environment. The URI scheme
|
130
|
+
is `type://host:port/path?key=value`. Some sample URI configurations are given below.
|
131
|
+
|
132
|
+
```
|
133
|
+
udp://localhost:5228
|
134
|
+
tcp://localhost:5229
|
135
|
+
unix:///tmp/socket
|
136
|
+
file:///path/to/file
|
137
|
+
redis://localhost:6379
|
138
|
+
kafka://localhost:9092
|
139
|
+
stdout:/
|
140
|
+
stderr:/
|
141
|
+
```
|
142
|
+
|
143
|
+
Pass the URI into your logstash logger like so:
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
# Read the URI from an environment variable
|
147
|
+
logger = LogStashLogger.new(uri: ENV['LOGSTASH_URI'])
|
148
|
+
```
|
149
|
+
|
150
|
+
## Logstash Listener Configuration
|
151
|
+
|
152
|
+
In order for logstash to correctly receive and parse the events, you will need to
|
153
|
+
configure and run a listener that uses the `json_lines` codec. For example, to receive
|
154
|
+
events over UDP on port 5228:
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
input {
|
158
|
+
udp {
|
159
|
+
host => "0.0.0.0"
|
160
|
+
port => 5228
|
161
|
+
codec => json_lines
|
162
|
+
}
|
163
|
+
}
|
164
|
+
```
|
165
|
+
|
166
|
+
File and Redis inputs should use the `json` codec instead. For more information
|
167
|
+
read the [Logstash docs](https://www.elastic.co/guide/en/logstash/current/plugins-codecs-json_lines.html).
|
168
|
+
|
169
|
+
See the [samples](https://github.com/dwbutler/logstash-logger/tree/master/samples) directory for more configuration samples.
|
170
|
+
|
171
|
+
## SSL
|
172
|
+
|
173
|
+
If you are using TCP then there is the option of adding an SSL certificate to the options hash on initialize.
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
LogStashLogger.new(type: :tcp, port: 5228, ssl_certificate: "/path/to/certificate.crt")
|
177
|
+
```
|
178
|
+
|
179
|
+
The SSL certificate and key can be generated using
|
180
|
+
|
181
|
+
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash.key -out logstash.crt
|
182
|
+
|
183
|
+
You can also enable SSL without a certificate:
|
184
|
+
|
185
|
+
```ruby
|
186
|
+
LogStashLogger.new(type: :tcp, port: 5228, ssl_enable: true)
|
187
|
+
```
|
188
|
+
|
189
|
+
Specify an SSL context to have more control over the behavior. For example,
|
190
|
+
set the verify mode:
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
194
|
+
ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_NONE)
|
195
|
+
LogStashLogger.new(type: :tcp, port: 5228, ssl_context: ctx)
|
196
|
+
```
|
197
|
+
|
198
|
+
The following Logstash configuration is required for SSL:
|
199
|
+
|
200
|
+
```ruby
|
201
|
+
input {
|
202
|
+
tcp {
|
203
|
+
host => "0.0.0.0"
|
204
|
+
port => 5228
|
205
|
+
codec => json_lines
|
206
|
+
ssl_enable => true
|
207
|
+
ssl_cert => "/path/to/certificate.crt"
|
208
|
+
ssl_key => "/path/to/key.key"
|
209
|
+
}
|
210
|
+
}
|
211
|
+
```
|
212
|
+
|
213
|
+
### Hostname Verification
|
214
|
+
|
215
|
+
Hostname verification is enabled by default. Without further configuration,
|
216
|
+
the hostname supplied to `:host` will be used to verify the server's certificate
|
217
|
+
identity.
|
218
|
+
|
219
|
+
If you don't pass an `:ssl_context` or pass a falsey value to the
|
220
|
+
`:verify_hostname` option, hostname verification will not occur.
|
221
|
+
|
222
|
+
#### Examples
|
223
|
+
|
224
|
+
**Verify the hostname from the `:host` option**
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
228
|
+
ctx.cert = '/path/to/cert.pem'
|
229
|
+
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
230
|
+
|
231
|
+
LogStashLogger.new \
|
232
|
+
type: :tcp,
|
233
|
+
host: 'logstash.example.com'
|
234
|
+
port: 5228,
|
235
|
+
ssl_context: ctx
|
236
|
+
```
|
237
|
+
|
238
|
+
**Verify a hostname different from the `:host` option**
|
239
|
+
|
240
|
+
```ruby
|
241
|
+
LogStashLogger.new \
|
242
|
+
type: :tcp,
|
243
|
+
host: '1.2.3.4'
|
244
|
+
port: 5228,
|
245
|
+
ssl_context: ctx,
|
246
|
+
verify_hostname: 'server.example.com'
|
247
|
+
```
|
248
|
+
|
249
|
+
**Explicitly disable hostname verification**
|
250
|
+
|
251
|
+
```ruby
|
252
|
+
LogStashLogger.new \
|
253
|
+
type: :tcp,
|
254
|
+
host: '1.2.3.4'
|
255
|
+
port: 5228,
|
256
|
+
ssl_context: ctx,
|
257
|
+
verify_hostname: false
|
258
|
+
```
|
259
|
+
|
260
|
+
## Custom Log Fields
|
261
|
+
|
262
|
+
`LogStashLogger` by default will log a JSON object with the format below.
|
263
|
+
|
264
|
+
```json
|
265
|
+
{
|
266
|
+
"message":"Some Message",
|
267
|
+
"@timestamp":"2015-01-29T10:43:32.196-05:00",
|
268
|
+
"@version":"1",
|
269
|
+
"severity":"INFO",
|
270
|
+
"host":"hostname"
|
271
|
+
}
|
272
|
+
```
|
273
|
+
|
274
|
+
Some applications may need to attach additional metadata to each message.
|
275
|
+
The `LogStash::Event` can be manipulated directly by specifying a `customize_event` block in the `LogStashLogger` configuration.
|
276
|
+
|
277
|
+
```ruby
|
278
|
+
config = LogStashLogger.configure do |config|
|
279
|
+
config.customize_event do |event|
|
280
|
+
event["other_field"] = "some_other_value"
|
281
|
+
end
|
282
|
+
end
|
283
|
+
```
|
284
|
+
|
285
|
+
This configuration would result in the following output.
|
286
|
+
|
287
|
+
```json
|
288
|
+
{
|
289
|
+
"message": "Some Message",
|
290
|
+
"@timestamp": "2015-01-29T10:43:32.196-05:00",
|
291
|
+
"@version": "1",
|
292
|
+
"severity": "INFO",
|
293
|
+
"host": "hostname",
|
294
|
+
"other_field": "some_other_value"
|
295
|
+
}
|
296
|
+
```
|
297
|
+
|
298
|
+
This block has full access to the event, so you can remove fields, modify
|
299
|
+
existing fields, etc. For example, to remove the default timestamp:
|
300
|
+
|
301
|
+
```ruby
|
302
|
+
config = LogStashLogger.configure do |config|
|
303
|
+
config.customize_event do |event|
|
304
|
+
event.remove('@timestamp')
|
305
|
+
end
|
306
|
+
end
|
307
|
+
```
|
308
|
+
|
309
|
+
You can also customize events on a per-logger basis by passing a callable object
|
310
|
+
(lambda or proc) to the `customize_event` option when creating a logger:
|
311
|
+
|
312
|
+
```ruby
|
313
|
+
LogStashLogger.new(customize_event: ->(event){ event['other_field'] = 'other_field' })
|
314
|
+
```
|
315
|
+
|
316
|
+
## Buffering / Automatic Retries
|
317
|
+
|
318
|
+
For devices that establish a connection to a remote service, log messages are buffered internally
|
319
|
+
and flushed in a background thread. If there is a connection problem, the
|
320
|
+
messages are held in the buffer and automatically resent until it is successful.
|
321
|
+
Outputs that support batch writing (Redis and Kafka) will write log messages in bulk from the
|
322
|
+
buffer. This functionality is implemented using a fork of
|
323
|
+
[Stud::Buffer](https://github.com/jordansissel/ruby-stud/blob/master/lib/stud/buffer.rb).
|
324
|
+
You can configure its behavior by passing the following options to LogStashLogger:
|
325
|
+
|
326
|
+
* :buffer_max_items - Max number of items to buffer before flushing. Defaults to 50.
|
327
|
+
* :buffer_max_interval - Max number of seconds to wait between flushes. Defaults to 5.
|
328
|
+
* :drop_messages_on_flush_error - Drop messages when there is a flush error. Defaults to false.
|
329
|
+
* :drop_messages_on_full_buffer - Drop messages when the buffer is full. Defaults to true.
|
330
|
+
* :sync - Flush buffer every time a message is received (blocking). Defaults to false.
|
331
|
+
* :buffer_flush_at_exit - Flush messages when exiting the program. Defaults to true.
|
332
|
+
* :buffer_logger - Logger to write buffer debug/error messages to. Defaults to none.
|
333
|
+
|
334
|
+
You can turn buffering off by setting `sync = true`.
|
335
|
+
|
336
|
+
Please be aware of the following caveats to this behavior:
|
337
|
+
|
338
|
+
* It's possible for duplicate log messages to be sent when retrying. For outputs like Redis and
|
339
|
+
Kafka that write in batches, the whole batch could get re-sent. If this is a problem, you
|
340
|
+
can add a UUID field to each event to uniquely identify it. You can either do this
|
341
|
+
in a `customize_event` block, or by using logstash's
|
342
|
+
[UUID filter](https://www.elastic.co/guide/en/logstash/current/plugins-filters-uuid.html).
|
343
|
+
* It's still possible to lose log messages. Ruby won't detect a TCP/UDP connection problem
|
344
|
+
immediately. In my testing, it took Ruby about 4 seconds to notice the receiving end was down
|
345
|
+
and start raising exceptions. Since logstash listeners over TCP/UDP do not acknowledge received
|
346
|
+
messages, it's not possible to know which log messages to re-send.
|
347
|
+
* When `sync` is turned off, Ruby may buffer data internally before writing to
|
348
|
+
the IO device. This is why you may not see messages written immediately to a
|
349
|
+
UDP or TCP socket, even though LogStashLogger's buffer is periodically flushed.
|
350
|
+
|
351
|
+
## Full Buffer
|
352
|
+
|
353
|
+
By default, messages are discarded when the buffer gets full. This can happen
|
354
|
+
if the output source is down for too long or log messages are being received
|
355
|
+
too quickly. If your application suddenly terminates (for example, by SIGKILL or a power outage),
|
356
|
+
the whole buffer will be lost.
|
357
|
+
|
358
|
+
You can make message loss less likely by increasing `buffer_max_items`
|
359
|
+
(so that more events can be held in the buffer), and decreasing `buffer_max_interval` (to wait
|
360
|
+
less time between flushes). This will increase memory pressure on your application as log messages
|
361
|
+
accumulate in the buffer, so make sure you have allocated enough memory to your process.
|
362
|
+
|
363
|
+
If you don't want to lose messages when the buffer gets full, you can set
|
364
|
+
`drop_messages_on_full_buffer = false`. Note that if the buffer gets full, any
|
365
|
+
incoming log message will block, which could be undesirable.
|
366
|
+
|
367
|
+
## Sync Mode
|
368
|
+
|
369
|
+
All logger outputs support a `sync` setting. This is analogous to the "sync mode" setting on Ruby IO
|
370
|
+
objects. When set to `true`, output is immediately flushed and is not buffered internally. Normally,
|
371
|
+
for devices that connect to a remote service, buffering is a good thing because
|
372
|
+
it improves performance and reduces the likelihood of errors affecting the program. For these devices,
|
373
|
+
`sync` defaults to `false`, and it is recommended to leave the default value.
|
374
|
+
You may want to turn sync mode on for testing, for example if you want to see
|
375
|
+
log messages immediately after they are written.
|
376
|
+
|
377
|
+
It is recommended to turn sync mode on for file and Unix socket outputs. This
|
378
|
+
ensures that log messages from different threads or proceses are written correctly on separate lines.
|
379
|
+
|
380
|
+
See [#44](https://github.com/dwbutler/logstash-logger/issues/44) for more details.
|
381
|
+
|
382
|
+
## Error Handling
|
383
|
+
|
384
|
+
If an exception occurs while writing a message to the device, the exception is
|
385
|
+
logged using an internal logger. By default, this logs to $stderr. You can
|
386
|
+
change the error logger by setting `LogStashLogger.configuration.default_error_logger`, or by passsing
|
387
|
+
your own logger object in the `:error_logger` configuration key when
|
388
|
+
instantiating a LogStashLogger.
|
389
|
+
|
390
|
+
## Logger Silencing
|
391
|
+
|
392
|
+
LogStashLogger provides support for Rails-style logger silencing. The
|
393
|
+
implementation was extracted from Rails, but has no dependencies, so it can be
|
394
|
+
used outside of a Rails app. The interface is the same as in Rails:
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
logger.silence(temporary_level) do
|
398
|
+
...
|
399
|
+
end
|
400
|
+
```
|
401
|
+
|
402
|
+
## Custom Logger Class
|
403
|
+
|
404
|
+
By default, LogStashLogger creates a logger that extends Ruby's built in `Logger` class.
|
405
|
+
If you require a different logger implementation, you can use a different class
|
406
|
+
by passing in the class with the `logger_class` option.
|
407
|
+
|
408
|
+
Note that for syslog, the `Syslog::Logger` class is required and cannot be
|
409
|
+
changed.
|
410
|
+
|
411
|
+
## Rails Integration
|
412
|
+
|
413
|
+
Supports Rails 4.2 and 5.x.
|
414
|
+
|
415
|
+
By default, every Rails log message will be written to logstash in `LogStash::Event` JSON format.
|
416
|
+
|
417
|
+
For minimal, more-structured logstash events, try one of the following gems:
|
418
|
+
|
419
|
+
* [lograge](https://github.com/roidrage/lograge)
|
420
|
+
* [yarder](https://github.com/rurounijones/yarder)
|
421
|
+
|
422
|
+
Currently these gems output a JSON string, which LogStashLogger then parses.
|
423
|
+
Future versions of these gems could potentially have deeper integration with LogStashLogger
|
424
|
+
(e.g. by directly writing `LogStash::Event` objects).
|
425
|
+
|
426
|
+
### Rails Configuration
|
427
|
+
|
428
|
+
Add the following to your `config/environments/production.rb`:
|
429
|
+
|
430
|
+
#### Common Options
|
431
|
+
|
432
|
+
```ruby
|
433
|
+
# Optional, Rails sets the default to :info
|
434
|
+
config.log_level = :debug
|
435
|
+
|
436
|
+
# Optional, Rails 4 defaults to true in development and false in production
|
437
|
+
config.autoflush_log = true
|
438
|
+
|
439
|
+
# Optional, use a URI to configure. Useful on Heroku
|
440
|
+
config.logstash.uri = ENV['LOGSTASH_URI']
|
441
|
+
|
442
|
+
# Optional. Defaults to :json_lines. If there are multiple outputs,
|
443
|
+
# they will all share the same formatter.
|
444
|
+
config.logstash.formatter = :json_lines
|
445
|
+
|
446
|
+
# Optional, the logger to log writing errors to. Defaults to logging to $stderr
|
447
|
+
config.logstash.error_logger = Logger.new($stderr)
|
448
|
+
|
449
|
+
# Optional, max number of items to buffer before flushing. Defaults to 50
|
450
|
+
config.logstash.buffer_max_items = 50
|
451
|
+
|
452
|
+
# Optional, max number of seconds to wait between flushes. Defaults to 5
|
453
|
+
config.logstash.buffer_max_interval = 5
|
454
|
+
|
455
|
+
# Optional, drop message when a connection error occurs. Defaults to false
|
456
|
+
config.logstash.drop_messages_on_flush_error = false
|
457
|
+
|
458
|
+
# Optional, drop messages when the buffer is full. Defaults to true
|
459
|
+
config.logstash.drop_messages_on_full_buffer = true
|
460
|
+
```
|
461
|
+
|
462
|
+
#### UDP
|
463
|
+
```ruby
|
464
|
+
# Optional, defaults to '0.0.0.0'
|
465
|
+
config.logstash.host = 'localhost'
|
466
|
+
|
467
|
+
# Optional, defaults to :udp.
|
468
|
+
config.logstash.type = :udp
|
469
|
+
|
470
|
+
# Required, the port to connect to
|
471
|
+
config.logstash.port = 5228
|
472
|
+
```
|
473
|
+
|
474
|
+
#### TCP
|
475
|
+
|
476
|
+
```ruby
|
477
|
+
# Optional, defaults to '0.0.0.0'
|
478
|
+
config.logstash.host = 'localhost'
|
479
|
+
|
480
|
+
# Required, the port to connect to
|
481
|
+
config.logstash.port = 5228
|
482
|
+
|
483
|
+
# Required
|
484
|
+
config.logstash.type = :tcp
|
485
|
+
|
486
|
+
# Optional, enables SSL
|
487
|
+
config.logstash.ssl_enable = true
|
488
|
+
```
|
489
|
+
|
490
|
+
#### Unix Socket
|
491
|
+
|
492
|
+
```ruby
|
493
|
+
# Required
|
494
|
+
config.logstash.type = :unix
|
495
|
+
|
496
|
+
# Required
|
497
|
+
config.logstash.path = '/tmp/sock'
|
498
|
+
```
|
499
|
+
|
500
|
+
#### Syslog
|
501
|
+
|
502
|
+
If you're on Ruby 1.9, add `Syslog::Logger` v2 to your Gemfile:
|
503
|
+
|
504
|
+
gem 'SyslogLogger', '2.0'
|
505
|
+
|
506
|
+
If you're on Ruby 2+, `Syslog::Logger` is already built into the standard library.
|
507
|
+
|
508
|
+
```ruby
|
509
|
+
# Required
|
510
|
+
config.logstash.type = :syslog
|
511
|
+
|
512
|
+
# Optional. Defaults to 'ruby'
|
513
|
+
config.logstash.program_name = 'MyApp'
|
514
|
+
|
515
|
+
# Optional default facility level. Only works in Ruby 2+
|
516
|
+
config.logstash.facility = Syslog::LOG_LOCAL0
|
517
|
+
```
|
518
|
+
|
519
|
+
#### Redis
|
520
|
+
|
521
|
+
Add the redis gem to your Gemfile:
|
522
|
+
|
523
|
+
gem 'redis'
|
524
|
+
|
525
|
+
```ruby
|
526
|
+
# Required
|
527
|
+
config.logstash.type = :redis
|
528
|
+
|
529
|
+
# Optional, will default to the 'logstash' list
|
530
|
+
config.logstash.list = 'logstash'
|
531
|
+
|
532
|
+
# All other options are passed in to the Redis client
|
533
|
+
# Supported options include host, port, path, password, url
|
534
|
+
# Example:
|
535
|
+
|
536
|
+
# Optional, Redis will default to localhost
|
537
|
+
config.logstash.host = 'localhost'
|
538
|
+
|
539
|
+
# Optional, Redis will default to port 6379
|
540
|
+
config.logstash.port = 6379
|
541
|
+
```
|
542
|
+
|
543
|
+
#### Kafka
|
544
|
+
|
545
|
+
Add the poseidon gem to your Gemfile:
|
546
|
+
|
547
|
+
gem 'poseidon'
|
548
|
+
|
549
|
+
```ruby
|
550
|
+
# Required
|
551
|
+
config.logstash.type = :kafka
|
552
|
+
|
553
|
+
# Optional, will default to the 'logstash' topic
|
554
|
+
config.logstash.path = 'logstash'
|
555
|
+
|
556
|
+
# Optional, will default to the 'logstash-logger' producer
|
557
|
+
config.logstash.producer = 'logstash-logger'
|
558
|
+
|
559
|
+
# Optional, will default to localhost:9092 host/port
|
560
|
+
config.logstash.hosts = ['localhost:9092']
|
561
|
+
|
562
|
+
# Optional, will default to 1s backoff
|
563
|
+
config.logstash.backoff = 1
|
564
|
+
|
565
|
+
```
|
566
|
+
|
567
|
+
#### Kinesis
|
568
|
+
|
569
|
+
Add the aws-sdk gem to your Gemfile:
|
570
|
+
|
571
|
+
# aws-sdk >= 3.0
|
572
|
+
gem 'aws-sdk-kinesis'
|
573
|
+
|
574
|
+
# aws-sdk < 3.0
|
575
|
+
gem 'aws-sdk'
|
576
|
+
|
577
|
+
```ruby
|
578
|
+
# Required
|
579
|
+
config.logstash.type = :kinesis
|
580
|
+
|
581
|
+
# Optional, will default to the 'logstash' stream
|
582
|
+
config.logstash.stream = 'my-stream-name'
|
583
|
+
|
584
|
+
# Optional, will default to 'us-east-1'
|
585
|
+
config.logstash.aws_region = 'us-west-2'
|
586
|
+
|
587
|
+
# Optional, will default to the AWS_ACCESS_KEY_ID environment variable
|
588
|
+
config.logstash.aws_access_key_id = 'ASKASKHLD12341'
|
589
|
+
|
590
|
+
# Optional, will default to the AWS_SECRET_ACCESS_KEY environment variable
|
591
|
+
config.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
|
592
|
+
|
593
|
+
```
|
594
|
+
|
595
|
+
#### Firehose
|
596
|
+
|
597
|
+
Add the aws-sdk gem to your Gemfile:
|
598
|
+
|
599
|
+
# aws-sdk >= 3.0
|
600
|
+
gem 'aws-sdk-firehose'
|
601
|
+
|
602
|
+
# aws-sdk < 3.0
|
603
|
+
gem 'aws-sdk'
|
604
|
+
|
605
|
+
```ruby
|
606
|
+
# Required
|
607
|
+
config.logstash.type = :firehose
|
608
|
+
|
609
|
+
# Optional, will default to the 'logstash' delivery stream
|
610
|
+
config.logstash.stream = 'my-stream-name'
|
611
|
+
|
612
|
+
# Optional, will default to AWS default region config chain
|
613
|
+
config.logstash.aws_region = 'us-west-2'
|
614
|
+
|
615
|
+
# Optional, will default to AWS default credential provider chain
|
616
|
+
config.logstash.aws_access_key_id = 'ASKASKHLD12341'
|
617
|
+
|
618
|
+
# Optional, will default to AWS default credential provider chain
|
619
|
+
config.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
|
620
|
+
|
621
|
+
```
|
622
|
+
|
623
|
+
#### File
|
624
|
+
|
625
|
+
```ruby
|
626
|
+
# Required
|
627
|
+
config.logstash.type = :file
|
628
|
+
|
629
|
+
# Optional, defaults to Rails log path
|
630
|
+
config.logstash.path = 'log/production.log'
|
631
|
+
```
|
632
|
+
|
633
|
+
#### IO
|
634
|
+
|
635
|
+
```ruby
|
636
|
+
# Required
|
637
|
+
config.logstash.type = :io
|
638
|
+
|
639
|
+
# Required
|
640
|
+
config.logstash.io = io
|
641
|
+
```
|
642
|
+
|
643
|
+
#### Multi Delegator
|
644
|
+
|
645
|
+
```ruby
|
646
|
+
# Required
|
647
|
+
config.logstash.type = :multi_delegator
|
648
|
+
|
649
|
+
# Required
|
650
|
+
config.logstash.outputs = [
|
651
|
+
{
|
652
|
+
type: :file,
|
653
|
+
path: 'log/production.log'
|
654
|
+
},
|
655
|
+
{
|
656
|
+
type: :udp,
|
657
|
+
port: 5228,
|
658
|
+
host: 'localhost'
|
659
|
+
}
|
660
|
+
]
|
661
|
+
```
|
662
|
+
|
663
|
+
#### Multi Logger
|
664
|
+
|
665
|
+
```ruby
|
666
|
+
# Required
|
667
|
+
config.logstash.type = :multi_logger
|
668
|
+
|
669
|
+
# Required. Each logger may have its own formatter.
|
670
|
+
config.logstash.outputs = [
|
671
|
+
{
|
672
|
+
type: :file,
|
673
|
+
path: 'log/production.log',
|
674
|
+
formatter: ::Logger::Formatter
|
675
|
+
},
|
676
|
+
{
|
677
|
+
type: :udp,
|
678
|
+
port: 5228,
|
679
|
+
host: 'localhost'
|
680
|
+
}
|
681
|
+
]
|
682
|
+
```
|
683
|
+
|
684
|
+
### Logging HTTP request data
|
685
|
+
|
686
|
+
In web applications, you can log data from HTTP requests (such as headers) using the
|
687
|
+
[RequestStore](https://github.com/steveklabnik/request_store) middleware. The following
|
688
|
+
example assumes Rails.
|
689
|
+
|
690
|
+
```ruby
|
691
|
+
# in Gemfile
|
692
|
+
gem 'request_store'
|
693
|
+
```
|
694
|
+
|
695
|
+
```ruby
|
696
|
+
# in application.rb
|
697
|
+
LogStashLogger.configure do |config|
|
698
|
+
config.customize_event do |event|
|
699
|
+
event["session_id"] = RequestStore.store[:load_balancer_session_id]
|
700
|
+
end
|
701
|
+
end
|
702
|
+
```
|
703
|
+
|
704
|
+
```ruby
|
705
|
+
# in app/controllers/application_controller.rb
|
706
|
+
before_filter :track_load_balancer_session_id
|
707
|
+
|
708
|
+
def track_load_balancer_session_id
|
709
|
+
RequestStore.store[:load_balancer_session_id] = request.headers["X-LOADBALANCER-SESSIONID"]
|
710
|
+
end
|
711
|
+
```
|
712
|
+
|
713
|
+
## Cleaning up resources when forking
|
714
|
+
|
715
|
+
If your application forks (as is common with many web servers) you will need to
|
716
|
+
manage cleaning up resources on your LogStashLogger instances. The instance method
|
717
|
+
`#reset` is available for this purpose. Here is sample configuration for
|
718
|
+
several common web servers used with Rails:
|
719
|
+
|
720
|
+
Passenger:
|
721
|
+
```ruby
|
722
|
+
::PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
723
|
+
Rails.logger.reset
|
724
|
+
end
|
725
|
+
```
|
726
|
+
|
727
|
+
Puma:
|
728
|
+
```ruby
|
729
|
+
# In config/puma.rb
|
730
|
+
on_worker_boot do
|
731
|
+
Rails.logger.reset
|
732
|
+
end
|
733
|
+
```
|
734
|
+
|
735
|
+
Unicorn
|
736
|
+
```ruby
|
737
|
+
# In config/unicorn.rb
|
738
|
+
after_fork do |server, worker|
|
739
|
+
Rails.logger.reset
|
740
|
+
end
|
741
|
+
```
|
742
|
+
|
743
|
+
## Ruby Compatibility
|
744
|
+
|
745
|
+
Verified to work with:
|
746
|
+
|
747
|
+
* MRI Ruby 2.2 - 2.5
|
748
|
+
* JRuby 9.x
|
749
|
+
* Rubinius
|
750
|
+
|
751
|
+
Ruby versions < 2.2 are EOL'ed and no longer supported.
|
752
|
+
|
753
|
+
## What type of logger should I use?
|
754
|
+
|
755
|
+
It depends on your specific needs, but most applications should use the default (UDP). Here are the advantages and
|
756
|
+
disadvantages of each type:
|
757
|
+
|
758
|
+
* UDP is faster than TCP because it's asynchronous (fire-and-forget). However, this means that log messages could get dropped.
|
759
|
+
This is okay for many applications.
|
760
|
+
* TCP verifies that every message has been received via two-way communication. It also supports SSL for secure transmission
|
761
|
+
of log messages over a network. This could slow your app down to a crawl if the TCP listener is under heavy load.
|
762
|
+
* A file is simple to use, but you will have to worry about log rotation and running out of disk space.
|
763
|
+
* Writing to a Unix socket is faster than writing to a TCP or UDP port, but only works locally.
|
764
|
+
* Writing to Redis is good for distributed setups that generate tons of logs. However, you will have another moving part and
|
765
|
+
have to worry about Redis running out of memory.
|
766
|
+
* Writing to stdout is only recommended for debugging purposes.
|
767
|
+
|
768
|
+
For a more detailed discussion of UDP vs TCP, I recommend reading this article:
|
769
|
+
[UDP vs. TCP](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/)
|
770
|
+
|
771
|
+
## Troubleshooting
|
772
|
+
|
773
|
+
### Logstash never receives any logs
|
774
|
+
If you are using a device backed by a Ruby IO object (such as a file, UDP socket, or TCP socket), please be aware that Ruby
|
775
|
+
keeps its own internal buffer. Despite the fact that LogStashLogger buffers
|
776
|
+
messages and flushes them periodically, the data written to the IO object can
|
777
|
+
be buffered by Ruby internally indefinitely, and may not even write until the
|
778
|
+
program terminates. If this bothers you or you need to see log messages
|
779
|
+
immediately, your only recourse is to set the `sync: true` option.
|
780
|
+
|
781
|
+
### JSON::GeneratorError
|
782
|
+
Your application is probably attempting to log data that is not encoded in a valid way. When this happens, Ruby's
|
783
|
+
standard JSON library will raise an exception. You may be able to overcome this by swapping out a different JSON encoder
|
784
|
+
such as Oj. Use the [oj_mimic_json](https://github.com/ohler55/oj_mimic_json) gem to use Oj for JSON generation.
|
785
|
+
|
786
|
+
### No logs getting sent on Heroku
|
787
|
+
Heroku recommends installing the [rails_12factor](https://github.com/heroku/rails_12factor) so that logs get sent to STDOUT.
|
788
|
+
Unfortunately, this overrides LogStashLogger, preventing logs from being sent to their configured destination. The solution
|
789
|
+
is to remove `rails_12factor` from your Gemfile.
|
790
|
+
|
791
|
+
### Logging eventually stops in production
|
792
|
+
This is most likely not a problem with LogStashLogger, but rather a different gem changing the log level of `Rails.logger`.
|
793
|
+
This is especially likely if you're using a threaded server such as Puma, since gems often change the log level of
|
794
|
+
`Rails.logger` in a non thread-safe way. See [#17](https://github.com/dwbutler/logstash-logger/issues/17) for more information.
|
795
|
+
|
796
|
+
### Sometimes two lines of JSON log messages get sent as one message
|
797
|
+
If you're using UDP output and writing to a logstash listener, you are most likely encountering a bug in the UDP implementation
|
798
|
+
of the logstash listener. There is no known fix at this time. See [#43](https://github.com/dwbutler/logstash-logger/issues/43)
|
799
|
+
for more information.
|
800
|
+
|
801
|
+
### Errno::EMSGSIZE - Message too long
|
802
|
+
A known drawback of using TCP or UDP is the 65535 byte limit on total message size. To workaround
|
803
|
+
this issue, you will have to truncate the message by setting the max message size:
|
804
|
+
|
805
|
+
```ruby
|
806
|
+
LogStashLogger.configure do |config|
|
807
|
+
config.max_message_size = 2000
|
808
|
+
end
|
809
|
+
```
|
810
|
+
|
811
|
+
This will truncate only the `message` field of the LogStash Event. So make sure
|
812
|
+
you set the max message size significantly less than 65535 bytes to make room
|
813
|
+
for other fields.
|
814
|
+
|
815
|
+
## Breaking changes
|
816
|
+
|
817
|
+
### Version 0.25+
|
818
|
+
|
819
|
+
Rails 3.2, MRI Ruby < 2.2, and JRuby 1.7 are no longer supported, since they have been
|
820
|
+
EOL'ed. If you are on an older version of Ruby, you will need to use 0.24 or below.
|
821
|
+
|
822
|
+
### Version 0.5+
|
823
|
+
* The `source` event key has been replaced with `host` to better match the latest logstash.
|
824
|
+
* The `(host, port, type)` constructor has been deprecated in favor of an options hash constructor.
|
825
|
+
|
826
|
+
### Version 0.4+
|
827
|
+
`LogStash::Event` uses the v1 format starting version 1.2+. If you're using the v1, you'll need to install
|
828
|
+
LogStashLogger version 0.4+. This is not backwards compatible with the old `LogStash::Event` v1.1.5, which uses
|
829
|
+
the v0 format.
|
830
|
+
|
831
|
+
### Version 0.3+
|
832
|
+
Earlier versions of this gem (<= 0.2.1) only implemented a TCP connection.
|
833
|
+
Newer versions (>= 0.3) also implement UDP, and use that as the new default.
|
834
|
+
Please be aware if you are using the default constructor and still require TCP, you should add an additional argument:
|
835
|
+
|
836
|
+
```ruby
|
837
|
+
# Now defaults to UDP instead of TCP
|
838
|
+
logger = LogStashLogger.new('localhost', 5228)
|
839
|
+
# Explicitly specify TCP instead of UDP
|
840
|
+
logger = LogStashLogger.new('localhost', 5228, :tcp)
|
841
|
+
```
|
842
|
+
|
843
|
+
## Contributors
|
844
|
+
* [David Butler](https://github.com/dwbutler)
|
845
|
+
* [pctj101](https://github.com/pctj101)
|
846
|
+
* [Gary Rennie](https://github.com/Gazler)
|
847
|
+
* [Nick Ethier](https://github.com/nickethier)
|
848
|
+
* [Arron Mabrey](https://github.com/arronmabrey)
|
849
|
+
* [Jan Schulte](https://github.com/schultyy)
|
850
|
+
* [Kurt Preston](https://github.com/KurtPreston)
|
851
|
+
* [Chris Blatchley](https://github.com/chrisblatchley)
|
852
|
+
* [Felix Bechstein](https://github.com/felixb)
|
853
|
+
* [Vadim Kazakov](https://github.com/yads)
|
854
|
+
* [Anil Rhemtulla](https://github.com/AnilRh)
|
855
|
+
* [Nikita Vorobei](https://github.com/Nikita-V)
|
856
|
+
* [fireboy1919](https://github.com/fireboy1919)
|
857
|
+
* [Mike Gunderloy](https://github.com/ffmike)
|
858
|
+
* [Vitaly Gorodetsky](https://github.com/vitalis)
|
859
|
+
* [Courtland Caldwell](https://github.com/caldwecr)
|
860
|
+
* [Bibek Shrestha](https://github.com/bibstha)
|
861
|
+
* [Alex Ianus](https://github.com/aianus)
|
862
|
+
* [Craig Read](https://github.com/Catharz)
|
863
|
+
* [glaszig](https://github.com/glaszig)
|
864
|
+
* [Bin Lan](https://github.com/lanxx019)
|
865
|
+
* [Joao Fernandes](https://github.com/jcmfernandes)
|
866
|
+
* [CoolElvis](https://github.com/coolelvis)
|
867
|
+
* [Sergey Pyankov](https://github.com/esergion)
|
868
|
+
* [Alec Hoey](https://github.com/alechoey)
|
869
|
+
* [Alexey Krasnoperov](https://github.com/AlexeyKrasnoperov)
|
870
|
+
* [Gabriel de Oliveira](https://github.com/gdeoliveira)
|
871
|
+
* [Vladislav Syabruk](https://github.com/SeTeM)
|
872
|
+
* [Matus Vacula](https://github.com/matus-vacula)
|
873
|
+
|
874
|
+
## Contributing
|
875
|
+
|
876
|
+
1. Fork it
|
877
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
878
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
879
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
880
|
+
5. Create new Pull Request
|