logstash-logger 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2cb98c8cb41ee7a5cd49492cb17c1c3c06df5f37
4
- data.tar.gz: 2c09577089a1a3f4dcb71ae16a426080d456d2b0
3
+ metadata.gz: e6696816384e341e562b5cf39921a1f8d71accb0
4
+ data.tar.gz: a510f56283c8a70101dd5604efa2b5470edb5f5f
5
5
  SHA512:
6
- metadata.gz: fb7d7c1d9f6305721b8aea10d33de1c2d37c19b0de495b06d358fc783082ec3b1ab16d0e7b61be6c6ab621c4452b3509dd6798ca08789c38685d93260e8b8861
7
- data.tar.gz: 0ec0923505339d1c9d561aa2e52a54dd7a9cb9cc045ffdaf9e8117db15a58b7eb7df1b5c13b1a7b96426743a0a789326940ea8d2891831f94effb8777c1870d6
6
+ metadata.gz: a9b42b29215905770c72c3ad7ada65df908302a24e0389d636e0e7c3dbef631c06dfd57a304180adc5acdf3138ed81bb47ed9e8b465393a7c3130be107390892
7
+ data.tar.gz: ce2711e17ef4ce503da02e1e9561f55b61525d4766bfefda2ba5a794418e990116351b3c57f25939e0bd9be58242cf3e5b68096b72dfeb5576e3267d890df1cc
data/.gitignore CHANGED
@@ -4,6 +4,7 @@
4
4
  .config
5
5
  .yardoc
6
6
  Gemfile.lock
7
+ *.lock
7
8
  InstalledFiles
8
9
  _yardoc
9
10
  coverage
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format progress
3
+ --require spec_helper
data/.travis.yml CHANGED
@@ -5,6 +5,9 @@ rvm:
5
5
  - 2.1.0
6
6
  - 2.1.1
7
7
  - 2.1.2
8
- - jruby-19mode # JRuby in 1.9 mode
9
- # - rbx-18mode
10
- # - rbx-19mode
8
+ - jruby-19mode
9
+ - rbx-2
10
+ gemfile:
11
+ - gemfiles/rails_3.2.gemfile
12
+ - gemfiles/rails_4.0.gemfile
13
+ - gemfiles/rails_4.1.gemfile
data/Appraisals ADDED
@@ -0,0 +1,11 @@
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
data/CHANGELOG.md CHANGED
@@ -1,24 +1,31 @@
1
- 0.4.1
2
- -----
1
+ ## 0.5.0
2
+ - Support for tagged logging. The interface was extracted from `ActiveSupport::TaggedLogging`
3
+ and outputs to the `tags` key. (Thanks [pctj101](https://github.com/pctj101)!)
4
+ - The `(host, port, type)` constructor has been deprecated in favor of an options hash constructor.
5
+ - Support for using SSL for TCP connections. (Thanks [Gary Rennie](https://github.com/Gazler)!)
6
+ - Support for configuring logger to write to STDOUT. (Thanks [Nick Ethier](https://github.com/nickethier)!)
7
+ - Support for Rails configuration.
8
+ - Fixed output to STDOUT in Rails console (Rails 4+).
9
+ - `host` is no longer required for TCP/UDP. It will default to `0.0.0.0`, the same default port that logstash listens on.
10
+ - Changed event key `source` to `host` to match what the latest logstash expects.
11
+ - Output event timestamp consistently even if `Time#to_json` is overridden.
12
+ - Major refactoring which will lead the way to support other log types.
13
+
14
+ ## 0.4.1
3
15
  - Fixed support for `LogStash::Event` v1 format when logging a hash. Extra data
4
16
  now goes to the top level instead of into the `@fields` key.
5
17
 
6
- 0.4.0
7
- -----
18
+ ## 0.4.0
8
19
  - Support for new `LogStash::Event` v1 format. v0 is supported in 0.3+.
9
20
 
10
- 0.3.0
11
- -----
21
+ ## 0.3.0
12
22
  - Added support for logging to a UDP listener.
13
23
 
14
- 0.2.1
15
- -----
24
+ ## 0.2.1
16
25
  - Fixed to use Logstash's default time format for timestamps.
17
26
 
18
- 0.2.0
19
- -----
27
+ ## 0.2.0
20
28
  - Better use of Ruby Logger's built-in LogDevice.
21
29
 
22
- 0.1.0
23
- -----
24
- - Initial release. Support for logging to a TCP listener.
30
+ ## 0.1.0
31
+ - Initial release. Support for logging to a TCP listener.
data/Gemfile CHANGED
@@ -1,11 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in logstash-logger.gemspec
4
3
  gemspec
5
4
 
6
- gem 'json', :platform => :ruby_18
7
-
8
- group :development do
9
- #gem 'ruby-debug', :platform => :ruby_18
10
- #gem 'debugger', :platforms => [:ruby_19, :ruby_20]
11
- end
5
+ #gem 'json', :platform => :ruby_18
data/README.md CHANGED
@@ -36,29 +36,34 @@ The logger accepts a string message, a JSON string, a hash, or a `LogStash::Even
36
36
  ```ruby
37
37
  require 'logstash-logger'
38
38
 
39
- # Defaults to UDP
40
- logger = LogStashLogger.new('localhost', 5228)
39
+ # Defaults to UDP on 0.0.0.0
40
+ logger = LogStashLogger.new(port: 5228)
41
41
 
42
- # Specify UDP or TCP explicitly
43
- udp_logger = LogStashLogger.new('localhost', 5228, :udp)
44
- tcp_logger = LogStashLogger.new('localhost', 5229, :tcp)
42
+ # Specify host and type (UDP or TCP) explicitly
43
+ udp_logger = LogStashLogger.new(host: 'localhost', port: 5228, type: :udp)
44
+ tcp_logger = LogStashLogger.new(host: 'localhost', port: 5229, type: :tcp)
45
+ stdout_logger = LogStashLogger.new(type: :stdout)
45
46
 
46
47
  # The following messages are written to UDP port 5228:
47
48
 
48
49
  logger.info 'test'
49
- # {"message":"test","@timestamp":"2014-05-22T09:37:19.204-07:00","@version":"1","severity":"INFO","source":"[server-hostname]"}
50
+ # {"message":"test","@timestamp":"2014-05-22T09:37:19.204-07:00","@version":"1","severity":"INFO","host":"[hostname]"}
50
51
 
51
52
  logger.error '{"message": "error"}'
52
- # {"message":"error","@timestamp":"2014-05-22T10:10:55.877-07:00","@version":"1","severity":"ERROR","source":"[server-hostname]"}
53
+ # {"message":"error","@timestamp":"2014-05-22T10:10:55.877-07:00","@version":"1","severity":"ERROR","host":"[hostname]"}
53
54
 
54
55
  logger.debug message: 'test', foo: 'bar'
55
- # {"message":"test","foo":"bar","@timestamp":"2014-05-22T09:43:24.004-07:00","@version":"1","severity":"DEBUG","source":"[server-hostname]"}
56
+ # {"message":"test","foo":"bar","@timestamp":"2014-05-22T09:43:24.004-07:00","@version":"1","severity":"DEBUG","host":"[hostname]"}
56
57
 
57
58
  logger.warn LogStash::Event.new(message: 'test', foo: 'bar')
58
- # {"message":"test","foo":"bar","@timestamp":"2014-05-22T16:44:37.364Z","@version":"1","severity":"WARN","source":"[server-hostname]"}
59
+ # {"message":"test","foo":"bar","@timestamp":"2014-05-22T16:44:37.364Z","@version":"1","severity":"WARN","host":"[hostname]"}
60
+
61
+ # Tagged logging
62
+ logger.tagged('foo') { logger.fatal('bar') }
63
+ # {"message":"bar","@timestamp":"2014-05-26T20:35:14.685-07:00","@version":"1","severity":"FATAL","host":"[hostname]","tags":["foo"]}
59
64
  ```
60
65
 
61
- ## Logstash configuration
66
+ ## Logstash Configuration
62
67
 
63
68
  In order for Logstash to correctly receive and parse the event, you will need to
64
69
  configure and run a UDP listener that uses the `json_lines` codec:
@@ -73,52 +78,106 @@ input {
73
78
  }
74
79
  ```
75
80
 
76
- ## Rails integration
81
+ See the [samples](https://github.com/dwbutler/logstash-logger/tree/master/samples) directory for more configuration samples.
77
82
 
78
- Add the following to your config/environments/production.rb:
83
+ ## UDP vs TCP
84
+ Should you write to a UDP or TCP listener? It depends on your specific needs, but most applications should use the default (UDP).
85
+
86
+ * UDP is faster because it's asynchronous (fire-and-forget). However, this means that log messages could get dropped. This is okay for most applications.
87
+ * TCP verifies that every message has been received via two-way communication . This could slow your app down to a crawl if the TCP listener is under heavy load.
88
+
89
+ For a more detailed discussion of UDP vs TCP, I recommend reading this article: [UDP vs. TCP](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/)
90
+
91
+ ## SSL
92
+
93
+ If you are using TCP then there is the option of adding an SSL certificate to the options hash on initialize.
79
94
 
80
95
  ```ruby
81
- logger = LogStashLogger.new('localhost', 5228)
82
- logger.level = Logger::INFO # default is Logger::DEBUG
83
- config.logger = ActiveSupport::TaggedLogging.new(logger)
96
+ LogStashLogger.new(type: :tcp, port: 5228, ssl_certificate: "/path/to/certificate.crt")
84
97
  ```
85
98
 
86
- To get Rails to nicely output its logs in structured logstash format, try one of the following gems:
99
+ The SSL certificate and key can be generated using
87
100
 
88
- * [lograge](https://github.com/roidrage/lograge)
89
- * [yarder](https://github.com/rurounijones/yarder)
101
+ openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash.key -out logstash.crt
90
102
 
91
- Currently these gems output a JSON string, which LogStashLogger then parses.
92
- Future versions of these gems could potentially have deeper integration with LogStashLogger (i.e. by writing LogStash::Event objects).
103
+ You can also enable SSL without a certificate:
93
104
 
94
- ## UDP vs TCP
95
- Should you write to a UDP or TCP listener? It depends on your specific needs, but most applications should use the default (UDP).
105
+ ```ruby
106
+ LogStashLogger.new(type: :tcp, port: 5228, ssl_enable: true)
107
+ ```
96
108
 
97
- * UDP is faster because it's asynchronous (fire-and-forget). However, this means that log messages could get dropped. This is okay for most applications.
98
- * TCP verifies that every message has been received via two-way communication . This could slow your app down to a crawl if the TCP listener is under heavy load.
109
+ The following Logstash configuration is required for SSL:
99
110
 
100
- For a more detailed discussion of UDP vs TCP, I recommend reading this article: [UDP vs. TCP](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/)
111
+ ```ruby
112
+ input {
113
+ tcp {
114
+ host => "0.0.0.0"
115
+ port => 5228
116
+ codec => json_lines
117
+ ssl_enable => true
118
+ ssl_cert => "/path/to/certificate.crt"
119
+ ssl_key => "/path/to/key.key"
120
+ }
121
+ }
122
+ ```
101
123
 
102
- ## Ruby compatibility
124
+ ## Rails Integration
103
125
 
104
- Verified to work with:
126
+ Verified to work with both Rails 3 and 4.
127
+
128
+ Add the following to your `config/environments/production.rb`:
129
+
130
+ ```ruby
131
+ # Optional, defaults to '0.0.0.0'
132
+ config.logstash.host = 'localhost'
133
+
134
+ # Required for TCP/UDP
135
+ config.logstash.port = 5228
136
+
137
+ # Optional, defaults to :udp. Possible values are :udp, :tcp, or :stdout
138
+ config.logstash.type = :udp
139
+
140
+ # Optional, enables SSL when combined with :tcp type
141
+ config.logstash.ssl_enable = true
105
142
 
106
- * MRI Ruby 1.9.3
107
- * MRI Ruby 2.0.0
108
- * JRuby 1.7+ (1.9 mode)
143
+ # Optional, Rails sets the default to :info
144
+ config.log_level = :debug
145
+ ```
146
+
147
+ By default, every Rails log message will be written to logstash in `LogStash::Event` JSON format.
148
+
149
+ For minimal, more-structured logstash events, try one of the following gems:
150
+
151
+ * [lograge](https://github.com/roidrage/lograge)
152
+ * [yarder](https://github.com/rurounijones/yarder)
109
153
 
110
- Ruby 1.8.7 is not supported because LogStash::Event is not compatible with Ruby 1.8.7. This will probably not change.
154
+ Currently these gems output a JSON string, which LogStashLogger then parses.
155
+ Future versions of these gems could potentially have deeper integration with LogStashLogger (i.e. by writing `LogStash::Event` objects).
156
+
157
+ ## Ruby Compatibility
158
+
159
+ Verified to work with:
160
+
161
+ * MRI Ruby 1.9.3, 2.0+, 2.1+
162
+ * JRuby 1.7+
163
+ * Rubinius 2.2+
111
164
 
112
- The specs don't pass in Rubinius yet, but the logger does work.
165
+ Ruby 1.8.7 is not supported.
113
166
 
114
167
  ## Breaking changes
115
168
 
169
+ ### Version 0.5+
170
+ * The `source` event key has been replaced with `host` to better match the latest logstash.
171
+ * The `(host, port, type)` constructor has been deprecated in favor of an options hash constructor.
172
+
116
173
  ### Version 0.4+
117
- Logstash::Event decided to go ahead and break the existing JSON format starting in version 1.2+. If you're using this version, you'll need to install
118
- LogStashLogger version 0.4+. This is not backwards compatible with the old LogStash::Event v1.1.5.
174
+ `LogStash::Event` uses the v1 format starting version 1.2+. If you're using the v1, you'll need to install
175
+ LogStashLogger version 0.4+. This is not backwards compatible with the old `LogStash::Event` v1.1.5, which uses
176
+ the v0 format.
119
177
 
120
178
  ### Version 0.3+
121
- Earlier versions of this gem (<= 0.2.1) only implemented a TCP connection. Newer versions (>= 0.3) also implement UDP, and use that as the new default.
179
+ Earlier versions of this gem (<= 0.2.1) only implemented a TCP connection.
180
+ Newer versions (>= 0.3) also implement UDP, and use that as the new default.
122
181
  Please be aware if you are using the default constructor and still require TCP, you should add an additional argument:
123
182
 
124
183
  ```ruby
data/Rakefile CHANGED
@@ -1,24 +1,22 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require "bundler/setup"
3
4
  require 'rspec/core/rake_task'
4
5
 
5
6
  desc "Run all specs with default options"
6
7
  RSpec::Core::RakeTask.new(:spec) do |t|
7
- t.rspec_opts = %w[--color]
8
8
  t.verbose = false
9
9
  end
10
10
 
11
11
  desc "Run specs with TCP socket"
12
12
  RSpec::Core::RakeTask.new("spec:tcp") do |t|
13
- ENV['SOCKET_TYPE'] = 'tcp'
14
- t.rspec_opts = %w[--color]
13
+ ENV['TYPE'] = 'tcp'
15
14
  t.verbose = false
16
15
  end
17
16
 
18
17
  desc "Run specs with UDP socket"
19
18
  RSpec::Core::RakeTask.new("spec:udp") do |t|
20
- ENV['SOCKET_TYPE'] = 'udp'
21
- t.rspec_opts = %w[--color]
19
+ ENV['TYPE'] = 'udp'
22
20
  t.verbose = false
23
21
  end
24
22
 
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 3.2.18"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.0.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.1.1"
6
+
7
+ gemspec :path => "../"
@@ -1,9 +1,10 @@
1
1
  require 'logstash-logger/version'
2
2
 
3
- require 'socket'
4
3
  require 'logstash/event'
5
4
 
6
- require 'logstash-logger/socket'
5
+ require 'logstash-logger/device'
6
+
7
7
  require 'logstash-logger/logger'
8
- require 'logstash-logger/version'
8
+ require 'logstash-logger/formatter'
9
9
 
10
+ require 'logstash-logger/railtie' if defined? Rails
@@ -0,0 +1,28 @@
1
+ require 'logstash-logger/device/base'
2
+
3
+ module LogStashLogger
4
+ module Device
5
+ DEFAULT_TYPE = :udp
6
+
7
+ autoload :Base, 'logstash-logger/device/base'
8
+ autoload :Socket, 'logstash-logger/device/socket'
9
+ autoload :UDP, 'logstash-logger/device/udp'
10
+ autoload :TCP, 'logstash-logger/device/tcp'
11
+ autoload :Stdout, 'logstash-logger/device/stdout'
12
+
13
+ def self.new(opts)
14
+ type = opts.delete(:type) || DEFAULT_TYPE
15
+
16
+ device_klass_for(type).new(opts)
17
+ end
18
+
19
+ def self.device_klass_for(type)
20
+ case type
21
+ when :udp then UDP
22
+ when :tcp then TCP
23
+ when :stdout then Stdout
24
+ else fail ArgumentError, 'Invalid type'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ module LogStashLogger
2
+ module Device
3
+ class Base
4
+ attr_reader :io
5
+
6
+ def initialize(opts={})
7
+ end
8
+
9
+ def to_io
10
+ @io
11
+ end
12
+
13
+ def write(message)
14
+ @io.write(message)
15
+ end
16
+
17
+ def flush
18
+ @io && @io.flush
19
+ end
20
+
21
+ def close
22
+ @io && @io.close
23
+ rescue => e
24
+ warn "#{self.class} - #{e.class} - #{e.message}"
25
+ ensure
26
+ @io = nil
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ require 'socket'
2
+
3
+ module LogStashLogger
4
+ module Device
5
+ class Socket < Base
6
+ DEFAULT_HOST = '0.0.0.0'
7
+
8
+ attr_reader :host, :port
9
+
10
+ def initialize(opts)
11
+ @port = opts[:port] || fail(ArgumentError, "Port is required")
12
+ @host = opts[:host] || DEFAULT_HOST
13
+ end
14
+
15
+ def write(message)
16
+ with_connection do
17
+ super
18
+ end
19
+ end
20
+
21
+ def flush
22
+ return unless connected?
23
+ with_connection do
24
+ super
25
+ end
26
+ end
27
+
28
+ def to_io
29
+ with_connection do
30
+ @io
31
+ end
32
+ end
33
+
34
+ def connected?
35
+ !!@io
36
+ end
37
+
38
+ protected
39
+
40
+ # Implemented by TCP and UDP devices
41
+ def connect
42
+ fail NotImplementedError
43
+ end
44
+
45
+ # Ensure the block is executed with a valid connection
46
+ def with_connection(&block)
47
+ connect unless @io
48
+ yield
49
+ rescue => e
50
+ warn "#{self.class} - #{e.class} - #{e.message}"
51
+ close
52
+ @io = nil
53
+ end
54
+ end
55
+ end
56
+ end