gelf 1.1.3 → 1.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,10 +1,9 @@
1
- 1.1.0 (not yet released), 2010-12-xx:
1
+ 1.2.0, 2010-0x-yy:
2
2
  + compatibility with GELF specification 1.0:
3
- * requires graylog2-server version after 0.9.XXXXXXXXXXXX or graylog2-server-twisted;
4
- * requires graylog2-web-interface version XXXXXXXXXXXX;
5
- + Notifier#default_options;
3
+ * requires modern graylog2-server and graylog2-web-interface;
4
+ + Notifier#default_options, Notifier#default_options=;
6
5
  + severity (level) threshold;
7
- + automatically set '_file', '_line' and '_timestamp' fields;
6
+ + automatically set 'file', 'line' and 'timestamp' fields;
8
7
  + wrappers for GELF::Notifier#notify with severity:
9
8
  + GELF::Notifier.debug
10
9
  + GELF::Notifier.info
@@ -19,6 +18,11 @@
19
18
  + GELF::Logger#add(GELF::FATAL) { 'Fatal error!' }
20
19
  + GELF::Logger#close
21
20
  + GELF::Logger#level = GELF::INFO
21
+ + allow to change severity mapping;
22
+ + send messages to receivers in round-robin;
23
+ * GELF::Notifier#host and #port are attr_readers now and deprecated (were attr_accessor);
24
+ + allow to disable file and line collection (GELF::Notifier#collect_file_and_line = false);
25
+ - deprecated Gelf class removed.
22
26
 
23
27
  1.0.2, 2010-11-29:
24
28
  1.0.1, 2010-11-29:
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Lennart Koopmann, Aleksey Palazhchenko
1
+ Copyright (c) 2010 Lennart Koopmann, Alexey Palazhchenko
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,6 +1,6 @@
1
1
  = GELF
2
2
 
3
- This is the new GELF gem written by Aleksey Palazhchenko. It is based on the old gem by Lennart Koopmann and allows you to send GELF
3
+ This is the new GELF gem written by Alexey Palazhchenko. It is based on the old gem by Lennart Koopmann and allows you to send GELF
4
4
  messages to Graylog2 server instances. See http://www.graylog2.org/about/gelf for more information about GELF and
5
5
  http://www.graylog2.org/documentation/libraries for usage examples.
6
6
 
@@ -17,4 +17,4 @@ Works with Ruby 1.8.7 and 1.9.2. 1.8.6 is not supported.
17
17
 
18
18
  == Copyright
19
19
 
20
- Copyright (c) 2010 Lennart Koopmann and Aleksey Palazhchenko. See LICENSE for details.
20
+ Copyright (c) 2010 Lennart Koopmann and Alexey Palazhchenko. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,24 +1,29 @@
1
- require 'rubygems'
2
1
  require 'rake'
3
2
 
4
3
  begin
5
- gem 'jeweler', '~> 1.4.0' # https://github.com/technicalpickles/jeweler/issues/issue/150
4
+ require 'ci/reporter/rake/test_unit'
5
+ rescue LoadError
6
+ # nothing
7
+ end
8
+
9
+ begin
6
10
  require 'jeweler'
11
+
7
12
  Jeweler::Tasks.new do |gem|
8
13
  gem.name = "gelf"
9
14
  gem.summary = 'Library to send GELF messages to Graylog2 logging server.'
10
15
  gem.description = 'Library to send GELF messages to Graylog2 logging server. Supports plain-text, GELF messages and exceptions.'
11
- gem.email = "aleksey.palazhchenko@gmail.com"
16
+ gem.email = "alexey.palazhchenko@gmail.com"
12
17
  gem.homepage = "http://github.com/Graylog2/gelf-rb"
13
- gem.authors = ["Aleksey Palazhchenko", "Lennart Koopmann"]
18
+ gem.authors = ["Alexey Palazhchenko", "Lennart Koopmann"]
14
19
  gem.add_dependency "json"
15
20
  gem.add_development_dependency "shoulda"
16
21
  gem.add_development_dependency "mocha"
17
22
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
23
  end
19
- Jeweler::GemcutterTasks.new
20
- rescue LoadError
21
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
24
+ rescue LoadError => e
25
+ puts e
26
+ abort "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
27
  end
23
28
 
24
29
  require 'rake/testtask'
@@ -28,6 +33,9 @@ Rake::TestTask.new(:test) do |test|
28
33
  test.verbose = true
29
34
  end
30
35
 
36
+ task :test => :check_dependencies
37
+ task :default => :test
38
+
31
39
  begin
32
40
  require 'rcov/rcovtask'
33
41
  Rcov::RcovTask.new do |test|
@@ -36,20 +44,47 @@ begin
36
44
  test.rcov_opts << '--exclude gem'
37
45
  test.verbose = true
38
46
  end
39
- rescue LoadError
47
+ rescue LoadError => e
40
48
  task :rcov do
41
- abort "RCov is not available. In order to run rcov, you must: gem install rcov"
49
+ puts e
50
+ abort "rcov is not available. Run: gem install rcov"
42
51
  end
43
52
  end
44
53
 
45
54
  begin
55
+ gem 'ruby_parser', '~> 2.0.6'
56
+ gem 'activesupport', '~> 3.0.0'
57
+ gem 'metric_fu', '~> 2.1.1'
46
58
  require 'metric_fu'
47
- rescue LoadError
48
- end
49
59
 
50
- task :test => :check_dependencies
60
+ MetricFu::Configuration.run do |config|
61
+ # Saikuro is useless
62
+ config.metrics -= [:saikuro]
51
63
 
52
- task :default => :test
64
+ config.flay = { :dirs_to_flay => ['lib'],
65
+ :minimum_score => 10 }
66
+ config.flog = { :dirs_to_flog => ['lib'] }
67
+ config.reek = { :dirs_to_reek => ['lib'] }
68
+ config.roodi = { :dirs_to_roodi => ['lib'] }
69
+ config.rcov = { :environment => 'test',
70
+ :test_files => ['test/test_*.rb'],
71
+ :rcov_opts => ["-I 'lib:test'",
72
+ "--sort coverage",
73
+ "--no-html",
74
+ "--text-coverage",
75
+ "--no-color",
76
+ "--exclude /test/,/gems/"]}
77
+ config.graph_engine = :gchart
78
+ end
79
+
80
+ rescue LoadError, NameError => e
81
+ desc 'Generate all metrics reports'
82
+ task :'metrics:all' do
83
+ puts e.inspect
84
+ # puts e.backtrace
85
+ abort "metric_fu is not available. Run: gem install metric_fu"
86
+ end
87
+ end
53
88
 
54
89
  require 'rake/rdoctask'
55
90
  Rake::RDocTask.new do |rdoc|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.3
1
+ 1.2.0.beta1
@@ -18,8 +18,8 @@ TARGET_PORT = 12201
18
18
  DEFAULT_OPTIONS = { '_host' => 'localhost' }
19
19
  TIMES = 5000
20
20
 
21
- SHORT_HASH = { '_short_message' => 'message' }
22
- LONG_HASH = { '_short_message' => 'message', '_long_message' => k3_message }
21
+ SHORT_HASH = { 'short_message' => 'message' }
22
+ LONG_HASH = { 'short_message' => 'message', 'long_message' => k3_message }
23
23
 
24
24
 
25
25
  notifier_lan = GELF::Notifier.new(TARGET_HOST, TARGET_PORT, 'LAN', DEFAULT_OPTIONS)
@@ -1,60 +1,46 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gelf}
8
- s.version = "1.1.3"
8
+ s.version = "1.2.0.beta1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Aleksey Palazhchenko", "Lennart Koopmann"]
12
- s.date = %q{2011-01-23}
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Alexey Palazhchenko}, %q{Lennart Koopmann}]
12
+ s.date = %q{2011-05-23}
13
13
  s.description = %q{Library to send GELF messages to Graylog2 logging server. Supports plain-text, GELF messages and exceptions.}
14
- s.email = %q{aleksey.palazhchenko@gmail.com}
14
+ s.email = %q{alexey.palazhchenko@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
- ".gitignore",
21
- "CHANGELOG",
22
- "LICENSE",
23
- "README.rdoc",
24
- "Rakefile",
25
- "VERSION",
26
- "benchmarks/notifier.rb",
27
- "gelf.gemspec",
28
- "lib/gelf.rb",
29
- "lib/gelf/deprecations.rb",
30
- "lib/gelf/em_sender.rb",
31
- "lib/gelf/logger.rb",
32
- "lib/gelf/notifier.rb",
33
- "lib/gelf/ruby_sender.rb",
34
- "lib/gelf/severity.rb",
35
- "test/helper.rb",
36
- "test/test_deprecations.rb",
37
- "test/test_logger.rb",
38
- "test/test_notifier.rb",
39
- "test/test_ruby_sender.rb",
40
- "test/test_severity.rb"
20
+ "CHANGELOG",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "benchmarks/notifier.rb",
26
+ "gelf.gemspec",
27
+ "lib/gelf.rb",
28
+ "lib/gelf/logger.rb",
29
+ "lib/gelf/notifier.rb",
30
+ "lib/gelf/ruby_sender.rb",
31
+ "lib/gelf/severity.rb",
32
+ "test/helper.rb",
33
+ "test/test_logger.rb",
34
+ "test/test_notifier.rb",
35
+ "test/test_ruby_sender.rb",
36
+ "test/test_severity.rb"
41
37
  ]
42
38
  s.homepage = %q{http://github.com/Graylog2/gelf-rb}
43
- s.rdoc_options = ["--charset=UTF-8"]
44
- s.require_paths = ["lib"]
45
- s.rubygems_version = %q{1.3.7}
39
+ s.require_paths = [%q{lib}]
40
+ s.rubygems_version = %q{1.8.3}
46
41
  s.summary = %q{Library to send GELF messages to Graylog2 logging server.}
47
- s.test_files = [
48
- "test/helper.rb",
49
- "test/test_logger.rb",
50
- "test/test_notifier.rb",
51
- "test/test_severity.rb",
52
- "test/test_ruby_sender.rb",
53
- "test/test_deprecations.rb"
54
- ]
55
42
 
56
43
  if s.respond_to? :specification_version then
57
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
44
  s.specification_version = 3
59
45
 
60
46
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -11,4 +11,3 @@ require 'gelf/severity'
11
11
  require 'gelf/ruby_sender'
12
12
  require 'gelf/notifier'
13
13
  require 'gelf/logger'
14
- require 'gelf/deprecations'
@@ -5,22 +5,22 @@ module GELF
5
5
  def close
6
6
  end
7
7
 
8
- # Use it like Logger#add or better not to use at all.
8
+ # Use it like Logger#add... or better not to use at all.
9
9
  def add(level, *args)
10
10
  raise ArgumentError.new('Wrong arguments.') unless (0..2).include?(args.count)
11
11
 
12
12
  # Ruby Logger's author is a maniac.
13
- message, facility = if args.count == 2
13
+ message, progname = if args.count == 2
14
14
  [args[0], args[1]]
15
15
  elsif args.count == 0
16
- [yield, nil]
16
+ [yield, default_options['facility']]
17
17
  elsif block_given?
18
18
  [yield, args[0]]
19
19
  else
20
- [args[0], nil]
20
+ [args[0], default_options['facility']]
21
21
  end
22
22
 
23
- hash = {'short_message' => message, 'facility' => facility}
23
+ hash = {'short_message' => message, 'facility' => progname}
24
24
  hash.merge!(self.class.extract_hash_from_exception(message)) if message.is_a?(Exception)
25
25
  notify_with_level(level, hash)
26
26
  end
@@ -40,11 +40,14 @@ module GELF
40
40
  end
41
41
 
42
42
  def <<(message)
43
- notify('short_message' => message, 'level' => GELF::UNKNOWN)
43
+ notify_with_level(GELF::UNKNOWN, 'short_message' => message)
44
44
  end
45
45
  end
46
46
 
47
47
  # Graylog2 notifier, compatible with Ruby Logger.
48
+ # You can use it with Rails like this:
49
+ # config.logger = GELF::Logger.new("localhost", 12201, "WAN", { :facility => "appname" })
50
+ # config.colorize_logging = false
48
51
  class Logger < Notifier
49
52
  include LoggerCompatibility
50
53
  @last_chunk_id = 0
@@ -6,18 +6,18 @@ module GELF
6
6
  attr_accessor :last_chunk_id
7
7
  end
8
8
 
9
- attr_accessor :host, :port, :default_options, :enabled
10
- attr_reader :max_chunk_size, :level
9
+ attr_accessor :enabled, :collect_file_and_line
10
+ attr_reader :max_chunk_size, :level, :default_options, :level_mapping
11
11
 
12
12
  # +host+ and +port+ are host/ip and port of graylog2-server.
13
13
  # +max_size+ is passed to max_chunk_size=.
14
14
  # +default_options+ is used in notify!
15
15
  def initialize(host = 'localhost', port = 12201, max_size = 'WAN', default_options = {})
16
16
  @enabled = true
17
+ @collect_file_and_line = true
17
18
 
18
19
  self.level = GELF::DEBUG
19
-
20
- self.host, self.port, self.max_chunk_size = host, port, max_size
20
+ self.max_chunk_size = max_size
21
21
 
22
22
  self.default_options = default_options
23
23
  self.default_options['version'] = SPEC_VERSION
@@ -25,19 +25,42 @@ module GELF
25
25
  self.default_options['level'] ||= GELF::UNKNOWN
26
26
  self.default_options['facility'] ||= 'gelf-rb'
27
27
 
28
- @sender = RubyUdpSender.new(host, port)
28
+ @sender = RubyUdpSender.new([[host, port]])
29
+ self.level_mapping = :logger
30
+ end
31
+
32
+ # Get a list of receivers.
33
+ # notifier.addresses # => [['localhost', 12201], ['localhost', 12202]]
34
+ def addresses
35
+ @sender.addresses
36
+ end
37
+
38
+ # Set a list of receivers.
39
+ # notifier.addresses = [['localhost', 12201], ['localhost', 12202]]
40
+ def addresses=(addrs)
41
+ @sender.addresses = addrs
42
+ end
43
+
44
+ def host
45
+ warn "GELF::Notifier#host is deprecated. Use #addresses instead."
46
+ self.addresses.first[0]
47
+ end
48
+
49
+ def port
50
+ warn "GELF::Notifier#port is deprecated. Use #addresses instead."
51
+ self.addresses.first[1]
29
52
  end
30
53
 
31
54
  # +size+ may be a number of bytes, 'WAN' (1420 bytes) or 'LAN' (8154).
32
55
  # Default (safe) value is 'WAN'.
33
56
  def max_chunk_size=(size)
34
- size_s = size.to_s.downcase
35
- if size_s == 'wan'
36
- @max_chunk_size = 1420
37
- elsif size_s == 'lan'
38
- @max_chunk_size = 8154
39
- else
40
- @max_chunk_size = size.to_int
57
+ case size.to_s.downcase
58
+ when 'wan'
59
+ @max_chunk_size = 1420
60
+ when 'lan'
61
+ @max_chunk_size = 8154
62
+ else
63
+ @max_chunk_size = size.to_int
41
64
  end
42
65
  end
43
66
 
@@ -49,6 +72,23 @@ module GELF
49
72
  end
50
73
  end
51
74
 
75
+ def default_options=(options)
76
+ @default_options = self.class.stringify_keys(options)
77
+ end
78
+
79
+ # +mapping+ may be a hash, 'logger' (GELF::LOGGER_MAPPING) or 'direct' (GELF::DIRECT_MAPPING).
80
+ # Default (compatible) value is 'logger'.
81
+ def level_mapping=(mapping)
82
+ case mapping.to_s.downcase
83
+ when 'logger'
84
+ @level_mapping = GELF::LOGGER_MAPPING
85
+ when 'direct'
86
+ @level_mapping = GELF::DIRECT_MAPPING
87
+ else
88
+ @level_mapping = mapping
89
+ end
90
+ end
91
+
52
92
  def disable
53
93
  @enabled = false
54
94
  end
@@ -72,6 +112,7 @@ module GELF
72
112
  # - string-like object (anything which responds to +to_s+) with optional hash-like object:
73
113
  # notify!('Plain olde text message', :scribe => 'AlekSi')
74
114
  # Resulted fields are merged with +default_options+, the latter will never overwrite the former.
115
+ # This method will raise +ArgumentError+ if arguments are wrong. Consider using notify instead.
75
116
  def notify!(*args)
76
117
  notify_with_level!(nil, *args)
77
118
  end
@@ -111,10 +152,9 @@ module GELF
111
152
  { 'short_message' => object.to_s }
112
153
  end
113
154
 
114
- @hash = default_options.merge(args.merge(primary_data))
115
- stringify_hash_keys
155
+ @hash = default_options.merge(self.class.stringify_keys(args.merge(primary_data)))
116
156
  convert_hoptoad_keys_to_graylog2
117
- set_file_and_line
157
+ set_file_and_line if @collect_file_and_line
118
158
  set_timestamp
119
159
  check_presence_of_mandatory_attributes
120
160
  @hash
@@ -143,8 +183,8 @@ module GELF
143
183
  frame = stack.shift
144
184
  end while frame.include?(LIB_GELF_PATTERN)
145
185
  match = CALLER_REGEXP.match(frame)
146
- @hash['file'] = match[1] if @hash['file'] == nil
147
- @hash['line'] = match[2].to_i if @hash['line'] == nil
186
+ @hash['file'] = match[1]
187
+ @hash['line'] = match[2].to_i
148
188
  end
149
189
 
150
190
  def set_timestamp
@@ -182,16 +222,18 @@ module GELF
182
222
  def serialize_hash
183
223
  raise ArgumentError.new("Hash is empty.") if @hash.nil? || @hash.empty?
184
224
 
185
- @hash['level'] = GELF::LEVELS_MAPPING[@hash['level']]
225
+ @hash['level'] = @level_mapping[@hash['level']]
186
226
 
187
227
  Zlib::Deflate.deflate(@hash.to_json).bytes
188
228
  end
189
229
 
190
- def stringify_hash_keys
191
- @hash.keys.each do |key|
192
- value, key_s = @hash.delete(key), key.to_s
193
- @hash[key_s] = value
230
+ def self.stringify_keys(hash)
231
+ hash.keys.each do |key|
232
+ value, key_s = hash.delete(key), key.to_s
233
+ raise ArgumentError.new("Both #{key.inspect} and #{key_s} are present.") if hash.has_key?(key_s)
234
+ hash[key_s] = value
194
235
  end
236
+ hash
195
237
  end
196
238
  end
197
239
  end
@@ -1,29 +1,20 @@
1
1
  module GELF
2
2
  # Plain Ruby UDP sender.
3
3
  class RubyUdpSender
4
- def initialize(host, port)
5
- @host, @port = host, port
4
+ attr_accessor :addresses
5
+
6
+ def initialize(addresses)
7
+ @addresses = addresses
8
+ @i = 0
6
9
  @socket = UDPSocket.open
7
10
  end
8
11
 
9
12
  def send_datagrams(datagrams)
13
+ host, port = @addresses[@i]
14
+ @i = (@i + 1) % @addresses.length
10
15
  datagrams.each do |datagram|
11
- @socket.send(datagram, 0, @host, @port)
16
+ @socket.send(datagram, 0, host, port)
12
17
  end
13
18
  end
14
19
  end
15
-
16
- # Plain Ruby TCP sender.
17
- # class RubyTcpSender
18
- # def initialize(host, port)
19
- # @host, @port = host, port
20
- # @socket = TCPSocket.open
21
- # end
22
- #
23
- # def send_datagrams(datagrams)
24
- # datagrams.each do |datagram|
25
- # @socket.send(datagram, 0, @host, @port)
26
- # end
27
- # end
28
- # end
29
20
  end
@@ -1,11 +1,11 @@
1
1
  module GELF
2
- # There are two things you should know about log leves/severity:
2
+ # There are two things you should know about log levels/severity:
3
3
  # - syslog defines levels from 0 (Emergency) to 7 (Debug).
4
4
  # 0 (Emergency) and 1 (Alert) levels are reserved for OS kernel.
5
5
  # - Ruby default Logger defines levels from 0 (DEBUG) to 4 (FATAL) and 5 (UNKNOWN).
6
6
  # Note that order is inverted.
7
7
  # For compatibility we define our constants as Ruby Logger, and convert values before
8
- # generating GELF message.
8
+ # generating GELF message, using defined mapping.
9
9
 
10
10
  module Levels
11
11
  DEBUG = 0
@@ -18,11 +18,20 @@ module GELF
18
18
 
19
19
  include Levels
20
20
 
21
- # Maps Ruby Logger levels to syslog levels as SyslogLogger and syslogger gems.
22
- LEVELS_MAPPING = {DEBUG => 7, # Debug
21
+ # Maps Ruby Logger levels to syslog levels as SyslogLogger and syslogger gems. This one is default.
22
+ LOGGER_MAPPING = {DEBUG => 7, # Debug
23
23
  INFO => 6, # Info
24
24
  WARN => 5, # Notice
25
25
  ERROR => 4, # Warning
26
26
  FATAL => 3, # Error
27
27
  UNKNOWN => 1} # Alert – shouldn't be used
28
+
29
+ # Maps Ruby Logger levels to syslog levels as is.
30
+ DIRECT_MAPPING = {DEBUG => 7, # Debug
31
+ INFO => 6, # Info
32
+ # skip 5 Notice
33
+ WARN => 4, # Warning
34
+ ERROR => 3, # Error
35
+ FATAL => 2, # Critical
36
+ UNKNOWN => 1} # Alert – shouldn't be used
28
37
  end
@@ -3,11 +3,6 @@ require 'test/unit'
3
3
  require 'shoulda'
4
4
  require 'mocha'
5
5
 
6
- begin
7
- require 'ruby-debug'
8
- rescue LoadError
9
- end
10
-
11
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
12
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
13
8
  require 'gelf'
@@ -1,135 +1,139 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestLogger < Test::Unit::TestCase
4
- context "with notifier with mocked sender" do
4
+ context "with logger with mocked sender" do
5
5
  setup do
6
6
  Socket.stubs(:gethostname).returns('stubbed_hostname')
7
- @notifier = GELF::Logger.new('host', 12345)
7
+ @logger = GELF::Logger.new
8
8
  @sender = mock
9
- @notifier.instance_variable_set('@sender', @sender)
9
+ @logger.instance_variable_set('@sender', @sender)
10
10
  end
11
11
 
12
12
  should "respond to #close" do
13
- assert @notifier.respond_to?(:close)
13
+ assert @logger.respond_to?(:close)
14
14
  end
15
15
 
16
16
  context "#add" do
17
17
  # logger.add(Logger::INFO, 'Message')
18
- should "implement add method with level and message from parameters" do
19
- @notifier.expects(:notify_with_level!).with do |level, hash|
18
+ should "implement add method with level and message from parameters, facility from defaults" do
19
+ @logger.expects(:notify_with_level!).with do |level, hash|
20
20
  level == GELF::INFO &&
21
- hash['short_message'] == 'Message'
21
+ hash['short_message'] == 'Message' &&
22
+ hash['facility'] == 'gelf-rb'
22
23
  end
23
- @notifier.add(GELF::INFO, 'Message')
24
+ @logger.add(GELF::INFO, 'Message')
24
25
  end
25
26
 
26
27
  # logger.add(Logger::INFO, RuntimeError.new('Boom!'))
27
- should "implement add method with level and exception from parameters" do
28
- @notifier.expects(:notify_with_level!).with do |level, hash|
28
+ should "implement add method with level and exception from parameters, facility from defaults" do
29
+ @logger.expects(:notify_with_level!).with do |level, hash|
29
30
  level == GELF::INFO &&
30
31
  hash['short_message'] == 'RuntimeError: Boom!' &&
31
- hash['full_message'] =~ /^Backtrace/
32
+ hash['full_message'] =~ /^Backtrace/ &&
33
+ hash['facility'] == 'gelf-rb'
32
34
  end
33
- @notifier.add(GELF::INFO, RuntimeError.new('Boom!'))
35
+ @logger.add(GELF::INFO, RuntimeError.new('Boom!'))
34
36
  end
35
37
 
36
38
  # logger.add(Logger::INFO) { 'Message' }
37
- should "implement add method with level from parameter and message from block" do
38
- @notifier.expects(:notify_with_level!).with do |level, hash|
39
+ should "implement add method with level from parameter, message from block, facility from defaults" do
40
+ @logger.expects(:notify_with_level!).with do |level, hash|
39
41
  level == GELF::INFO &&
40
- hash['short_message'] == 'Message'
42
+ hash['short_message'] == 'Message' &&
43
+ hash['facility'] == 'gelf-rb'
41
44
  end
42
- @notifier.add(GELF::INFO) { 'Message' }
45
+ @logger.add(GELF::INFO) { 'Message' }
43
46
  end
44
47
 
45
48
  # logger.add(Logger::INFO) { RuntimeError.new('Boom!') }
46
- should "implement add method with level from parameter and exception from block" do
47
- @notifier.expects(:notify_with_level!).with do |level, hash|
49
+ should "implement add method with level from parameter, exception from block, facility from defaults" do
50
+ @logger.expects(:notify_with_level!).with do |level, hash|
48
51
  level == GELF::INFO &&
49
52
  hash['short_message'] == 'RuntimeError: Boom!' &&
50
- hash['full_message'] =~ /^Backtrace/
53
+ hash['full_message'] =~ /^Backtrace/ &&
54
+ hash['facility'] == 'gelf-rb'
51
55
  end
52
- @notifier.add(GELF::INFO) { RuntimeError.new('Boom!') }
56
+ @logger.add(GELF::INFO) { RuntimeError.new('Boom!') }
53
57
  end
54
58
 
55
59
  # logger.add(Logger::INFO, 'Message', 'Facility')
56
60
  should "implement add method with level, message and facility from parameters" do
57
- @notifier.expects(:notify_with_level!).with do |level, hash|
61
+ @logger.expects(:notify_with_level!).with do |level, hash|
58
62
  level == GELF::INFO &&
59
63
  hash['short_message'] == 'Message' &&
60
64
  hash['facility'] == 'Facility'
61
65
  end
62
- @notifier.add(GELF::INFO, 'Message', 'Facility')
66
+ @logger.add(GELF::INFO, 'Message', 'Facility')
63
67
  end
64
68
 
65
69
  # logger.add(Logger::INFO, RuntimeError.new('Boom!'), 'Facility')
66
70
  should "implement add method with level, exception and facility from parameters" do
67
- @notifier.expects(:notify_with_level!).with do |level, hash|
71
+ @logger.expects(:notify_with_level!).with do |level, hash|
68
72
  level == GELF::INFO &&
69
73
  hash['short_message'] == 'RuntimeError: Boom!' &&
70
74
  hash['full_message'] =~ /^Backtrace/ &&
71
75
  hash['facility'] == 'Facility'
72
76
  end
73
- @notifier.add(GELF::INFO, RuntimeError.new('Boom!'), 'Facility')
77
+ @logger.add(GELF::INFO, RuntimeError.new('Boom!'), 'Facility')
74
78
  end
75
79
 
76
80
  # logger.add(Logger::INFO, 'Facility') { 'Message' }
77
- should "implement add method with level and facility from parameters and message from block" do
78
- @notifier.expects(:notify_with_level!).with do |level, hash|
81
+ should "implement add method with level and facility from parameters, message from block" do
82
+ @logger.expects(:notify_with_level!).with do |level, hash|
79
83
  level == GELF::INFO &&
80
84
  hash['short_message'] == 'Message' &&
81
85
  hash['facility'] == 'Facility'
82
86
  end
83
- @notifier.add(GELF::INFO, 'Facility') { 'Message' }
87
+ @logger.add(GELF::INFO, 'Facility') { 'Message' }
84
88
  end
85
89
 
86
90
  # logger.add(Logger::INFO, 'Facility') { RuntimeError.new('Boom!') }
87
- should "implement add method with level and facility from parameters and exception from block" do
88
- @notifier.expects(:notify_with_level!).with do |level, hash|
91
+ should "implement add method with level and facility from parameters, exception from block" do
92
+ @logger.expects(:notify_with_level!).with do |level, hash|
89
93
  level == GELF::INFO &&
90
94
  hash['short_message'] == 'RuntimeError: Boom!' &&
91
95
  hash['full_message'] =~ /^Backtrace/ &&
92
96
  hash['facility'] == 'Facility'
93
97
  end
94
- @notifier.add(GELF::INFO, 'Facility') { RuntimeError.new('Boom!') }
98
+ @logger.add(GELF::INFO, 'Facility') { RuntimeError.new('Boom!') }
95
99
  end
96
100
  end
97
101
 
98
102
  GELF::Levels.constants.each do |const|
99
103
  # logger.error "Argument #{ @foo } mismatch."
100
- should "call notify with level #{const} from method name and message from parameter" do
101
- @notifier.expects(:add).with(GELF.const_get(const), 'message')
102
- @notifier.__send__(const.downcase, 'message')
104
+ should "call add with level #{const} from method name, message from parameter" do
105
+ @logger.expects(:add).with(GELF.const_get(const), 'message')
106
+ @logger.__send__(const.downcase, 'message')
103
107
  end
104
108
 
105
109
  # logger.fatal { "Argument 'foo' not given." }
106
- should "call notify with level #{const} from method name and message from block" do
107
- @notifier.expects(:add).with(GELF.const_get(const), 'message')
108
- @notifier.__send__(const.downcase) { 'message' }
110
+ should "call add with level #{const} from method name, message from block" do
111
+ @logger.expects(:add).with(GELF.const_get(const), 'message')
112
+ @logger.__send__(const.downcase) { 'message' }
109
113
  end
110
114
 
111
115
  # logger.info('initialize') { "Initializing..." }
112
- should "call notify with level #{const} from method name, facility from parameter and message from block" do
113
- @notifier.expects(:add).with(GELF.const_get(const), 'message', 'facility')
114
- @notifier.__send__(const.downcase, 'facility') { 'message' }
116
+ should "call add with level #{const} from method name, facility from parameter, message from block" do
117
+ @logger.expects(:add).with(GELF.const_get(const), 'message', 'facility')
118
+ @logger.__send__(const.downcase, 'facility') { 'message' }
115
119
  end
116
120
 
117
121
  should "respond to #{const.downcase}?" do
118
- @notifier.level = GELF.const_get(const) - 1
119
- assert @notifier.__send__(const.to_s.downcase + '?')
120
- @notifier.level = GELF.const_get(const)
121
- assert @notifier.__send__(const.to_s.downcase + '?')
122
- @notifier.level = GELF.const_get(const) + 1
123
- assert !@notifier.__send__(const.to_s.downcase + '?')
122
+ @logger.level = GELF.const_get(const) - 1
123
+ assert @logger.__send__(const.to_s.downcase + '?')
124
+ @logger.level = GELF.const_get(const)
125
+ assert @logger.__send__(const.to_s.downcase + '?')
126
+ @logger.level = GELF.const_get(const) + 1
127
+ assert !@logger.__send__(const.to_s.downcase + '?')
124
128
  end
125
129
  end
126
130
 
127
- should "support Notifier#<<" do
128
- @notifier.expects(:notify_with_level!).with do |nil_, hash|
129
- hash['short_message'] == "Message" &&
130
- hash['level'] == GELF::UNKNOWN
131
+ should "support Logger#<<" do
132
+ @logger.expects(:notify_with_level!).with do |level, hash|
133
+ level == GELF::UNKNOWN &&
134
+ hash['short_message'] == "Message"
131
135
  end
132
- @notifier << "Message"
136
+ @logger << "Message"
133
137
  end
134
138
  end
135
139
  end
@@ -6,12 +6,13 @@ class TestNotifier < Test::Unit::TestCase
6
6
  should "allow access to host, port, max_chunk_size and default_options" do
7
7
  Socket.expects(:gethostname).returns('default_hostname')
8
8
  n = GELF::Notifier.new
9
- assert_equal ['localhost', 12201, 1420], [n.host, n.port, n.max_chunk_size]
9
+ assert_equal [[['localhost', 12201]], 1420], [n.addresses, n.max_chunk_size]
10
10
  assert_equal( { 'version' => '1.0', 'level' => GELF::UNKNOWN,
11
11
  'host' => 'default_hostname', 'facility' => 'gelf-rb' },
12
12
  n.default_options )
13
- n.host, n.port, n.max_chunk_size, n.default_options = 'graylog2.org', 7777, :lan, {'host' => 'grayhost'}
14
- assert_equal ['graylog2.org', 7777, 8154], [n.host, n.port, n.max_chunk_size]
13
+ n.addresses, n.max_chunk_size, n.default_options = [['graylog2.org', 7777]], :lan, {:host => 'grayhost'}
14
+ assert_equal [['graylog2.org', 7777]], n.addresses
15
+ assert_equal 8154, n.max_chunk_size
15
16
  assert_equal({'host' => 'grayhost'}, n.default_options)
16
17
 
17
18
  n.max_chunk_size = 1337.1
@@ -87,6 +88,10 @@ class TestNotifier < Test::Unit::TestCase
87
88
  assert !hash.has_key?(:short_message)
88
89
  end
89
90
 
91
+ should "not overwrite keys on convert" do
92
+ assert_raise(ArgumentError) { @notifier.__send__(:extract_hash, :short_message => :message1, 'short_message' => 'message2') }
93
+ end
94
+
90
95
  should "use default_options" do
91
96
  @notifier.default_options = {:foo => 'bar', 'short_message' => 'will be hidden by explicit argument', 'host' => 'some_host'}
92
97
  hash = @notifier.__send__(:extract_hash, { 'version' => '1.0', 'short_message' => 'message' })
@@ -117,16 +122,18 @@ class TestNotifier < Test::Unit::TestCase
117
122
 
118
123
  context "serialize_hash" do
119
124
  setup do
125
+ @notifier.level_mapping = :direct
120
126
  @notifier.instance_variable_set('@hash', { 'level' => GELF::WARN, 'field' => 'value' })
121
127
  @data = @notifier.__send__(:serialize_hash)
122
- assert_instance_of Enumerable::Enumerator, @data
128
+ assert @data.respond_to?(:each)
123
129
  @deserialized_hash = JSON.parse(Zlib::Inflate.inflate(@data.to_a.pack('C*')))
124
130
  assert_instance_of Hash, @deserialized_hash
125
131
  end
126
132
 
127
- should "map level" do
133
+ should "map level using mapping" do
128
134
  assert_not_equal GELF::WARN, @deserialized_hash['level']
129
- assert_equal GELF::LEVELS_MAPPING[GELF::WARN], @deserialized_hash['level']
135
+ assert_not_equal GELF::LOGGER_MAPPING[GELF::WARN], @deserialized_hash['level']
136
+ assert_equal GELF::DIRECT_MAPPING[GELF::WARN], @deserialized_hash['level']
130
137
  end
131
138
  end
132
139
 
@@ -3,18 +3,25 @@ require 'helper'
3
3
  class TestRubyUdpSender < Test::Unit::TestCase
4
4
  context "with ruby sender" do
5
5
  setup do
6
- @host, @port = 'localhost', 12201
7
- @sender = GELF::RubyUdpSender.new('localhost', 12201)
8
- @datagrams = %w(d1 d2 d3)
6
+ @addresses = [['localhost', 12201], ['localhost', 12202]]
7
+ @sender = GELF::RubyUdpSender.new(@addresses)
8
+ @datagrams1 = %w(d1 d2 d3)
9
+ @datagrams2 = %w(e1 e2 e3)
9
10
  end
10
11
 
11
12
  context "send_datagrams" do
12
13
  setup do
13
- @sender.send_datagrams(@datagrams)
14
+ @sender.send_datagrams(@datagrams1)
15
+ @sender.send_datagrams(@datagrams2)
14
16
  end
15
17
 
16
- before_should "be called with 3 times correct parameters" do
17
- UDPSocket.any_instance.expects(:send).times(3).with(instance_of(String), 0, @host, @port).returns(@datagrams)
18
+ before_should "be called 3 times with 1st and 2nd address" do
19
+ UDPSocket.any_instance.expects(:send).times(3).with do |datagram, _, host, port|
20
+ datagram.start_with?('d') && host == 'localhost' && port == 12201
21
+ end
22
+ UDPSocket.any_instance.expects(:send).times(3).with do |datagram, _, host, port|
23
+ datagram.start_with?('e') && host == 'localhost' && port == 12202
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -1,8 +1,8 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestSeverity < Test::Unit::TestCase
4
- should "map Ruby Logger levels to syslog levels" do
5
- GELF::LEVELS_MAPPING.each do |ruby_level, syslog_level|
4
+ should "map Ruby Logger levels to syslog levels as SyslogLogger" do
5
+ GELF::LOGGER_MAPPING.each do |ruby_level, syslog_level|
6
6
  assert_not_equal syslog_level, ruby_level
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,22 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gelf
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 62196385
5
+ prerelease: 6
5
6
  segments:
6
7
  - 1
8
+ - 2
9
+ - 0
10
+ - beta
7
11
  - 1
8
- - 3
9
- version: 1.1.3
12
+ version: 1.2.0.beta1
10
13
  platform: ruby
11
14
  authors:
12
- - Aleksey Palazhchenko
15
+ - Alexey Palazhchenko
13
16
  - Lennart Koopmann
14
17
  autorequire:
15
18
  bindir: bin
16
19
  cert_chain: []
17
20
 
18
- date: 2011-01-23 00:00:00 +01:00
19
- default_executable:
21
+ date: 2011-05-23 00:00:00 Z
20
22
  dependencies:
21
23
  - !ruby/object:Gem::Dependency
22
24
  name: json
@@ -26,6 +28,7 @@ dependencies:
26
28
  requirements:
27
29
  - - ">="
28
30
  - !ruby/object:Gem::Version
31
+ hash: 3
29
32
  segments:
30
33
  - 0
31
34
  version: "0"
@@ -39,6 +42,7 @@ dependencies:
39
42
  requirements:
40
43
  - - ">="
41
44
  - !ruby/object:Gem::Version
45
+ hash: 3
42
46
  segments:
43
47
  - 0
44
48
  version: "0"
@@ -52,13 +56,14 @@ dependencies:
52
56
  requirements:
53
57
  - - ">="
54
58
  - !ruby/object:Gem::Version
59
+ hash: 3
55
60
  segments:
56
61
  - 0
57
62
  version: "0"
58
63
  type: :development
59
64
  version_requirements: *id003
60
65
  description: Library to send GELF messages to Graylog2 logging server. Supports plain-text, GELF messages and exceptions.
61
- email: aleksey.palazhchenko@gmail.com
66
+ email: alexey.palazhchenko@gmail.com
62
67
  executables: []
63
68
 
64
69
  extensions: []
@@ -67,7 +72,6 @@ extra_rdoc_files:
67
72
  - LICENSE
68
73
  - README.rdoc
69
74
  files:
70
- - .gitignore
71
75
  - CHANGELOG
72
76
  - LICENSE
73
77
  - README.rdoc
@@ -76,25 +80,21 @@ files:
76
80
  - benchmarks/notifier.rb
77
81
  - gelf.gemspec
78
82
  - lib/gelf.rb
79
- - lib/gelf/deprecations.rb
80
- - lib/gelf/em_sender.rb
81
83
  - lib/gelf/logger.rb
82
84
  - lib/gelf/notifier.rb
83
85
  - lib/gelf/ruby_sender.rb
84
86
  - lib/gelf/severity.rb
85
87
  - test/helper.rb
86
- - test/test_deprecations.rb
87
88
  - test/test_logger.rb
88
89
  - test/test_notifier.rb
89
90
  - test/test_ruby_sender.rb
90
91
  - test/test_severity.rb
91
- has_rdoc: true
92
92
  homepage: http://github.com/Graylog2/gelf-rb
93
93
  licenses: []
94
94
 
95
95
  post_install_message:
96
- rdoc_options:
97
- - --charset=UTF-8
96
+ rdoc_options: []
97
+
98
98
  require_paths:
99
99
  - lib
100
100
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -102,28 +102,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
+ hash: 3
105
106
  segments:
106
107
  - 0
107
108
  version: "0"
108
109
  required_rubygems_version: !ruby/object:Gem::Requirement
109
110
  none: false
110
111
  requirements:
111
- - - ">="
112
+ - - ">"
112
113
  - !ruby/object:Gem::Version
114
+ hash: 25
113
115
  segments:
114
- - 0
115
- version: "0"
116
+ - 1
117
+ - 3
118
+ - 1
119
+ version: 1.3.1
116
120
  requirements: []
117
121
 
118
122
  rubyforge_project:
119
- rubygems_version: 1.3.7
123
+ rubygems_version: 1.8.3
120
124
  signing_key:
121
125
  specification_version: 3
122
126
  summary: Library to send GELF messages to Graylog2 logging server.
123
- test_files:
124
- - test/helper.rb
125
- - test/test_logger.rb
126
- - test/test_notifier.rb
127
- - test/test_severity.rb
128
- - test/test_ruby_sender.rb
129
- - test/test_deprecations.rb
127
+ test_files: []
128
+
data/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- pkg/
2
- coverage/
3
- rdoc/
4
- tmp/
5
-
6
- .DS_Store
@@ -1,37 +0,0 @@
1
- # Deprecated, do not use in new code, to be removed.
2
- class Gelf
3
- def deprecate(instead)
4
- Kernel.caller.first =~ /:in `(.+)'$/
5
- warn "Gelf##{$1} is deprecated. Use #{instead} instead."
6
- end
7
-
8
- attr_reader :notifier, :message
9
-
10
- def initialize(hostname, port)
11
- deprecate('GELF::Notifier.new(hostname, port)')
12
- @notifier = GELF::Notifier.new(hostname, port)
13
- @message = {}
14
- end
15
-
16
- # bizarre, but Gelf did this...
17
- def send
18
- deprecate('GELF::Notifier#notify(message)')
19
- @notifier.notify(@message)
20
- end
21
-
22
- [:short_message, :full_message, :level, :host, :line, :file].each do |attribute|
23
- define_method attribute do
24
- deprecate("GELF::Message##{attribute}")
25
- @message[attribute]
26
- end
27
-
28
- define_method "#{attribute}=" do |value|
29
- deprecate("GELF::Message##{attribute} = value")
30
- @message[attribute] = value
31
- end
32
- end
33
-
34
- def add_additional(key, value)
35
- @message[key] = value
36
- end
37
- end
@@ -1,19 +0,0 @@
1
- # module GELF
2
- # # TCP Sender for EventMachine.
3
- # class EMTcpSender
4
- # def initialize(host, port)
5
- # end
6
- #
7
- # def send_datagrams(datagrams)
8
- # end
9
- # end
10
- #
11
- # # UDP Sender for EventMachine.
12
- # class EMUdpSender
13
- # def initialize(host, port)
14
- # end
15
- #
16
- # def send_datagrams(datagrams)
17
- # end
18
- # end
19
- # end
@@ -1,38 +0,0 @@
1
- require 'helper'
2
-
3
- class TestDeprecations < Test::Unit::TestCase
4
- context "with Gelf object" do
5
- setup do
6
- @verbose, $VERBOSE = $VERBOSE, nil
7
- @g = Gelf.new('host', 12345)
8
- end
9
-
10
- teardown do
11
- $VERBOSE = @verbose
12
- end
13
-
14
- should "deprecate Gelf.new" do
15
- assert_equal Gelf, @g.class
16
- assert_equal 'host', @g.notifier.host
17
- assert_equal 12345, @g.notifier.port
18
- assert_equal Hash, @g.message.class
19
- end
20
-
21
- should "deprecate Gelf#send" do
22
- @g.notifier.expects(:notify).with(@g.message)
23
- @g.send
24
- end
25
-
26
- [:short_message, :full_message, :level, :host, :line, :file].each do |a|
27
- should "deprecate Gelf##{a} and Gelf##{a}=" do
28
- @g.__send__("#{a}=", 'value')
29
- assert_equal 'value', @g.__send__(a)
30
- end
31
- end
32
-
33
- should "set add additional params" do
34
- @g.add_additional(:key, 'value')
35
- assert_equal 'value', @g.message[:key]
36
- end
37
- end
38
- end