semlog 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 964258648040269ffcdb9c07a46d970dfbb415d0
4
+ data.tar.gz: cca947657b3e5609c503ccf0abc90d52bd4333af
5
+ SHA512:
6
+ metadata.gz: 424a1df5df3e47c9217fe214523f9dbd3bc7518735eaed5907e843a5cff4c82b5861a59b8f115a941ce7e3fa1f4cb59f0852518f0031ba1e7aabc91902ee9215
7
+ data.tar.gz: 31520146ce5e1f8584410696d73720baf3b81c153db78632cba21ff596d56ae5ac61fe5f6676b4303edf099a413e2d585b501ef63928eb0c1967f135730f17cc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in semlog.gemspec
4
+ gemspec
@@ -0,0 +1,60 @@
1
+ # Semlog
2
+
3
+ Gelf log appender directly to rabbitmq
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'semlog'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install semlog
20
+
21
+ ## Usage
22
+
23
+ Suggested initializer
24
+ ```ruby
25
+ $logger = SemanticLogger['semlog']
26
+ $logger.level = Logger.const_get(ENV.fetch("LOG_LEVEL", "INFO"))
27
+ SemanticLogger.add_appender(file_name: file_name, formatter: :color)
28
+ SemanticLogger.add_appender(io: $stderr, level: :debug)
29
+
30
+
31
+ gelf_appender = Semlog::SemanticLogger::Appender::GelflogAppender.new(
32
+ host: ENV['RABBIT_HOST'],
33
+ port: ENV['RABBIT_PORT'],
34
+ vhost:ENV['RABBIT_VIRTUAL_HOST'],
35
+ exchange: ENV['RABBIT_EXCHANGE'],
36
+ user: ENV['RABBIT_USER'],
37
+ pw: ENV['RABBIT_PW'],
38
+ application: 'semlog'
39
+ )
40
+
41
+ gelf_appender.name = 'Semlog'
42
+
43
+
44
+ SemanticLogger.add_appender(gelf_appender)
45
+
46
+ $logger.info "Logging initiated to #{$logger.level } level"
47
+
48
+ ```
49
+
50
+
51
+ ## Development
52
+
53
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
54
+
55
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
56
+
57
+ ## Contributing
58
+
59
+ Bug reports and pull requests are welcome on GitHub at https://github.com/leffen/semlog.
60
+
@@ -0,0 +1,8 @@
1
+ require "semlog/version"
2
+ require "semlog/severity"
3
+ require "semlog/rabbit_notifier"
4
+ require "semlog/gelflog_appender"
5
+
6
+ module Semlog
7
+ # Your code goes here...
8
+ end
@@ -0,0 +1,68 @@
1
+ require "semantic_logger"
2
+
3
+ module Semlog
4
+
5
+ class GelflogAppender < SemanticLogger::Subscriber
6
+
7
+ # Map Semantic Logger levels to Graylog levels
8
+ LEVEL_MAP = {
9
+ fatal: Semlog::FATAL,
10
+ error: Semlog::ERROR,
11
+ warn: Semlog::WARN,
12
+ info: Semlog::INFO,
13
+ debug: Semlog::DEBUG,
14
+ trace: Semlog::DEBUG
15
+ }
16
+
17
+ attr_reader :notifier
18
+
19
+ def initialize(options = {}, &block)
20
+ options = options.dup
21
+
22
+ @rabbit_host=options.delete(:host)|| 'localhost'
23
+ @port=options.delete(:port)|| 5672
24
+ @vhost=options.delete(:vhost)||''
25
+ @exchange=options.delete(:exchange)|| ''
26
+ @user=options.delete(:user)||''
27
+ @pw=options.delete(:pw)||''
28
+ @app_name = options.delete(:application) || 'Semlog'
29
+
30
+ super(options, &block)
31
+ self.application = @app_name
32
+
33
+ reopen
34
+ end
35
+
36
+ def reopen
37
+ @notifier = RabbitNotifier.new(host: @rabbit_host, port: @port, vhost: @vhost, exchange_name: @exchange, user: @user, pw: @pw)
38
+ end
39
+
40
+ def make_hash(log)
41
+ h = log.to_h(host, application)
42
+ h[:level] = map_level(log)
43
+ h[:level_str] = log.level.to_s
44
+ h[:short_message] = h.delete(:message) if log.message && !h.key?("short_message") && !h.key?(:short_message)
45
+ h[:request_uid] = h.delete(:tags).first if log.tags && log.tags.count > 0
46
+ h
47
+ end
48
+
49
+ # Forward log messages
50
+ def log(log)
51
+ return false unless should_log?(log)
52
+
53
+ begin
54
+ @notifier.notify!(make_hash(log))
55
+ rescue => e
56
+ $logger.error "Semlog::Appender::GelflogAppender >EXCEPTION> #{e}"
57
+ end
58
+
59
+ true
60
+ end
61
+
62
+ # Returns the Graylog level for the supplied log message
63
+ def map_level(log)
64
+ LEVEL_MAP[log.level]
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,78 @@
1
+ require 'bunny'
2
+ require 'oj'
3
+ require 'awesome_print'
4
+
5
+ Oj.default_options = {:mode => :compat}
6
+
7
+ module Semlog
8
+
9
+
10
+ class RabbitNotifier
11
+
12
+ attr_accessor :connection, :host, :port, :vhost, :exhange_name, :user, :pw, :default_options
13
+
14
+ def initialize host:, port:, vhost:, exchange_name:, user:, pw:
15
+ @connection = nil
16
+ @host = host
17
+ @port = port
18
+ @vhost = vhost
19
+ @exhange_name = exchange_name
20
+ @user = user
21
+ @pw = pw
22
+
23
+ $logger.debug "RabbitNotifier>host: #{@host} port #{@port} vhost #{@vhost} "
24
+
25
+ @default_options = {}
26
+ @default_options['version'] = "1.1"
27
+ @default_options['host'] ||= Socket.gethostname
28
+ @default_options['level'] ||= Semlog::UNKNOWN
29
+ @default_options['facility'] ||= 'RabbitNotifier'
30
+
31
+ end
32
+
33
+ def connect
34
+ unless @connection
35
+ @connection = Bunny.new(:host => @host, :vhost => @vhost, :user => @user, :password => @pw)
36
+ @connection.start
37
+ end
38
+ @connection
39
+ end
40
+
41
+ def gelfify(data)
42
+ gdata = @default_options.dup
43
+ data.keys.each do |key|
44
+ value, key_s = data[key], key.to_s
45
+ if ['host', 'level', 'version', 'short_message', 'full_message', 'timestamp', 'facility', 'line', 'file'].index(key_s)
46
+ gdata[key_s] = value
47
+ elsif key_s == 'action'
48
+ gdata["_application_action"] = value
49
+ elsif key_s == 'id'
50
+ gdata["_application_id"] = value
51
+ elsif key_s[0] != '_'
52
+ gdata["_#{key_s}"] = value
53
+ else
54
+ gdata[key_s] = value
55
+ end
56
+ end
57
+ gdata
58
+ end
59
+
60
+ def data_to_json(data)
61
+ Oj.dump(gelfify(data))
62
+ end
63
+
64
+ def notify!(data)
65
+ exchange.publish(data_to_json(data))
66
+ end
67
+
68
+ def channel
69
+ connect
70
+ @channel ||= @connection.create_channel
71
+ end
72
+
73
+ def exchange
74
+ @exchange ||= channel.fanout(exhange_name, durable: true)
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,37 @@
1
+ module Semlog
2
+ # There are two things you should know about log levels/severity:
3
+ # - syslog defines levels from 0 (Emergency) to 7 (Debug).
4
+ # 0 (Emergency) and 1 (Alert) levels are reserved for OS kernel.
5
+ # - Ruby default Logger defines levels from 0 (DEBUG) to 4 (FATAL) and 5 (UNKNOWN).
6
+ # Note that order is inverted.
7
+ # For compatibility we define our constants as Ruby Logger, and convert values before
8
+ # generating GELF message, using defined mapping.
9
+
10
+ module Levels
11
+ DEBUG = 0
12
+ INFO = 1
13
+ WARN = 2
14
+ ERROR = 3
15
+ FATAL = 4
16
+ UNKNOWN = 5
17
+ end
18
+
19
+ include Levels
20
+
21
+ # Maps Ruby Logger levels to syslog levels as SyslogLogger and syslogger gems. This one is default.
22
+ LOGGER_MAPPING = {DEBUG => 7, # Debug
23
+ INFO => 6, # Info
24
+ WARN => 5, # Notice
25
+ ERROR => 4, # Warning
26
+ FATAL => 3, # Error
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
37
+ end
@@ -0,0 +1,3 @@
1
+ module Semlog
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'semlog/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "semlog"
8
+ spec.version = Semlog::VERSION
9
+ spec.authors = ["leffen"]
10
+ spec.email = ["leffen@gmail.com"]
11
+ spec.license = 'MIT'
12
+
13
+ spec.summary = %q{Plugin log module to semantic logger}
14
+ spec.description = %q{Provides direct to Rabbitmq logging from semantic logger}
15
+ spec.homepage = "https://github.com/leffen/semlog"
16
+
17
+ spec.files = Dir['lib/**/*.rb'] + %w(Gemfile semlog.gemspec README.md)
18
+ spec.test_files = Dir['spec/**/*.rb']
19
+
20
+ spec.require_paths = ["lib"]
21
+
22
+ if spec.respond_to?(:metadata)
23
+ # spec.metadata['allowed_push_host'] = "http://pagems:SuperSikkertLangtPassord!2020_@gems.asd09.com"
24
+ else
25
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
26
+ end
27
+
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.12"
33
+ spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "rspec", "~> 3.0"
35
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Semlog do
4
+ it 'has a version number' do
5
+ expect(Semlog::VERSION).not_to be nil
6
+ end
7
+
8
+ it 'does something useful' do
9
+ expect(false).to eq(true)
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'semlog'
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: semlog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - leffen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-09-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description: Provides direct to Rabbitmq logging from semantic logger
56
+ email:
57
+ - leffen@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - README.md
64
+ - lib/semlog.rb
65
+ - lib/semlog/gelflog_appender.rb
66
+ - lib/semlog/rabbit_notifier.rb
67
+ - lib/semlog/severity.rb
68
+ - lib/semlog/version.rb
69
+ - semlog.gemspec
70
+ - spec/semlog_spec.rb
71
+ - spec/spec_helper.rb
72
+ homepage: https://github.com/leffen/semlog
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.6.6
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Plugin log module to semantic logger
96
+ test_files:
97
+ - spec/semlog_spec.rb
98
+ - spec/spec_helper.rb