logstash-logger 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +4 -0
- data/README.md +9 -3
- data/lib/logstash-logger/formatter.rb +35 -38
- data/lib/logstash-logger/formatter/base.rb +52 -0
- data/lib/logstash-logger/formatter/cee.rb +10 -0
- data/lib/logstash-logger/formatter/cee_syslog.rb +20 -0
- data/lib/logstash-logger/formatter/json.rb +10 -0
- data/lib/logstash-logger/formatter/json_lines.rb +10 -0
- data/lib/logstash-logger/formatter/logstash_event.rb +9 -0
- data/lib/logstash-logger/logger.rb +2 -1
- data/lib/logstash-logger/version.rb +1 -1
- data/spec/formatter/base_spec.rb +72 -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 +52 -0
- data/spec/spec_helper.rb +11 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b5f101aba35d73c9bb62e77c6a5be82321c54de
|
4
|
+
data.tar.gz: 85d7303ebb637bda83b42dec2794c7551983e22e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ce2d236f92070efa47bf40cbc708a2fa3c12d65f1e611813b6170678ce4b00e5889661f0e9b9d3ce7760f0f6eef12ea1773eb9ac98b843f8ae57f0514d4463f
|
7
|
+
data.tar.gz: 5c038e89a27a7467a76da3a7715d2161ca5afdf3f1bd6ec25216c433aaedd979399cbc0d133dd96b20760970637543814ddea4f80314612df174d915f369f3d7
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 0.12.0
|
2
|
+
- Support for other formatters, including custom formatters. [#56](https://github.com/dwbutler/logstash-logger/pull/56)
|
3
|
+
- Support for CEE output.
|
4
|
+
|
1
5
|
## 0.11.0
|
2
6
|
- Support for balancer log device. [#55](https://github.com/dwbutler/logstash-logger/pull/55)
|
3
7
|
|
data/README.md
CHANGED
@@ -28,7 +28,7 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
$ gem install logstash-logger
|
30
30
|
|
31
|
-
##
|
31
|
+
## Usage Examples
|
32
32
|
|
33
33
|
```ruby
|
34
34
|
require 'logstash-logger'
|
@@ -49,6 +49,12 @@ stdout_logger = LogStashLogger.new(type: :stdout)
|
|
49
49
|
stderr_logger = LogStashLogger.new(type: :stderr)
|
50
50
|
io_logger = LogStashLogger.new(type: :io, io: io)
|
51
51
|
|
52
|
+
# Use a different formatter
|
53
|
+
cee_logger = LogStashLogger.new(type: :tcp, host: 'logsene-receiver-syslog.sematext.com', port: 514, formatter: :cee_syslog)
|
54
|
+
custom_formatted_logger = LogStashLogger.new(type: :redis, formatter: MyCustomFormatter)
|
55
|
+
lambda_formatted_logger = LogStashLogger.new(type: :stdout, formatter: ->(severity, time, progname, msg) { "[#{progname}] #{msg}" })
|
56
|
+
ruby_default_formatter_logger = LogStashLogger.new(type: :file, path: 'log/development.log', formatter: ::Logger::Formatter)
|
57
|
+
|
52
58
|
# Multiple Outputs
|
53
59
|
multi_logger = LogStashLogger.new([{type: :file, path: 'log/development.log'}, {type: :udp, host: 'localhost', port: 5228}])
|
54
60
|
|
@@ -77,7 +83,7 @@ logger.tagged('foo') { logger.fatal('bar') }
|
|
77
83
|
## URI Configuration
|
78
84
|
You can use a URI to configure your logstash logger instead of a hash. This is useful in environments
|
79
85
|
such as Heroku where you may want to read configuration values from the environment. The URI scheme
|
80
|
-
is `type://host:port/path`. Some sample URI configurations are given below.
|
86
|
+
is `type://host:port/path?key=value`. Some sample URI configurations are given below.
|
81
87
|
|
82
88
|
```
|
83
89
|
udp://localhost:5228
|
@@ -97,7 +103,7 @@ Pass the URI into your logstash logger like so:
|
|
97
103
|
logger = LogStashLogger.new(uri: ENV['LOGSTASH_URI'])
|
98
104
|
```
|
99
105
|
|
100
|
-
## Logstash Configuration
|
106
|
+
## Logstash Listener Configuration
|
101
107
|
|
102
108
|
In order for logstash to correctly receive and parse the events, you will need to
|
103
109
|
configure and run a listener that uses the `json_lines` codec. For example, to receive
|
@@ -1,51 +1,48 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'socket'
|
3
|
-
require 'time'
|
1
|
+
require 'logstash-logger/formatter/base'
|
4
2
|
|
5
3
|
module LogStashLogger
|
6
|
-
|
4
|
+
module Formatter
|
5
|
+
DEFAULT_FORMATTER = :json_lines
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
autoload :LogStashEvent, 'logstash-logger/formatter/logstash_event'
|
8
|
+
autoload :Json, 'logstash-logger/formatter/json'
|
9
|
+
autoload :JsonLines, 'logstash-logger/formatter/json_lines'
|
10
|
+
autoload :Cee, 'logstash-logger/formatter/cee'
|
11
|
+
autoload :CeeSyslog, 'logstash-logger/formatter/cee_syslog'
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
"#{event.to_json}\n"
|
13
|
+
def self.new(formatter_type)
|
14
|
+
build_formatter(formatter_type)
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
def self.build_formatter(formatter_type)
|
18
|
+
formatter_type ||= DEFAULT_FORMATTER
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
if custom_formatter_instance?(formatter_type)
|
21
|
+
formatter_type
|
22
|
+
elsif custom_formatter_class?(formatter_type)
|
23
|
+
formatter_type.new
|
24
|
+
else
|
25
|
+
formatter_klass(formatter_type).new
|
22
26
|
end
|
27
|
+
end
|
23
28
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
event['severity'] ||= severity
|
35
|
-
#event.type = progname
|
36
|
-
|
37
|
-
event['host'] ||= HOST
|
29
|
+
def self.formatter_klass(formatter_type)
|
30
|
+
case formatter_type.to_sym
|
31
|
+
when :json_lines then JsonLines
|
32
|
+
when :json then Json
|
33
|
+
when :logstash_event then LogStashEvent
|
34
|
+
when :cee then Cee
|
35
|
+
when :cee_syslog then CeeSyslog
|
36
|
+
else fail ArgumentError, 'Invalid formatter'
|
37
|
+
end
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
def self.custom_formatter_instance?(formatter_type)
|
41
|
+
formatter_type.respond_to?(:call)
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
event.timestamp = event.timestamp.iso8601(3)
|
46
|
-
end
|
47
|
-
|
48
|
-
event
|
44
|
+
def self.custom_formatter_class?(formatter_type)
|
45
|
+
formatter_type.is_a?(Class) && formatter_type.method_defined?(:call)
|
49
46
|
end
|
50
|
-
|
47
|
+
end
|
51
48
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'socket'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module LogStashLogger
|
6
|
+
module Formatter
|
7
|
+
HOST = ::Socket.gethostname
|
8
|
+
|
9
|
+
class Base < ::Logger::Formatter
|
10
|
+
include ::LogStashLogger::TaggedLogging::Formatter
|
11
|
+
|
12
|
+
def call(severity, time, progname, message)
|
13
|
+
@event = build_event(message, severity, time)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def build_event(message, severity, time)
|
19
|
+
data = message
|
20
|
+
if data.is_a?(String) && data.start_with?('{'.freeze)
|
21
|
+
data = (JSON.parse(message) rescue nil) || message
|
22
|
+
end
|
23
|
+
|
24
|
+
event = case data
|
25
|
+
when LogStash::Event
|
26
|
+
data.clone
|
27
|
+
when Hash
|
28
|
+
event_data = data.merge("@timestamp".freeze => time)
|
29
|
+
LogStash::Event.new(event_data)
|
30
|
+
else
|
31
|
+
LogStash::Event.new("message".freeze => msg2str(data), "@timestamp".freeze => time)
|
32
|
+
end
|
33
|
+
|
34
|
+
event['severity'.freeze] ||= severity
|
35
|
+
#event.type = progname
|
36
|
+
|
37
|
+
event['host'.freeze] ||= HOST
|
38
|
+
|
39
|
+
current_tags.each { |tag| event.tag(tag) }
|
40
|
+
|
41
|
+
LogStashLogger.configuration.customize_event_block.call(event) if LogStashLogger.configuration.customize_event_block.respond_to?(:call)
|
42
|
+
|
43
|
+
# In case Time#to_json has been overridden
|
44
|
+
if event.timestamp.is_a?(Time)
|
45
|
+
event.timestamp = event.timestamp.iso8601(3)
|
46
|
+
end
|
47
|
+
|
48
|
+
event
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module LogStashLogger
|
2
|
+
module Formatter
|
3
|
+
class CeeSyslog < Cee
|
4
|
+
def call(severity, time, progname, message)
|
5
|
+
@cee = super
|
6
|
+
@progname = progname
|
7
|
+
|
8
|
+
"#{facility}:#{@cee}\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def facility
|
14
|
+
@facility = "#{@event['host']}"
|
15
|
+
@facility << " #{@progname}" if @progname
|
16
|
+
@facility
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,13 +4,14 @@ require 'logstash-logger/tagged_logging'
|
|
4
4
|
module LogStashLogger
|
5
5
|
def self.new(*args)
|
6
6
|
opts = extract_opts(*args)
|
7
|
+
formatter = Formatter.new(opts.delete(:formatter))
|
7
8
|
device = Device.new(opts)
|
8
9
|
|
9
10
|
::Logger.new(device).tap do |logger|
|
10
11
|
logger.instance_variable_set(:@device, device)
|
11
12
|
logger.extend(self)
|
12
13
|
logger.extend(TaggedLogging)
|
13
|
-
logger.formatter =
|
14
|
+
logger.formatter = formatter
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter::Base do
|
4
|
+
include_context "formatter"
|
5
|
+
|
6
|
+
describe "#build_event" do
|
7
|
+
let(:event) { formatted_message }
|
8
|
+
|
9
|
+
describe "message type" do
|
10
|
+
context "string" do
|
11
|
+
it "puts the message into the message field" do
|
12
|
+
expect(event['message']).to eq(message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "JSON string" do
|
17
|
+
let(:message) do
|
18
|
+
{ message: 'test', foo: 'bar' }.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
it "parses the JSON and merges into the event" do
|
22
|
+
expect(event['message']).to eq('test')
|
23
|
+
expect(event['foo']).to eq('bar')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "hash" do
|
28
|
+
let(:message) do
|
29
|
+
{ 'message' => 'test', 'foo' => 'bar' }
|
30
|
+
end
|
31
|
+
|
32
|
+
it "merges into the event" do
|
33
|
+
expect(event['message']).to eq('test')
|
34
|
+
expect(event['foo']).to eq('bar')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "LogStash::Event" do
|
39
|
+
let(:message) { LogStash::Event.new("message" => "foo") }
|
40
|
+
|
41
|
+
it "returns a clone of the original event" do
|
42
|
+
expect(event['message']).to eq("foo")
|
43
|
+
expect(event).to_not equal(message)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "fallback" do
|
48
|
+
let(:message) { [1, 2, 3] }
|
49
|
+
|
50
|
+
it "calls inspect" do
|
51
|
+
expect(event['message']).to eq(message.inspect)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "extra fields on the event" do
|
57
|
+
it "adds severity" do
|
58
|
+
expect(event['severity']).to eq(severity)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "adds host" do
|
62
|
+
expect(event['host']).to eq(hostname)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "timestamp" do
|
67
|
+
it "ensures time is in ISO8601 format" do
|
68
|
+
expect(event.timestamp).to eq(time.iso8601(3))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter::Cee do
|
4
|
+
include_context "formatter"
|
5
|
+
|
6
|
+
it "outputs in CEE format" do
|
7
|
+
expect(formatted_message).to match(/\A@cee:/)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "serializes the LogStash::Event data as JSON" do
|
11
|
+
json_data = formatted_message[/\A@cee:\s?(.*)\z/, 1]
|
12
|
+
json_message = JSON.parse(json_data)
|
13
|
+
expect(json_message["message"]).to eq(message)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter::CeeSyslog do
|
4
|
+
include_context "formatter"
|
5
|
+
|
6
|
+
describe "#call" do
|
7
|
+
let(:facility) { "facility" }
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow(subject).to receive(:facility).and_return(facility)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "outputs a facility before the @cee" do
|
14
|
+
expect(formatted_message).to match(/\A#{facility}:@cee:/)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "serializes the LogStash::Event data as JSON" do
|
18
|
+
json_data = formatted_message[/\A#{facility}:@cee:\s?(.*)\Z/, 1]
|
19
|
+
json_message = JSON.parse(json_data)
|
20
|
+
expect(json_message["message"]).to eq(message)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#facility" do
|
25
|
+
let(:host) { Socket.gethostname }
|
26
|
+
|
27
|
+
before do
|
28
|
+
formatted_message
|
29
|
+
end
|
30
|
+
|
31
|
+
it "includes hostname and progname" do
|
32
|
+
expect(subject.send(:facility)).to match(/\A#{host}\s#{progname}\z/)
|
33
|
+
end
|
34
|
+
|
35
|
+
context "without progname" do
|
36
|
+
let(:progname) { nil }
|
37
|
+
|
38
|
+
it "only includes hostname" do
|
39
|
+
expect(subject.send(:facility)).to match(/\A#{host}\z/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter::JsonLines do
|
4
|
+
include_context "formatter"
|
5
|
+
|
6
|
+
it "outputs in JSON format" do
|
7
|
+
json_message = JSON.parse(formatted_message)
|
8
|
+
expect(json_message["message"]).to eq(message)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "terminates with a line break" do
|
12
|
+
expect(formatted_message[-1]).to eq("\n")
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter::LogStashEvent do
|
4
|
+
include_context "formatter"
|
5
|
+
|
6
|
+
it "outputs a LogStash::Event" do
|
7
|
+
expect(formatted_message).to be_a LogStash::Event
|
8
|
+
expect(formatted_message["message"]).to eq(message)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger::Formatter do
|
4
|
+
describe "#new" do
|
5
|
+
context "built in formatters" do
|
6
|
+
it "returns a new JsonLines formatter" do
|
7
|
+
expect(described_class.new(:json_lines)).to be_a LogStashLogger::Formatter::JsonLines
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a new Json formatter" do
|
11
|
+
expect(described_class.new(:json)).to be_a LogStashLogger::Formatter::Json
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns a new Cee formatter" do
|
15
|
+
expect(described_class.new(:cee)).to be_a LogStashLogger::Formatter::Cee
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns a new CeeSyslog formatter" do
|
19
|
+
expect(described_class.new(:cee_syslog)).to be_a LogStashLogger::Formatter::CeeSyslog
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns a new LogStashEvent formatter" do
|
23
|
+
expect(described_class.new(:logstash_event)).to be_a LogStashLogger::Formatter::LogStashEvent
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "custom formatter" do
|
28
|
+
it "returns a new instance of a custom formatter class" do
|
29
|
+
expect(described_class.new(::Logger::Formatter)).to be_a ::Logger::Formatter
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns the same formatter instance if a custom formatter instance is passed in" do
|
33
|
+
formatter = ::Logger::Formatter.new
|
34
|
+
expect(described_class.new(formatter)).to eql(formatter)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns a formatter proc if it is passed in" do
|
38
|
+
formatter = proc do |severity, time, progname, msg|
|
39
|
+
msg
|
40
|
+
end
|
41
|
+
expect(described_class.new(formatter)).to eql(formatter)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns a formatter lambda if it is passed in" do
|
45
|
+
formatter = lambda do |severity, time, progname, msg|
|
46
|
+
msg
|
47
|
+
end
|
48
|
+
expect(described_class.new(formatter)).to eql(formatter)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -75,3 +75,14 @@ RSpec.shared_context 'device' do
|
|
75
75
|
let(:stdout_uri_config) { {uri: stdout_uri} }
|
76
76
|
let(:stderr_uri_config) { {uri: stderr_uri} }
|
77
77
|
end
|
78
|
+
|
79
|
+
RSpec.shared_context 'formatter' do
|
80
|
+
let(:severity) { "DEBUG" }
|
81
|
+
let(:time) { Time.now }
|
82
|
+
let(:progname) { "ruby" }
|
83
|
+
let(:message) { "foo" }
|
84
|
+
let(:hostname) { Socket.gethostname }
|
85
|
+
let(:formatted_message) do
|
86
|
+
subject.call(severity, time, progname, message)
|
87
|
+
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Butler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-event
|
@@ -188,6 +188,12 @@ files:
|
|
188
188
|
- lib/logstash-logger/device/udp.rb
|
189
189
|
- lib/logstash-logger/device/unix.rb
|
190
190
|
- lib/logstash-logger/formatter.rb
|
191
|
+
- lib/logstash-logger/formatter/base.rb
|
192
|
+
- lib/logstash-logger/formatter/cee.rb
|
193
|
+
- lib/logstash-logger/formatter/cee_syslog.rb
|
194
|
+
- lib/logstash-logger/formatter/json.rb
|
195
|
+
- lib/logstash-logger/formatter/json_lines.rb
|
196
|
+
- lib/logstash-logger/formatter/logstash_event.rb
|
191
197
|
- lib/logstash-logger/logger.rb
|
192
198
|
- lib/logstash-logger/railtie.rb
|
193
199
|
- lib/logstash-logger/tagged_logging.rb
|
@@ -215,6 +221,13 @@ files:
|
|
215
221
|
- spec/device/udp_spec.rb
|
216
222
|
- spec/device/unix_spec.rb
|
217
223
|
- spec/device_spec.rb
|
224
|
+
- spec/formatter/base_spec.rb
|
225
|
+
- spec/formatter/cee_spec.rb
|
226
|
+
- spec/formatter/cee_syslog_spec.rb
|
227
|
+
- spec/formatter/json_lines_spec.rb
|
228
|
+
- spec/formatter/json_spec.rb
|
229
|
+
- spec/formatter/logstash_event_spec.rb
|
230
|
+
- spec/formatter_spec.rb
|
218
231
|
- spec/logger_spec.rb
|
219
232
|
- spec/rails_spec.rb
|
220
233
|
- spec/spec_helper.rb
|
@@ -258,6 +271,13 @@ test_files:
|
|
258
271
|
- spec/device/udp_spec.rb
|
259
272
|
- spec/device/unix_spec.rb
|
260
273
|
- spec/device_spec.rb
|
274
|
+
- spec/formatter/base_spec.rb
|
275
|
+
- spec/formatter/cee_spec.rb
|
276
|
+
- spec/formatter/cee_syslog_spec.rb
|
277
|
+
- spec/formatter/json_lines_spec.rb
|
278
|
+
- spec/formatter/json_spec.rb
|
279
|
+
- spec/formatter/logstash_event_spec.rb
|
280
|
+
- spec/formatter_spec.rb
|
261
281
|
- spec/logger_spec.rb
|
262
282
|
- spec/rails_spec.rb
|
263
283
|
- spec/spec_helper.rb
|