semlogr 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de0c524223dc5ae215d6ea1792a8431fe372622a
4
- data.tar.gz: 35b4860c12da0efe181e71cc000b9f25148774b6
3
+ metadata.gz: bd4e69c32518a7128075aabc31c8ec3384dd4c8b
4
+ data.tar.gz: 1e264cb0025475bf2774b05d5484756f99585131
5
5
  SHA512:
6
- metadata.gz: 2337de225c49f303b6edecfee4c765cd7b7524024b191ef2405278afff508246c2d6bd768bff09a84164c0aca0de578f591fb1aa077b84798a915c2d63735423
7
- data.tar.gz: 97620d9df3c5755143e2089556181cd8e23a0ad1795ad66042f5df7cb664886a1ae7d6d55bb3cf360585e8f1a5115a421c6ab83b718a841e18140a84e80e981c
6
+ metadata.gz: e556941e43501f47c519d55eeed10f99317d7ec7ec804e9c537da9d82185a881ca4a0f8309f4856af63639eab3314f6606e142d4d4aeaf5155c1ed8b702a9090
7
+ data.tar.gz: 465b051b985524bd0d1c2012df6e0a52c982c0f93fd5c2d0e76cad325f0603ec372912ab8b0940ca552dc34efbec9662b6c1427c712e104731f221afea0b0d8f
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --format documentation
2
+ --require spec_helper
2
3
  --color
data/.rubocop.yml CHANGED
@@ -3,19 +3,34 @@ AllCops:
3
3
 
4
4
  Documentation:
5
5
  Enabled: false
6
+ OrderedGems:
7
+ Enabled: false
8
+
9
+ Layout/MultilineMethodCallIndentation:
10
+ EnforcedStyle: indented
6
11
 
12
+ # Do not use Rubocop to enforce complexity rules, these will me
13
+ # managed via the PR prorcess to not let in clearly complex code.
14
+ Metrics/ClassLength:
15
+ Enabled: false
16
+ Metrics/ModuleLength:
17
+ Enabled: false
18
+ Metrics/MethodLength:
19
+ Enabled: false
20
+ Metrics/BlockNesting:
21
+ Enabled: false
7
22
  Metrics/AbcSize:
8
- Max: 24
9
- Metrics/BlockLength:
10
- ExcludedMethods: ['describe']
23
+ Enabled: false
11
24
  Metrics/CyclomaticComplexity:
12
- Max: 8
25
+ Enabled: false
26
+ Metrics/ParameterLists:
27
+ Enabled: false
28
+ Metrics/BlockLength:
29
+ Enabled: false
30
+ Metrics/PerceivedComplexity:
31
+ Enabled: false
13
32
  Metrics/LineLength:
14
- Max: 120
15
- Metrics/MethodLength:
16
- Max: 20
33
+ Enabled: false
17
34
 
18
35
  Style/EmptyMethod:
19
36
  EnforcedStyle: expanded
20
- Style/MultilineMethodCallIndentation:
21
- EnforcedStyle: indented
data/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ ### 0.2.0
4
+
5
+ * Introduce simpler logger configuration
6
+ * Add ambient log property context
7
+ * Add samples
8
+ * Specs specs specs!
9
+ * Fix coloring of exceptions with colored console sink
10
+
11
+ ### 0.1.3
12
+
13
+ * Move to Oj for json serialization of log events
14
+
15
+ ### 0.1.2
16
+
17
+ * Do not format backtrace as newline seperated string in json formatter
18
+ * Change from configure to create_logger and don't implicitly set Semlogr.logger
19
+ * Add null logger
20
+
21
+ ### 0.1.1
22
+
23
+ * Various fixes
24
+
25
+ ### 0.1.0
26
+
27
+ * Initial release
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Semlogr
4
4
 
5
- Semlogr is a semantic logger for Ruby inspired by the amazing semantic logger for .NET [Serilog](http://serilog.net/).
5
+ Semlogr is a semantic logger for Ruby inspired and primarily ported from the awesome semantic logger for .NET [Serilog](http://serilog.net/).
6
6
 
7
7
  ## Installation
8
8
 
@@ -20,31 +20,26 @@ then:
20
20
 
21
21
  ## Getting Started
22
22
 
23
- Create an instance of the logger configuring one or more sinks.
23
+ Create an instance of the logger configuring one or more sinks.
24
24
 
25
25
  ```ruby
26
26
  require "semlogr"
27
- require "semlogr/sinks/colored_console"
28
27
 
29
- logger = Semlogr::Logger.create do |c|
30
- c.log_at(Semlogr::LogSeverity::INFO)
28
+ Semlogr.logger = Semlogr.create_logger do |c|
29
+ c.log_at :info
31
30
 
32
- c.write_to(Semlogr::Sinks::ColoredConsole.new)
31
+ c.write_to :colored_console
33
32
  end
34
33
 
35
- logger.info('Customer {customer_id} did something interesting', customer_id: 1234)
34
+ Semlogr.info('Customer {customer_id} did something interesting', customer_id: 1234)
36
35
  ```
37
36
 
37
+ More configuration examples can be found inside the samples directory.
38
+
38
39
  ## Development
39
40
 
40
41
  After cloning the repository run `bundle install` to get up and running, to run the specs just run `rake spec`. You can also experiment in an interactive pry console using `bin/console`.
41
42
 
42
- ## Changes
43
-
44
- ### 0.1.0
45
-
46
- - Initial commit, long long way to go :)!
47
-
48
43
  ## Contributing
49
44
 
50
45
  See anything broken or something you would like to improve? feel free to submit an issue or better yet a pull request!
data/Rakefile CHANGED
@@ -2,7 +2,17 @@ require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
  require 'rubocop/rake_task'
4
4
 
5
- RSpec::Core::RakeTask.new(:spec)
6
5
  RuboCop::RakeTask.new(:rubocop)
7
6
 
8
- task default: [:spec, :rubocop]
7
+ RSpec::Core::RakeTask.new('test:unit') do |c|
8
+ c.rspec_opts = '--fail-fast --pattern spec/unit/**{,/*/**}/*_spec.rb'
9
+ end
10
+
11
+ task 'test:performance' do
12
+ Dir['spec/performance/**/*.rb'].each do |file|
13
+ require_relative file
14
+ end
15
+ end
16
+
17
+ task test: %w[test:unit test:performance]
18
+ task default: %w[rubocop test]
@@ -0,0 +1,18 @@
1
+ require 'semlogr/error'
2
+
3
+ module Semlogr
4
+ class ComponentRegistry
5
+ @mappings = {}
6
+
7
+ def self.register(type, mapping)
8
+ (@mappings[type] ||= {}).update(mapping)
9
+ end
10
+
11
+ def self.resolve(type, key, *params)
12
+ mapping = @mappings[type] && @mappings[type][key]
13
+ raise ComponentNotRegisteredError.new(type, key) unless mapping
14
+
15
+ mapping.new(*params)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ module Semlogr
2
+ module Context
3
+ class LogContext
4
+ def self.current
5
+ Thread.current[:semlogr_log_context] ||= []
6
+ end
7
+
8
+ def self.push_property(**properties)
9
+ LogContext.current << properties
10
+
11
+ yield if block_given?
12
+ ensure
13
+ LogContext.current.pop
14
+ end
15
+
16
+ def self.get_property(key)
17
+ LogContext.current
18
+ .reverse_each
19
+ .each do |properties|
20
+ return properties[key] if properties.key?(key)
21
+ end
22
+
23
+ nil
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module Semlogr
2
+ module Enrichers
3
+ class Aggregate
4
+ def initialize(enrichers)
5
+ @enrichers = enrichers
6
+ end
7
+
8
+ def enrich(log_event)
9
+ @enrichers.each do |enricher|
10
+ enricher.enrich(log_event)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,11 +1,14 @@
1
1
  require 'socket'
2
+ require 'semlogr/component_registry'
2
3
 
3
4
  module Semlogr
4
5
  module Enrichers
5
6
  class Host
6
7
  def enrich(log_event)
7
- log_event.add_property(host: Socket.gethostname)
8
+ log_event.add_property_if_absent(host: Socket.gethostname)
8
9
  end
9
10
  end
11
+
12
+ ComponentRegistry.register(:enricher, host: Host)
10
13
  end
11
14
  end
@@ -0,0 +1,16 @@
1
+ require 'semlogr/context/log_context'
2
+
3
+ module Semlogr
4
+ module Enrichers
5
+ class LogContext
6
+ def enrich(log_event)
7
+ Context::LogContext.current
8
+ .each do |properties|
9
+ log_event.add_property_if_absent(properties)
10
+ end
11
+ end
12
+ end
13
+
14
+ ComponentRegistry.register(:enricher, log_context: LogContext)
15
+ end
16
+ end
@@ -1,3 +1,5 @@
1
+ require 'semlogr/component_registry'
2
+
1
3
  module Semlogr
2
4
  module Enrichers
3
5
  class Property
@@ -6,8 +8,10 @@ module Semlogr
6
8
  end
7
9
 
8
10
  def enrich(log_event)
9
- log_event.add_property(@properties)
11
+ log_event.add_property_if_absent(@properties)
10
12
  end
11
13
  end
14
+
15
+ ComponentRegistry.register(:enricher, property: Property)
12
16
  end
13
17
  end
@@ -1,9 +1,13 @@
1
+ require 'semlogr/component_registry'
2
+
1
3
  module Semlogr
2
4
  module Enrichers
3
5
  class Thread
4
6
  def enrich(log_event)
5
- log_event.add_property(thread_id: ::Thread.current.object_id)
7
+ log_event.add_property_if_absent(thread_id: ::Thread.current.object_id)
6
8
  end
7
9
  end
10
+
11
+ ComponentRegistry.register(:enricher, thread: Thread)
8
12
  end
9
13
  end
@@ -0,0 +1,10 @@
1
+ module Semlogr
2
+ class Error < StandardError
3
+ end
4
+
5
+ class ComponentNotRegisteredError < Error
6
+ def initialize(type, key)
7
+ super(":#{key} is not a registered :#{type}")
8
+ end
9
+ end
10
+ end
@@ -1,3 +1,5 @@
1
+ require 'semlogr/templates/parser'
2
+
1
3
  module Semlogr
2
4
  module Events
3
5
  class LogEvent
@@ -7,7 +9,7 @@ module Semlogr
7
9
  attr_reader :properties
8
10
  attr_reader :timestamp
9
11
 
10
- def initialize(severity, template, error, properties)
12
+ def initialize(severity, template, error: nil, **properties)
11
13
  @timestamp = Time.now.utc
12
14
  @severity = severity
13
15
  @template = template
@@ -15,6 +17,12 @@ module Semlogr
15
17
  @properties = properties
16
18
  end
17
19
 
20
+ def self.create(severity, template, properties)
21
+ template = Templates::Parser.parse(template)
22
+
23
+ LogEvent.new(severity, template, properties)
24
+ end
25
+
18
26
  def get_property(name)
19
27
  @properties[name]
20
28
  end
@@ -23,6 +31,10 @@ module Semlogr
23
31
  @properties.merge!(properties)
24
32
  end
25
33
 
34
+ def add_property_if_absent(properties)
35
+ @properties.merge!(properties) { |_, old, _| old }
36
+ end
37
+
26
38
  def render(output)
27
39
  @template.render(output, @properties)
28
40
  end
@@ -9,6 +9,23 @@ module Semlogr
9
9
  @display_string = display_string
10
10
  end
11
11
 
12
+ def self.create(severity)
13
+ case severity
14
+ when :debug
15
+ LogSeverity::DEBUG
16
+ when :info
17
+ LogSeverity::INFO
18
+ when :warn
19
+ LogSeverity::WARN
20
+ when :error
21
+ LogSeverity::ERROR
22
+ when :fatal
23
+ LogSeverity::FATAL
24
+ else
25
+ LogSeverity::DEBUG
26
+ end
27
+ end
28
+
12
29
  def <=>(other)
13
30
  @value <=> other.value
14
31
  end
@@ -21,10 +38,10 @@ module Semlogr
21
38
  @display_string
22
39
  end
23
40
 
24
- DEBUG = LogSeverity.new(::Logger::DEBUG, 'DEBUG')
25
- INFO = LogSeverity.new(::Logger::INFO, 'INFO')
26
- WARN = LogSeverity.new(::Logger::WARN, 'WARN')
27
- ERROR = LogSeverity.new(::Logger::ERROR, 'ERROR')
28
- FATAL = LogSeverity.new(::Logger::FATAL, 'FATAL')
41
+ DEBUG = LogSeverity.new(0, 'DEBUG')
42
+ INFO = LogSeverity.new(1, 'INFO')
43
+ WARN = LogSeverity.new(2, 'WARN')
44
+ ERROR = LogSeverity.new(3, 'ERROR')
45
+ FATAL = LogSeverity.new(4, 'FATAL')
29
46
  end
30
47
  end
@@ -1,17 +1,15 @@
1
- require 'logger'
2
1
  require 'semlogr/logger_configuration'
3
2
  require 'semlogr/log_severity'
4
3
  require 'semlogr/events/log_event'
5
- require 'semlogr/templates/parser'
6
4
  require 'semlogr/enrichers/property'
5
+ require 'semlogr/enrichers/aggregate'
7
6
 
8
7
  module Semlogr
9
8
  class Logger
10
- def initialize(min_severity, enrichers, filters, sinks)
9
+ def initialize(min_severity, enricher, sink)
11
10
  @min_severity = min_severity
12
- @filters = filters
13
- @enrichers = enrichers
14
- @sinks = sinks
11
+ @enricher = enricher
12
+ @sink = sink
15
13
  end
16
14
 
17
15
  def self.create
@@ -41,39 +39,40 @@ module Semlogr
41
39
  @min_severity <= LogSeverity::FATAL
42
40
  end
43
41
 
44
- def debug(template = nil, error: nil, **properties, &block)
45
- log(LogSeverity::DEBUG, template, error, properties, &block)
42
+ def debug(template = nil, **properties, &block)
43
+ log(LogSeverity::DEBUG, template, properties, &block)
46
44
  end
47
45
 
48
- def info(template = nil, error: nil, **properties, &block)
49
- log(LogSeverity::INFO, template, error, properties, &block)
46
+ def info(template = nil, **properties, &block)
47
+ log(LogSeverity::INFO, template, properties, &block)
50
48
  end
51
49
 
52
- def warn(template = nil, error: nil, **properties, &block)
53
- log(LogSeverity::WARN, template, error, properties, &block)
50
+ def warn(template = nil, **properties, &block)
51
+ log(LogSeverity::WARN, template, properties, &block)
54
52
  end
55
53
 
56
- def error(template = nil, error: nil, **properties, &block)
57
- log(LogSeverity::ERROR, template, error, properties, &block)
54
+ def error(template = nil, **properties, &block)
55
+ log(LogSeverity::ERROR, template, properties, &block)
58
56
  end
59
57
 
60
- def fatal(template = nil, error: nil, **properties, &block)
61
- log(LogSeverity::FATAL, template, error, properties, &block)
58
+ def fatal(template = nil, **properties, &block)
59
+ log(LogSeverity::FATAL, template, properties, &block)
62
60
  end
63
61
 
64
62
  def with_context(**properties)
63
+ property_enricher = Enrichers::Property.new(properties)
64
+ enricher = Enrichers::Aggregate.new([@enricher, property_enricher])
65
+
65
66
  Logger.new(
66
67
  @min_severity,
67
- @enrichers + [Enrichers::Property.new(properties)],
68
- @filters,
69
- @sinks
68
+ enricher,
69
+ @sink
70
70
  )
71
71
  end
72
72
 
73
73
  private
74
74
 
75
- def log(severity, template, error, properties, &block)
76
- return true if @sinks.size.zero?
75
+ def log(severity, template, properties, &block)
77
76
  return true if severity < @min_severity
78
77
 
79
78
  if block
@@ -82,42 +81,13 @@ module Semlogr
82
81
 
83
82
  properties ||= {}
84
83
  properties[:progname] = progname if progname
85
- error = properties.delete(:error)
86
84
  end
87
85
 
88
- log_event = create_log_event(severity, template, error, properties)
89
- return false if filter?(log_event)
90
-
91
- enrich(log_event)
92
- emit(log_event)
86
+ log_event = Events::LogEvent.create(severity, template, properties)
87
+ @enricher.enrich(log_event)
88
+ @sink.emit(log_event)
93
89
 
94
90
  true
95
91
  end
96
-
97
- def create_log_event(severity, template, error, properties)
98
- template = Templates::Parser.parse(template)
99
-
100
- Events::LogEvent.new(severity, template, error, properties)
101
- end
102
-
103
- def filter?(log_event)
104
- @filters.each do |filter|
105
- return true if filter.call(log_event)
106
- end
107
-
108
- false
109
- end
110
-
111
- def enrich(log_event)
112
- @enrichers.each do |enricher|
113
- enricher.enrich(log_event)
114
- end
115
- end
116
-
117
- def emit(log_event)
118
- @sinks.each do |sink|
119
- sink.emit(log_event)
120
- end
121
- end
122
92
  end
123
93
  end
@@ -1,10 +1,10 @@
1
+ require 'semlogr/component_registry'
2
+ require 'semlogr/enrichers/aggregate'
3
+ require 'semlogr/sinks/aggregate'
4
+ require 'semlogr/sinks/filtering'
5
+
1
6
  module Semlogr
2
7
  class LoggerConfiguration
3
- attr_reader :min_severity
4
- attr_reader :enrichers
5
- attr_reader :filters
6
- attr_reader :sinks
7
-
8
8
  def initialize
9
9
  @min_severity = LogSeverity::DEBUG
10
10
  @enrichers = []
@@ -13,27 +13,32 @@ module Semlogr
13
13
  end
14
14
 
15
15
  def log_at(severity)
16
- @min_severity = severity
16
+ @min_severity = LogSeverity.create(severity)
17
17
  end
18
18
 
19
- def filter_when(filter)
19
+ def filter(filter)
20
20
  @filters << filter
21
21
  end
22
22
 
23
- def enrich_with(enricher)
23
+ def enrich_with(enricher, *params)
24
+ enricher = ComponentRegistry.resolve(:enricher, enricher, *params) if enricher.is_a?(Symbol)
24
25
  @enrichers << enricher
25
26
  end
26
27
 
27
- def write_to(sink)
28
+ def write_to(sink, *params)
29
+ sink = ComponentRegistry.resolve(:sink, sink, *params) if sink.is_a?(Symbol)
28
30
  @sinks << sink
29
31
  end
30
32
 
31
33
  def create_logger
34
+ enricher = Enrichers::Aggregate.new(@enrichers)
35
+ sink = Sinks::Aggregate.new(@sinks)
36
+ sink = Sinks::Filtering.new(@filters, sink) if @filters.any?
37
+
32
38
  Logger.new(
33
39
  @min_severity,
34
- @enrichers,
35
- @filters,
36
- @sinks
40
+ enricher,
41
+ sink
37
42
  )
38
43
  end
39
44
  end
@@ -8,7 +8,6 @@ module Semlogr
8
8
  )
9
9
 
10
10
  properties[:error] = log_event.error if log_event.error
11
-
12
11
  properties
13
12
  end
14
13
  end
@@ -0,0 +1,15 @@
1
+ module Semlogr
2
+ module Sinks
3
+ class Aggregate
4
+ def initialize(sinks)
5
+ @sinks = sinks
6
+ end
7
+
8
+ def emit(log_event)
9
+ @sinks.each do |sink|
10
+ sink.emit(log_event)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -48,14 +48,13 @@ module Semlogr
48
48
  when :message
49
49
  render_message(output, log_event)
50
50
  when :severity
51
- color = LOG_SEVERITY_COLORS[log_event.severity] || :white
52
- colorize(output, color) do
51
+ colorize(output, LOG_SEVERITY_COLORS[log_event.severity]) do
53
52
  token.render(output, output_properties)
54
53
  end
55
54
  when :error
56
55
  return unless output_properties[:error]
57
56
 
58
- colorize(output, :red) do
57
+ colorize(output, LOG_SEVERITY_COLORS[log_event.severity]) do
59
58
  token.render(output, output_properties)
60
59
  end
61
60
  else
@@ -79,10 +78,14 @@ module Semlogr
79
78
  end
80
79
 
81
80
  def colorize(output, color)
81
+ color = :white unless color
82
+
82
83
  output << "\e[#{COLOR_CODES[color]}m"
83
84
  yield
84
85
  output << "\e[0m"
85
86
  end
86
87
  end
88
+
89
+ ComponentRegistry.register(:sink, colored_console: ColoredConsole)
87
90
  end
88
91
  end
@@ -12,5 +12,7 @@ module Semlogr
12
12
  STDOUT.write(output)
13
13
  end
14
14
  end
15
+
16
+ ComponentRegistry.register(:sink, console: Console)
15
17
  end
16
18
  end
@@ -1,9 +1,10 @@
1
+ require 'logger'
1
2
  require 'semlogr/formatters/text_formatter'
2
3
 
3
4
  module Semlogr
4
5
  module Sinks
5
6
  class File
6
- def initialize(file, shift_age: nil, shift_size: nil, formatter: nil)
7
+ def initialize(file, shift_age: 0, shift_size: 1_048_576, formatter: nil)
7
8
  @logdev = ::Logger::LogDevice.new(file, shift_age: shift_age, shift_size: shift_size)
8
9
  @formatter = formatter || Formatters::TextFormatter.new
9
10
  end
@@ -13,5 +14,7 @@ module Semlogr
13
14
  @logdev.write(output)
14
15
  end
15
16
  end
17
+
18
+ ComponentRegistry.register(:sink, file: File)
16
19
  end
17
20
  end
@@ -0,0 +1,16 @@
1
+ module Semlogr
2
+ module Sinks
3
+ class Filtering
4
+ def initialize(filters, sink)
5
+ @filters = filters
6
+ @sink = sink
7
+ end
8
+
9
+ def emit(log_event)
10
+ filtered = @filters.any? { |filter| filter.call(log_event) }
11
+
12
+ @sink.emit(log_event) unless filtered
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Semlogr
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/semlogr.rb CHANGED
@@ -1,6 +1,22 @@
1
1
  require 'semlogr/version'
2
2
  require 'semlogr/logger'
3
3
  require 'semlogr/null_logger'
4
+ require 'semlogr/context/log_context'
5
+
6
+ # Built-in enrichers
7
+ require 'semlogr/enrichers/host'
8
+ require 'semlogr/enrichers/log_context'
9
+ require 'semlogr/enrichers/property'
10
+ require 'semlogr/enrichers/thread'
11
+
12
+ # Built-in sinks
13
+ require 'semlogr/sinks/console'
14
+ require 'semlogr/sinks/colored_console'
15
+ require 'semlogr/sinks/file'
16
+
17
+ # Built-in formatters
18
+ require 'semlogr/formatters/json_formatter'
19
+ require 'semlogr/formatters/text_formatter'
4
20
 
5
21
  module Semlogr
6
22
  @logger = nil
@@ -20,22 +36,26 @@ module Semlogr
20
36
  end
21
37
 
22
38
  def self.debug(template = nil, **properties, &block)
23
- logger.debug(template, **properties, &block)
39
+ logger.debug(template, properties, &block)
24
40
  end
25
41
 
26
42
  def self.info(template = nil, **properties, &block)
27
- logger.info(template, **properties, &block)
43
+ logger.info(template, properties, &block)
28
44
  end
29
45
 
30
46
  def self.warn(template = nil, **properties, &block)
31
- logger.warn(template, **properties, &block)
47
+ logger.warn(template, properties, &block)
32
48
  end
33
49
 
34
50
  def self.error(template = nil, **properties, &block)
35
- logger.error(template, **properties, &block)
51
+ logger.error(template, properties, &block)
36
52
  end
37
53
 
38
54
  def self.fatal(template = nil, **properties, &block)
39
- logger.fatal(template, **properties, &block)
55
+ logger.fatal(template, properties, &block)
56
+ end
57
+
58
+ def self.with_context(**properties)
59
+ logger.with_context(properties)
40
60
  end
41
61
  end
data/samples/basic.rb CHANGED
@@ -1,64 +1,9 @@
1
1
  require 'bundler/setup'
2
2
  require 'semlogr'
3
- require 'semlogr/sinks/console'
4
- require 'semlogr/sinks/colored_console'
5
- require 'semlogr/sinks/file'
6
- require 'semlogr/formatters/json_formatter'
7
- require 'semlogr/enrichers/thread'
8
- require 'semlogr/enrichers/host'
9
- require 'semlogr/enrichers/property'
10
3
 
11
- logger = Semlogr::Logger.create do |c|
12
- c.log_at Semlogr::LogSeverity::DEBUG
13
-
14
- c.write_to Semlogr::Sinks::Console.new
15
- c.write_to Semlogr::Sinks::ColoredConsole.new
16
- c.write_to Semlogr::Sinks::Console.new(formatter: Semlogr::Formatters::JsonFormatter.new)
17
-
18
- c.enrich_with Semlogr::Enrichers::Thread.new
19
- c.enrich_with Semlogr::Enrichers::Host.new
20
- c.enrich_with Semlogr::Enrichers::Property.new(version: '1.0')
21
-
22
- c.filter_when lambda { |log_event|
23
- log_event.get_property(:id) == 123
24
- }
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console
25
6
  end
26
7
 
27
- logger.debug('Test {id}, string {string}')
28
- logger.debug('Test {id}, string {string}', id: nil, string: nil)
29
- logger.debug('Test {id}, string {string}', id: 123, string: 'foo')
30
- logger.debug('Test {id}, string {string}', id: 1234, string: 'foo')
31
- logger.info('Test {id}, string {string}', id: 1234, string: 'foo')
32
- logger.warn('Test {id}, string {string}', id: 1234, string: 'foo')
33
- logger.fatal('Test {id}, string {string}', id: 1234, string: 'foo')
34
- logger.fatal('Test array {array}', array: [1, 2, 3, 'foo'])
35
-
36
- logger.debug do
37
- 'Testing with a block'
38
- end
39
-
40
- logger.debug do
41
- ['Testing with a block, id: {id}', id: 1234]
42
- end
43
-
44
- logger.error('ERROR!!!', error: StandardError.new('test'))
45
- logger.error('ERROR!!!', error: StandardError.new('test'))
46
-
47
- begin
48
- def bob
49
- foo
50
- end
51
-
52
- def foo
53
- raise StandardError, 'foo'
54
- end
55
-
56
- bob
57
- rescue => ex
58
- logger.warn('Oops, id: {id}', id: 1234, error: ex)
59
- logger.error('Oops, id: {id}', id: 1234, error: ex)
60
-
61
- logger.error do
62
- ['Testing error with a block, id: {id}', error: ex, id: 1234]
63
- end
64
- end
8
+ Semlogr.info('Customer {id} checked out', id: 123)
9
+ Semlogr.error('Failed to save data', error: StandardError.new('foo'))
@@ -0,0 +1,9 @@
1
+ require 'bundler/setup'
2
+ require 'semlogr'
3
+
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console, formatter: Semlogr::Formatters::JsonFormatter.new
6
+ end
7
+
8
+ Semlogr.with_context(id: 2, correlation_id: '1234')
9
+ .info('Customer {id} checked out', id: 1)
@@ -0,0 +1,12 @@
1
+ require 'bundler/setup'
2
+ require 'semlogr'
3
+
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console, formatter: Semlogr::Formatters::JsonFormatter.new
6
+
7
+ c.enrich_with :host
8
+ c.enrich_with :thread
9
+ c.enrich_with :property, correlation_id: '1234'
10
+ end
11
+
12
+ Semlogr.info('Customer {id} checked out', id: 1)
@@ -0,0 +1,11 @@
1
+ require 'bundler/setup'
2
+ require 'semlogr'
3
+
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console
6
+
7
+ c.filter ->(e) { e.get_property(:id) == 123 }
8
+ end
9
+
10
+ Semlogr.info('Customer {id} checked out', id: 123)
11
+ Semlogr.info('Customer {id} checked out', id: 456)
@@ -0,0 +1,12 @@
1
+ require 'bundler/setup'
2
+ require 'semlogr'
3
+
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console, formatter: Semlogr::Formatters::JsonFormatter.new
6
+
7
+ c.enrich_with :log_context
8
+ end
9
+
10
+ Semlogr::Context::LogContext.push_property(a: 1) do
11
+ Semlogr.info('Customer {id} checked out', id: 1)
12
+ end
data/samples/sinks.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/setup'
2
+ require 'semlogr'
3
+
4
+ Semlogr.logger = Semlogr::Logger.create do |c|
5
+ c.write_to :console, formatter: Semlogr::Formatters::JsonFormatter.new
6
+ c.write_to :colored_console
7
+ end
8
+
9
+ Semlogr.info('Customer {id} checked out', id: 123)
10
+ Semlogr.error('Failed to save data', error: StandardError.new('foo'))
data/semlogr.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
 
@@ -27,5 +28,8 @@ Gem::Specification.new do |spec|
27
28
  spec.add_development_dependency 'pry', '~> 0.10.3'
28
29
  spec.add_development_dependency 'rake', '~> 10.0'
29
30
  spec.add_development_dependency 'rspec', '~> 3.0'
30
- spec.add_development_dependency 'rubocop', '~> 0.46'
31
+ spec.add_development_dependency 'rubocop', '0.49.1'
32
+ spec.add_development_dependency 'simplecov', '~>0.15.1'
33
+ spec.add_development_dependency 'benchmark-memory', '~>0.1.2'
34
+ spec.add_development_dependency 'benchmark-ips', '~>2.7.2'
31
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semlogr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Sedich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-10 00:00:00.000000000 Z
11
+ date: 2017-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lru_redux
@@ -96,18 +96,60 @@ dependencies:
96
96
  version: '3.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.49.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.49.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.15.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.15.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: benchmark-memory
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.1.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.1.2
139
+ - !ruby/object:Gem::Dependency
140
+ name: benchmark-ips
99
141
  requirement: !ruby/object:Gem::Requirement
100
142
  requirements:
101
143
  - - "~>"
102
144
  - !ruby/object:Gem::Version
103
- version: '0.46'
145
+ version: 2.7.2
104
146
  type: :development
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - "~>"
109
151
  - !ruby/object:Gem::Version
110
- version: '0.46'
152
+ version: 2.7.2
111
153
  description: A modern semantic logger for Ruby inspired by Serilog.
112
154
  email:
113
155
  - stefan.sedich@gmail.com
@@ -118,6 +160,7 @@ files:
118
160
  - ".gitignore"
119
161
  - ".rspec"
120
162
  - ".rubocop.yml"
163
+ - CHANGELOG.md
121
164
  - Gemfile
122
165
  - LICENSE.md
123
166
  - README.md
@@ -125,9 +168,14 @@ files:
125
168
  - bin/console
126
169
  - bin/setup
127
170
  - lib/semlogr.rb
171
+ - lib/semlogr/component_registry.rb
172
+ - lib/semlogr/context/log_context.rb
173
+ - lib/semlogr/enrichers/aggregate.rb
128
174
  - lib/semlogr/enrichers/host.rb
175
+ - lib/semlogr/enrichers/log_context.rb
129
176
  - lib/semlogr/enrichers/property.rb
130
177
  - lib/semlogr/enrichers/thread.rb
178
+ - lib/semlogr/error.rb
131
179
  - lib/semlogr/events/log_event.rb
132
180
  - lib/semlogr/formatters/json_formatter.rb
133
181
  - lib/semlogr/formatters/property_value_formatter.rb
@@ -137,17 +185,23 @@ files:
137
185
  - lib/semlogr/logger_configuration.rb
138
186
  - lib/semlogr/null_logger.rb
139
187
  - lib/semlogr/properties/output_properties.rb
188
+ - lib/semlogr/sinks/aggregate.rb
140
189
  - lib/semlogr/sinks/colored_console.rb
141
190
  - lib/semlogr/sinks/console.rb
142
191
  - lib/semlogr/sinks/file.rb
192
+ - lib/semlogr/sinks/filtering.rb
143
193
  - lib/semlogr/templates/parser.rb
144
194
  - lib/semlogr/templates/property_token.rb
145
195
  - lib/semlogr/templates/template.rb
146
196
  - lib/semlogr/templates/template_cache.rb
147
197
  - lib/semlogr/templates/text_token.rb
148
198
  - lib/semlogr/version.rb
149
- - output.html
150
199
  - samples/basic.rb
200
+ - samples/context.rb
201
+ - samples/enrichment.rb
202
+ - samples/filtering.rb
203
+ - samples/log_context.rb
204
+ - samples/sinks.rb
151
205
  - semlogr.gemspec
152
206
  homepage: https://github.com/semlogr/semlogr
153
207
  licenses:
@@ -169,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
223
  version: '0'
170
224
  requirements: []
171
225
  rubyforge_project:
172
- rubygems_version: 2.5.1
226
+ rubygems_version: 2.6.13
173
227
  signing_key:
174
228
  specification_version: 4
175
229
  summary: Semantic logging for Ruby
data/output.html DELETED
File without changes