gelf 0.9.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.
Files changed (5) hide show
  1. data/Manifest +3 -0
  2. data/Rakefile +10 -0
  3. data/gelf.gemspec +30 -0
  4. data/lib/gelf.rb +83 -0
  5. metadata +74 -0
@@ -0,0 +1,3 @@
1
+ Rakefile
2
+ lib/gelf.rb
3
+ Manifest
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('gelf', '0.9.1') do |p|
6
+ p.description = "Library to send Graylog2 Extended Log Format (GELF) messages"
7
+ p.url = "http://www.graylog2.org/"
8
+ p.author = "Lennart Koopmann"
9
+ p.email = "lennart@socketfeed.com"
10
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{gelf}
5
+ s.version = "0.9.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Lennart Koopmann"]
9
+ s.date = %q{2010-10-08}
10
+ s.description = %q{Library to send Graylog2 Extended Log Format (GELF) messages}
11
+ s.email = %q{lennart@socketfeed.com}
12
+ s.extra_rdoc_files = ["lib/gelf.rb"]
13
+ s.files = ["Rakefile", "lib/gelf.rb", "Manifest", "gelf.gemspec"]
14
+ s.homepage = %q{http://www.graylog2.org/}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Gelf"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{gelf}
18
+ s.rubygems_version = %q{1.3.7}
19
+ s.summary = %q{Library to send Graylog2 Extended Log Format (GELF) messages}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ else
27
+ end
28
+ else
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+ require 'socket'
4
+ require 'zlib'
5
+ require 'digest/sha2'
6
+
7
+ class Gelf
8
+
9
+ MAX_CHUNK_SIZE = 8154
10
+
11
+ attr_accessor :short_message, :full_message, :level, :host, :type, :line, :file
12
+
13
+ def initialize hostname, port
14
+ @hostname = hostname
15
+ @port = port
16
+ end
17
+
18
+ def send
19
+ # Check if all required parameters are set.
20
+ if self.short_message == nil or self.host == nil
21
+ raise "Missing required information. Attributes short_message and host must be set."
22
+ end
23
+
24
+ data = {
25
+ "short_message" => self.short_message,
26
+ "full_message" => self.full_message,
27
+ "level" => self.level,
28
+ "host" => self.host,
29
+ "type" => self.type,
30
+ "line" => self.line,
31
+ "file" => self.file
32
+ }
33
+
34
+ # Convert to JSON and deflate (ZLIB)
35
+ data = Zlib::Deflate.deflate(data.to_json)
36
+
37
+ # Create a socket to send the data.
38
+ sock = UDPSocket.open
39
+
40
+ # Maximum total size is 8192 byte for UDP datagram. Split to chunks if bigger. (GELFv2 supports chunking)
41
+ if data.length > MAX_CHUNK_SIZE
42
+ # Too big for one datagram. Send in chunks.
43
+
44
+ # Build a message ID.
45
+ msg_id = Time.now.to_f.to_s + rand(10000).to_s
46
+
47
+ # Split data to chunks
48
+ data_chunks = Array.new
49
+ data.chars.each_slice(MAX_CHUNK_SIZE){|slice| data_chunks << slice.join}
50
+
51
+ # Send every chunk
52
+ i = 0
53
+ data_chunks.each do |chunk|
54
+ sock.send prepend_chunk_data(chunk, msg_id, i, data_chunks.size), 0, @hostname, @port
55
+ i += 1
56
+ end
57
+ else
58
+ # Data fits in datagram without chunking. Send!
59
+ sock.send data, 0, @hostname, @port
60
+ end
61
+ end
62
+
63
+ def prepend_chunk_data data, msg_id, sequence_number, sequence_count
64
+ raise "Data must be a string and not be empty." if data == nil or data.length == 0
65
+ raise "Message ID must be a string and not be empty." if msg_id == nil or msg_id.length == 0
66
+ raise "Sequence count must be bigger than 0." if sequence_count <= 0
67
+ raise "Sequence number must not be higher than sequence count." if sequence_number > sequence_count
68
+
69
+ # Get raw binary (packed) GELF ID
70
+ gelf_id_bin = [ 30, 15 ].pack('CC')
71
+
72
+ # Get raw binary SHA256 hash of message ID
73
+ digest = Digest::SHA256.new << msg_id
74
+ msg_id_bin = digest.digest
75
+
76
+ # Get raw binary (packed) sequence count and number
77
+ sequence_nums_bin = [ sequence_number, sequence_count ].pack('nn');
78
+
79
+ # Combine and prepend to message chunk
80
+ return gelf_id_bin + msg_id_bin + sequence_nums_bin + data
81
+ end
82
+
83
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gelf
3
+ version: !ruby/object:Gem::Version
4
+ hash: 57
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 1
10
+ version: 0.9.1
11
+ platform: ruby
12
+ authors:
13
+ - Lennart Koopmann
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-08 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Library to send Graylog2 Extended Log Format (GELF) messages
23
+ email: lennart@socketfeed.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - lib/gelf.rb
30
+ files:
31
+ - Rakefile
32
+ - lib/gelf.rb
33
+ - Manifest
34
+ - gelf.gemspec
35
+ has_rdoc: true
36
+ homepage: http://www.graylog2.org/
37
+ licenses: []
38
+
39
+ post_install_message:
40
+ rdoc_options:
41
+ - --line-numbers
42
+ - --inline-source
43
+ - --title
44
+ - Gelf
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 11
62
+ segments:
63
+ - 1
64
+ - 2
65
+ version: "1.2"
66
+ requirements: []
67
+
68
+ rubyforge_project: gelf
69
+ rubygems_version: 1.3.7
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Library to send Graylog2 Extended Log Format (GELF) messages
73
+ test_files: []
74
+