logstash-logger 0.4.0 → 0.4.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4495e92019c98077d726a256f7713ffb43b1a6f2
4
- data.tar.gz: 2768785f7ae86851d7f09d2270a5fb8565ec4080
3
+ metadata.gz: 2cb98c8cb41ee7a5cd49492cb17c1c3c06df5f37
4
+ data.tar.gz: 2c09577089a1a3f4dcb71ae16a426080d456d2b0
5
5
  SHA512:
6
- metadata.gz: b1931b2ca5c0bbd7bf786f04f7226d846d499bb5ec0b316412d6fc69e050bb7858cfdf201f70c09c287f225be6fdd96962bf7493cf64fc7afe5925b944eddd11
7
- data.tar.gz: a521fe134818cc560c90a906291622352370c84ec5e9de4a9e223544426efd091b204a0724e16bf584bb554950bbb00ffe26c7b6056b839fc06d9cf51e758e92
6
+ metadata.gz: fb7d7c1d9f6305721b8aea10d33de1c2d37c19b0de495b06d358fc783082ec3b1ab16d0e7b61be6c6ab621c4452b3509dd6798ca08789c38685d93260e8b8861
7
+ data.tar.gz: 0ec0923505339d1c9d561aa2e52a54dd7a9cb9cc045ffdaf9e8117db15a58b7eb7df1b5c13b1a7b96426743a0a789326940ea8d2891831f94effb8777c1870d6
data/.gitignore CHANGED
@@ -15,4 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
-
18
+ .idea/
@@ -2,6 +2,9 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.0
6
+ - 2.1.1
7
+ - 2.1.2
5
8
  - jruby-19mode # JRuby in 1.9 mode
6
9
  # - rbx-18mode
7
10
  # - rbx-19mode
@@ -0,0 +1,24 @@
1
+ 0.4.1
2
+ -----
3
+ - Fixed support for `LogStash::Event` v1 format when logging a hash. Extra data
4
+ now goes to the top level instead of into the `@fields` key.
5
+
6
+ 0.4.0
7
+ -----
8
+ - Support for new `LogStash::Event` v1 format. v0 is supported in 0.3+.
9
+
10
+ 0.3.0
11
+ -----
12
+ - Added support for logging to a UDP listener.
13
+
14
+ 0.2.1
15
+ -----
16
+ - Fixed to use Logstash's default time format for timestamps.
17
+
18
+ 0.2.0
19
+ -----
20
+ - Better use of Ruby Logger's built-in LogDevice.
21
+
22
+ 0.1.0
23
+ -----
24
+ - Initial release. Support for logging to a TCP listener.
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # LogStashLogger [![Build Status](https://travis-ci.org/dwbutler/logstash-logger.png?branch=master)](https://travis-ci.org/dwbutler/logstash-logger)
1
+ # LogStashLogger
2
+ [![Build Status](https://travis-ci.org/dwbutler/logstash-logger.png?branch=master)](https://travis-ci.org/dwbutler/logstash-logger) [![Code Climate](https://codeclimate.com/github/dwbutler/logstash-logger.png)](https://codeclimate.com/github/dwbutler/logstash-logger)
2
3
 
3
4
  This gem implements a subclass of Ruby's Logger class that logs directly to [logstash](http://logstash.net).
4
5
  It writes to a logstash listener over a UDP (default) or TCP connection, in logstash JSON format. This is an improvement over
@@ -28,20 +29,48 @@ Or install it yourself as:
28
29
  ## Basic Usage
29
30
 
30
31
  First set up a logstash agent to receive input over a UDP or TCP port.
31
- Then in ruby, create a LogStashLogger that writes to that port.
32
+ Then in ruby, create a `LogStashLogger` that writes to that port.
33
+
34
+ The logger accepts a string message, a JSON string, a hash, or a `LogStash::Event`.
32
35
 
33
36
  ```ruby
34
37
  require 'logstash-logger'
35
38
 
36
39
  # Defaults to UDP
37
40
  logger = LogStashLogger.new('localhost', 5228)
38
- logger.info 'test'
39
- # Writes the following to UDP port 5228:
40
- # {"@source":"server-host-name","@tags":[],"@fields":{"severity":"INFO"},"@message":"test","@timestamp":"2013-04-08T18:56:23.767273+00:00"}
41
41
 
42
42
  # Specify UDP or TCP explicitly
43
43
  udp_logger = LogStashLogger.new('localhost', 5228, :udp)
44
44
  tcp_logger = LogStashLogger.new('localhost', 5229, :tcp)
45
+
46
+ # The following messages are written to UDP port 5228:
47
+
48
+ logger.info 'test'
49
+ # {"message":"test","@timestamp":"2014-05-22T09:37:19.204-07:00","@version":"1","severity":"INFO","source":"[server-hostname]"}
50
+
51
+ logger.error '{"message": "error"}'
52
+ # {"message":"error","@timestamp":"2014-05-22T10:10:55.877-07:00","@version":"1","severity":"ERROR","source":"[server-hostname]"}
53
+
54
+ 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
+
57
+ 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
+ ```
60
+
61
+ ## Logstash configuration
62
+
63
+ In order for Logstash to correctly receive and parse the event, you will need to
64
+ configure and run a UDP listener that uses the `json_lines` codec:
65
+
66
+ ```ruby
67
+ input {
68
+ udp {
69
+ host => "0.0.0.0"
70
+ port => 5228
71
+ codec => json_lines
72
+ }
73
+ }
45
74
  ```
46
75
 
47
76
  ## Rails integration
@@ -49,7 +78,9 @@ tcp_logger = LogStashLogger.new('localhost', 5229, :tcp)
49
78
  Add the following to your config/environments/production.rb:
50
79
 
51
80
  ```ruby
52
- config.logger = ActiveSupport::TaggedLogging.new(LogStashLogger.new('localhost', 5228))
81
+ logger = LogStashLogger.new('localhost', 5228)
82
+ logger.level = Logger::INFO # default is Logger::DEBUG
83
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
53
84
  ```
54
85
 
55
86
  To get Rails to nicely output its logs in structured logstash format, try one of the following gems:
@@ -1,8 +1,5 @@
1
1
  class LogStashLogger < ::Logger
2
2
 
3
- attr_reader :client
4
-
5
- LOGSTASH_EVENT_FIELDS = %w(@timestamp @tags @type @source @fields message).freeze
6
3
  HOST = ::Socket.gethostname
7
4
 
8
5
  def initialize(host, port, socket_type=:udp)
@@ -30,7 +27,7 @@ class LogStashLogger < ::Logger
30
27
 
31
28
  def format_message(severity, time, progname, message)
32
29
  data = message
33
- if data.is_a?(String) && data[0] == '{'
30
+ if data.is_a?(String) && data.start_with?('{')
34
31
  data = (JSON.parse(message) rescue nil) || message
35
32
  end
36
33
 
@@ -38,17 +35,7 @@ class LogStashLogger < ::Logger
38
35
  when LogStash::Event
39
36
  data.clone
40
37
  when Hash
41
- event_data = {
42
- "@tags" => [],
43
- "@fields" => {},
44
- "@timestamp" => time
45
- }
46
- LOGSTASH_EVENT_FIELDS.each do |field_name|
47
- if field_data = data.delete(field_name)
48
- event_data[field_name] = field_data
49
- end
50
- end
51
- event_data["@fields"].merge!(data)
38
+ event_data = data.merge("@timestamp" => time)
52
39
  LogStash::Event.new(event_data)
53
40
  when String
54
41
  LogStash::Event.new("message" => data, "@timestamp" => time)
@@ -56,10 +43,12 @@ class LogStashLogger < ::Logger
56
43
 
57
44
  event['severity'] ||= severity
58
45
  #event.type = progname
46
+
47
+ event['source'] ||= HOST
59
48
  if event['source'] == 'unknown'
60
49
  event['source'] = HOST
61
50
  end
62
51
 
63
52
  event
64
53
  end
65
- end
54
+ end
@@ -1,5 +1,5 @@
1
1
  require 'logger'
2
2
 
3
3
  class LogStashLogger < ::Logger
4
- VERSION = "0.4.0"
4
+ VERSION = "0.4.1"
5
5
  end
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.description = %q{Ruby logger that writes directly to LogStash}
12
12
  gem.summary = %q{LogStash Logger for ruby}
13
13
  gem.homepage = "http://github.com/dwbutler/logstash-logger"
14
+ gem.license = "MIT"
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -62,69 +62,77 @@ describe LogStashLogger do
62
62
  #let(:socket) { @socket }
63
63
 
64
64
  it 'uses a LogStashLogger::Socket as the log device' do
65
- logdev.should be_a Logger::LogDevice
66
- logdev.instance_variable_get(:@dev).should be_a LogStashLogger::Socket
65
+ expect(logdev).to be_a Logger::LogDevice
66
+ expect(logdev.instance_variable_get(:@dev)).to be_a LogStashLogger::Socket
67
67
  end
68
68
 
69
69
  it 'takes a string message as input and writes a logstash event' do
70
70
  message = 'test'
71
71
 
72
- logdev.should_receive(:write).and_call_original do |event|
73
- event.should be_a LogStash::Event
74
- event.source.should eql(hostname)
75
- event['message'].should eql(message)
76
- event['severity'].should eql('INFO')
72
+ expect(logdev).to receive(:write).and_call_original do |event|
73
+ expect(event).to be_a LogStash::Event
74
+ expect(event.source).to eql(hostname)
75
+ expect(event['message']).to eql(message)
76
+ expect(event['severity']).to eql('INFO')
77
77
  end
78
78
 
79
79
  logger.info(message)
80
80
 
81
- listener_event['message'].should == message
81
+ expect(listener_event['message']).to eq(message)
82
+ expect(listener_event['source']).to eq(hostname)
82
83
  end
83
84
 
84
85
  it 'takes a logstash-formatted json string as input and writes out a logstash event' do
85
- logdev.should_receive(:write).and_call_original do |event|
86
- event.should be_a LogStash::Event
87
- event['message'].should eql(logstash_event['message'])
88
- event.source.should eql(hostname)
86
+ expect(logdev).to receive(:write).and_call_original do |event|
87
+ expect(event).to be_a LogStash::Event
88
+ expect(event['message']).to eql(logstash_event['message'])
89
+ expect(event.source).to eql(hostname)
89
90
  end
90
91
 
91
92
  logger.info(logstash_event.to_json)
92
93
 
93
- listener_event['message'].should == logstash_event['message']
94
+ expect(listener_event['message']).to eq(logstash_event['message'])
95
+ expect(listener_event['source']).to eq(hostname)
94
96
  end
95
97
 
96
98
  it 'takes a LogStash::Event as input and writes it out intact' do
97
- logdev.should_receive(:write).and_call_original do |event|
98
- event.should be_a LogStash::Event
99
- event['message'].should eql(logstash_event['message'])
100
- event['severity'].should eql(logstash_event['severity'])
101
- event.timestamp.should eql(logstash_event.timestamp)
102
- event.source.should eql(hostname)
99
+ expect(logdev).to receive(:write).and_call_original do |event|
100
+ expect(event).to be_a LogStash::Event
101
+ expect(event['message']).to eql(logstash_event['message'])
102
+ expect(event['severity']).to eql(logstash_event['severity'])
103
+ expect(event.timestamp).to eql(logstash_event.timestamp)
104
+ expect(event.source).to eql(hostname)
103
105
  end
104
106
 
105
107
  logger.warn(logstash_event)
106
108
 
107
- listener_event['message'].should == logstash_event['message']
108
- listener_event['severity'].should == logstash_event['severity']
109
+ expect(listener_event['message']).to eq(logstash_event['message'])
110
+ expect(listener_event['severity']).to eq(logstash_event['severity'])
111
+ expect(listener_event['source']).to eq(hostname)
109
112
  end
110
113
 
111
114
  it 'takes a data hash as input and writes out a logstash event' do
112
115
  data = {
113
- "message" => 'test',
114
- 'severity' => 'INFO'
116
+ 'message' => 'test',
117
+ 'severity' => 'INFO',
118
+ 'foo' => 'bar'
115
119
  }
116
120
 
117
- logdev.should_receive(:write).and_call_original do |event|
118
- event.should be_a LogStash::Event
119
- event['message'].should eql('test')
120
- event['severity'].should eql('INFO')
121
- event.source.should eql(hostname)
121
+ expect(logdev).to receive(:write).and_call_original do |event|
122
+ expect(event).to be_a LogStash::Event
123
+ expect(event['message']).to eql('test')
124
+ expect(event['severity']).to eql('INFO')
125
+ expect(event['foo']).to eql('bar')
126
+ expect(event.source).to eql(hostname)
122
127
  end
123
128
 
124
129
  logger.info(data.dup)
125
130
 
126
- listener_event['message'].should == data["message"]
127
- listener_event['severity'].should == data['severity']
131
+ expect(listener_event['message']).to eq(data["message"])
132
+ expect(listener_event['severity']).to eq(data['severity'])
133
+ expect(listener_event['foo']).to eq(data['foo'])
134
+ expect(listener_event['source']).to eq(hostname)
135
+ expect(listener_event['@timestamp']).to_not be_nil
128
136
  end
129
137
 
130
138
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Butler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-09 00:00:00.000000000 Z
11
+ date: 2014-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-event
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: wwtd
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description: Ruby logger that writes directly to LogStash
@@ -73,8 +73,9 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - .gitignore
77
- - .travis.yml
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - CHANGELOG.md
78
79
  - Gemfile
79
80
  - LICENSE.txt
80
81
  - README.md
@@ -87,7 +88,8 @@ files:
87
88
  - spec/logger_spec.rb
88
89
  - spec/spec_helper.rb
89
90
  homepage: http://github.com/dwbutler/logstash-logger
90
- licenses: []
91
+ licenses:
92
+ - MIT
91
93
  metadata: {}
92
94
  post_install_message:
93
95
  rdoc_options: []
@@ -95,17 +97,17 @@ require_paths:
95
97
  - lib
96
98
  required_ruby_version: !ruby/object:Gem::Requirement
97
99
  requirements:
98
- - - '>='
100
+ - - ">="
99
101
  - !ruby/object:Gem::Version
100
102
  version: '0'
101
103
  required_rubygems_version: !ruby/object:Gem::Requirement
102
104
  requirements:
103
- - - '>='
105
+ - - ">="
104
106
  - !ruby/object:Gem::Version
105
107
  version: '0'
106
108
  requirements: []
107
109
  rubyforge_project:
108
- rubygems_version: 2.0.3
110
+ rubygems_version: 2.2.2
109
111
  signing_key:
110
112
  specification_version: 4
111
113
  summary: LogStash Logger for ruby