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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +60 -0
- data/lib/semlog.rb +8 -0
- data/lib/semlog/gelflog_appender.rb +68 -0
- data/lib/semlog/rabbit_notifier.rb +78 -0
- data/lib/semlog/severity.rb +37 -0
- data/lib/semlog/version.rb +3 -0
- data/semlog.gemspec +35 -0
- data/spec/semlog_spec.rb +11 -0
- data/spec/spec_helper.rb +2 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -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
data/README.md
ADDED
@@ -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
|
+
|
data/lib/semlog.rb
ADDED
@@ -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
|
data/semlog.gemspec
ADDED
@@ -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
|
data/spec/semlog_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
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
|