syslogger 1.6.5 → 1.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +58 -0
- data/.gitignore +13 -22
- data/.rubocop.yml +8 -0
- data/Appraisals +13 -0
- data/CHANGELOG.md +13 -0
- data/Gemfile +2 -0
- data/Guardfile +16 -0
- data/README.md +1 -1
- data/Rakefile +3 -0
- data/bin/_guard-core +29 -0
- data/bin/appraisal +29 -0
- data/bin/guard +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/gemfiles/rails_5.2.4.gemfile +7 -0
- data/gemfiles/rails_6.0.3.gemfile +7 -0
- data/gemfiles/rails_6.1.0.gemfile +7 -0
- data/lib/syslogger.rb +78 -71
- data/lib/syslogger/version.rb +15 -1
- data/spec/spec_helper.rb +32 -0
- data/spec/syslogger_spec.rb +26 -6
- data/syslogger.gemspec +17 -12
- metadata +83 -15
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f36b2f4ea6682e821787ea055e08b01368b4568544bc41a71dd93bde6ed0390b
|
4
|
+
data.tar.gz: b951b4952c20d20882b161675785cbcb2430b1c9d229d01d56f3c9c4152d7fc9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2567599956b7b79965b7617e1bbb2caecbed9c482bf7d3792e25247133bb4179ac31fc88109d03223172677734080a169bdd869ba232765a2022a538e4dcb8b6
|
7
|
+
data.tar.gz: 262ef1518804b333cb846a40b2607f7c5389276dbb10a0dc9bb6e19dc9c7819aa67f6a821d36b69abc9d886f2b2066fda66572b2f790cdd40f43872d29f4e99d
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
name: CI
|
3
|
+
|
4
|
+
on:
|
5
|
+
- push
|
6
|
+
- pull_request
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
rspec:
|
10
|
+
runs-on: ubuntu-20.04
|
11
|
+
strategy:
|
12
|
+
fail-fast: false
|
13
|
+
matrix:
|
14
|
+
ruby:
|
15
|
+
- '3.0'
|
16
|
+
- '2.7'
|
17
|
+
- '2.6'
|
18
|
+
- '2.5'
|
19
|
+
rails:
|
20
|
+
- rails_5.2.4
|
21
|
+
- rails_6.0.3
|
22
|
+
- rails_6.1.0
|
23
|
+
exclude:
|
24
|
+
- ruby: '3.0'
|
25
|
+
rails: rails_5.2.4
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- name: Checkout
|
29
|
+
uses: actions/checkout@v2
|
30
|
+
|
31
|
+
- name: Setup Ruby
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
with:
|
34
|
+
ruby-version: ${{ matrix.ruby }}
|
35
|
+
|
36
|
+
- name: Setup Ruby cache
|
37
|
+
uses: actions/cache@v2
|
38
|
+
with:
|
39
|
+
path: "${GITHUB_WORKSPACE}/vendor/bundle"
|
40
|
+
key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-${{ hashFiles('**/Gemfile.lock') }}
|
41
|
+
restore-keys: |
|
42
|
+
${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-
|
43
|
+
|
44
|
+
- name: Bundle
|
45
|
+
env:
|
46
|
+
RAILS_VERSION: ${{ matrix.rails }}
|
47
|
+
run: |
|
48
|
+
export BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/${RAILS_VERSION}.gemfile"
|
49
|
+
gem install bundler
|
50
|
+
bundle config path "${GITHUB_WORKSPACE}/vendor/bundle"
|
51
|
+
bundle install --jobs 4 --retry 3
|
52
|
+
|
53
|
+
- name: RSpec
|
54
|
+
env:
|
55
|
+
RAILS_VERSION: ${{ matrix.rails }}
|
56
|
+
run: |
|
57
|
+
export BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/${RAILS_VERSION}.gemfile"
|
58
|
+
bundle exec rake
|
data/.gitignore
CHANGED
@@ -1,26 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Ignore bundler config.
|
2
|
+
/.bundle
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
# Ignore Gemfile.lock
|
5
|
+
/Gemfile.lock
|
6
|
+
/gemfiles/*.lock
|
7
|
+
/gemfiles/.bundle
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
.\#*
|
9
|
+
# Ignore test files
|
10
|
+
/coverage
|
11
|
+
/tmp
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
## PROJECT::GENERAL
|
17
|
-
coverage
|
18
|
-
rdoc
|
19
|
-
pkg
|
20
|
-
Gemfile.lock
|
21
|
-
|
22
|
-
## PROJECT::SPECIFIC
|
23
|
-
|
24
|
-
## RVM
|
25
|
-
.rvmrc
|
13
|
+
# RVM files
|
14
|
+
/.ruby-version
|
26
15
|
|
16
|
+
# Gem files
|
17
|
+
/*.gem
|
data/.rubocop.yml
ADDED
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.6.6
|
4
|
+
|
5
|
+
* Drop support of Ruby 2.3
|
6
|
+
* Drop support of Ruby 2.4
|
7
|
+
* Add support of Ruby 2.6
|
8
|
+
* Add support of Ruby 2.7
|
9
|
+
* Add support of Ruby 3.0
|
10
|
+
* Drop support of Rails 5.1
|
11
|
+
* Add support of Rails 6.0
|
12
|
+
* Add support of Rails 6.1
|
13
|
+
* Add binstubs to ease development
|
14
|
+
* Migrate from Travis to Github Actions
|
15
|
+
|
3
16
|
## 1.6.5
|
4
17
|
|
5
18
|
* Merge [Fixnum type is deprecated](https://github.com/crohr/syslogger/pull/42) (thanks thesmart)
|
data/Gemfile
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
4
|
+
require 'guard/rspec/dsl'
|
5
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
6
|
+
|
7
|
+
# RSpec files
|
8
|
+
rspec = dsl.rspec
|
9
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
10
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
11
|
+
watch(rspec.spec_files)
|
12
|
+
|
13
|
+
# Ruby files
|
14
|
+
ruby = dsl.ruby
|
15
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
16
|
+
end
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[![GitHub release](https://img.shields.io/github/release/crohr/syslogger.svg)](https://github.com/crohr/syslogger/releases/latest)
|
5
5
|
[![Gem](https://img.shields.io/gem/v/syslogger.svg)](https://rubygems.org/gems/syslogger)
|
6
6
|
[![Gem](https://img.shields.io/gem/dtv/syslogger.svg)](https://rubygems.org/gems/syslogger)
|
7
|
-
[![
|
7
|
+
[![CI](https://github.com/crohr/syslogger/workflows/CI/badge.svg)](https://github.com/crohr/syslogger/actions)
|
8
8
|
|
9
9
|
A drop-in replacement for the standard Logger Ruby library, that logs to the syslog instead of a log file.
|
10
10
|
Contrary to the SyslogLogger library, you can specify the facility and the syslog options.
|
data/Rakefile
CHANGED
data/bin/_guard-core
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application '_guard-core' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("guard", "_guard-core")
|
data/bin/appraisal
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'appraisal' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("appraisal", "appraisal")
|
data/bin/guard
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'guard' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("guard", "guard")
|
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/lib/syslogger.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
+
require 'forwardable'
|
1
2
|
require 'syslog'
|
2
3
|
require 'logger'
|
3
|
-
require 'thread'
|
4
4
|
|
5
5
|
class Syslogger
|
6
|
+
extend Forwardable
|
6
7
|
|
7
8
|
MUTEX = Mutex.new
|
8
9
|
|
9
|
-
attr_reader
|
10
|
-
attr_accessor :formatter
|
10
|
+
attr_reader :level, :options, :facility
|
11
|
+
attr_accessor :ident, :formatter, :max_octets
|
11
12
|
|
12
13
|
MAPPING = {
|
13
14
|
Logger::DEBUG => Syslog::LOG_DEBUG,
|
@@ -18,16 +19,23 @@ class Syslogger
|
|
18
19
|
Logger::UNKNOWN => Syslog::LOG_ALERT
|
19
20
|
}.freeze
|
20
21
|
|
21
|
-
|
22
|
+
LEVELS = %w[debug info warn error fatal unknown].freeze
|
23
|
+
|
22
24
|
# Initializes default options for the logger
|
25
|
+
#
|
23
26
|
# <tt>ident</tt>:: the name of your program [default=$0].
|
27
|
+
#
|
24
28
|
# <tt>options</tt>:: syslog options [default=<tt>Syslog::LOG_PID | Syslog::LOG_CONS</tt>].
|
29
|
+
#
|
25
30
|
# Correct values are:
|
26
31
|
# LOG_CONS : writes the message on the console if an error occurs when sending the message;
|
27
32
|
# LOG_NDELAY : no delay before sending the message;
|
28
33
|
# LOG_PERROR : messages will also be written on STDERR;
|
29
34
|
# LOG_PID : adds the process number to the message (just after the program name)
|
30
|
-
#
|
35
|
+
#
|
36
|
+
# <tt>facility</tt>:: the syslog facility [default=nil]
|
37
|
+
#
|
38
|
+
# Correct values include:
|
31
39
|
# Syslog::LOG_DAEMON
|
32
40
|
# Syslog::LOG_USER
|
33
41
|
# Syslog::LOG_SYSLOG
|
@@ -42,45 +50,37 @@ class Syslogger
|
|
42
50
|
# logger.debug "debug message"
|
43
51
|
# logger.info "my_subapp" { "Some lazily computed message" }
|
44
52
|
#
|
45
|
-
def initialize(ident = $
|
53
|
+
def initialize(ident = $PROGRAM_NAME, options = Syslog::LOG_PID | Syslog::LOG_CONS, facility = nil)
|
46
54
|
@ident = ident
|
47
55
|
@options = options || (Syslog::LOG_PID | Syslog::LOG_CONS)
|
48
56
|
@facility = facility
|
49
57
|
@level = Logger::INFO
|
50
|
-
@formatter =
|
51
|
-
msg
|
52
|
-
end
|
58
|
+
@formatter = SimpleFormatter.new
|
53
59
|
end
|
54
60
|
|
55
|
-
|
61
|
+
LEVELS.each do |logger_method|
|
56
62
|
# Accepting *args as message could be nil.
|
57
63
|
# Default params not supported in ruby 1.8.7
|
58
64
|
define_method logger_method.to_sym do |*args, &block|
|
59
65
|
severity = Logger.const_get(logger_method.upcase)
|
60
|
-
return true if
|
66
|
+
return true if level > severity
|
67
|
+
|
61
68
|
add(severity, nil, args.first, &block)
|
62
69
|
end
|
63
70
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
71
|
+
next if logger_method == 'unknown'.freeze
|
72
|
+
|
73
|
+
define_method "#{logger_method}?".to_sym do
|
74
|
+
level <= Logger.const_get(logger_method.upcase)
|
68
75
|
end
|
69
76
|
end
|
70
77
|
|
71
|
-
# Log a message at the Logger::INFO level.
|
78
|
+
# Log a message at the Logger::INFO level.
|
72
79
|
def write(msg)
|
73
80
|
add(Logger::INFO, msg)
|
74
81
|
end
|
75
|
-
|
76
|
-
|
77
|
-
def <<(msg)
|
78
|
-
add(Logger::INFO, msg)
|
79
|
-
end
|
80
|
-
|
81
|
-
def puts(msg)
|
82
|
-
add(Logger::INFO, msg)
|
83
|
-
end
|
82
|
+
alias << write
|
83
|
+
alias puts write
|
84
84
|
|
85
85
|
# Low level method to add a message.
|
86
86
|
# +severity+:: the level of the message. One of Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL, Logger::UNKNOWN
|
@@ -93,7 +93,7 @@ class Syslogger
|
|
93
93
|
message, progname = progname, nil
|
94
94
|
end
|
95
95
|
progname ||= @ident
|
96
|
-
mask = Syslog::LOG_UPTO(MAPPING[
|
96
|
+
mask = Syslog::LOG_UPTO(MAPPING[level])
|
97
97
|
communication = message || block && block.call
|
98
98
|
formatted_communication = clean(formatter.call(severity, Time.now, progname, communication))
|
99
99
|
|
@@ -101,47 +101,18 @@ class Syslogger
|
|
101
101
|
syslog_add(progname, severity, mask, formatted_communication)
|
102
102
|
end
|
103
103
|
|
104
|
-
# Set the max octets of the messages written to the log
|
105
|
-
def max_octets=(max_octets)
|
106
|
-
@max_octets = max_octets
|
107
|
-
end
|
108
|
-
|
109
104
|
# Sets the minimum level for messages to be written in the log.
|
110
105
|
# +level+:: one of <tt>Logger::DEBUG</tt>, <tt>Logger::INFO</tt>, <tt>Logger::WARN</tt>, <tt>Logger::ERROR</tt>, <tt>Logger::FATAL</tt>, <tt>Logger::UNKNOWN</tt>
|
111
106
|
def level=(level)
|
112
107
|
@level = sanitize_level(level)
|
113
108
|
end
|
114
109
|
|
115
|
-
# Sets the ident string passed along to Syslog
|
116
|
-
def ident=(ident)
|
117
|
-
@ident = ident
|
118
|
-
end
|
119
|
-
|
120
110
|
# Tagging code borrowed from ActiveSupport gem
|
121
111
|
def tagged(*tags)
|
122
|
-
|
123
|
-
yield self
|
124
|
-
ensure
|
125
|
-
pop_tags(new_tags.size)
|
126
|
-
end
|
127
|
-
|
128
|
-
def push_tags(*tags)
|
129
|
-
tags.flatten.reject { |i| i.respond_to?(:empty?) ? i.empty? : !i }.tap do |new_tags|
|
130
|
-
current_tags.concat(new_tags).uniq!
|
131
|
-
end
|
112
|
+
formatter.tagged(*tags) { yield self }
|
132
113
|
end
|
133
114
|
|
134
|
-
|
135
|
-
current_tags.pop size
|
136
|
-
end
|
137
|
-
|
138
|
-
def clear_tags!
|
139
|
-
current_tags.clear
|
140
|
-
end
|
141
|
-
|
142
|
-
def current_tags
|
143
|
-
Thread.current[:syslogger_tagged_logging_tags] ||= []
|
144
|
-
end
|
115
|
+
def_delegators :formatter, :current_tags, :push_tags, :pop_tags, :clear_tags!
|
145
116
|
|
146
117
|
protected
|
147
118
|
|
@@ -163,40 +134,76 @@ class Syslogger
|
|
163
134
|
def clean(message)
|
164
135
|
message = message.to_s.dup
|
165
136
|
message.strip! # remove whitespace
|
166
|
-
message.gsub!(/\n/, '\\n') # escape newlines
|
167
|
-
message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
|
168
|
-
message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
|
137
|
+
message.gsub!(/\n/, '\\n'.freeze) # escape newlines
|
138
|
+
message.gsub!(/%/, '%%'.freeze) # syslog(3) freaks on % (printf)
|
139
|
+
message.gsub!(/\e\[[^m]*m/, ''.freeze) # remove useless ansi color codes
|
169
140
|
message
|
170
141
|
end
|
171
142
|
|
172
143
|
private
|
173
144
|
|
174
|
-
def tags_text
|
175
|
-
tags = current_tags
|
176
|
-
if tags.any?
|
177
|
-
clean(tags.collect { |tag| "[#{tag}] " }.join) << ' '
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
145
|
def syslog_add(progname, severity, mask, formatted_communication)
|
182
146
|
MUTEX.synchronize do
|
183
147
|
Syslog.open(progname, @options, @facility) do |s|
|
184
148
|
s.mask = mask
|
185
|
-
if
|
186
|
-
buffer =
|
149
|
+
if max_octets
|
150
|
+
buffer = ''
|
187
151
|
formatted_communication.bytes do |byte|
|
188
152
|
buffer.concat(byte)
|
189
153
|
# if the last byte we added is potentially part of an escape, we'll go ahead and add another byte
|
190
|
-
if buffer.bytesize >=
|
154
|
+
if buffer.bytesize >= max_octets && !['%'.ord, '\\'.ord].include?(byte)
|
191
155
|
s.log(MAPPING[severity], buffer)
|
192
156
|
buffer = ''
|
193
157
|
end
|
194
158
|
end
|
195
159
|
s.log(MAPPING[severity], buffer) unless buffer.empty?
|
196
160
|
else
|
197
|
-
s.log(MAPPING[severity],
|
161
|
+
s.log(MAPPING[severity], formatted_communication)
|
198
162
|
end
|
199
163
|
end
|
200
164
|
end
|
201
165
|
end
|
166
|
+
|
167
|
+
# Borrowed from ActiveSupport.
|
168
|
+
# See: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/tagged_logging.rb
|
169
|
+
class SimpleFormatter < Logger::Formatter
|
170
|
+
# This method is invoked when a log event occurs.
|
171
|
+
def call(_severity, _timestamp, _progname, msg)
|
172
|
+
"#{tags_text}#{msg}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def tagged(*tags)
|
176
|
+
new_tags = push_tags(*tags)
|
177
|
+
yield self
|
178
|
+
ensure
|
179
|
+
pop_tags(new_tags.size)
|
180
|
+
end
|
181
|
+
|
182
|
+
def push_tags(*tags)
|
183
|
+
tags.flatten.reject { |i| i.respond_to?(:empty?) ? i.empty? : !i }.tap do |new_tags|
|
184
|
+
current_tags.concat(new_tags).uniq!
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def pop_tags(size = 1)
|
189
|
+
current_tags.pop size
|
190
|
+
end
|
191
|
+
|
192
|
+
def clear_tags!
|
193
|
+
current_tags.clear
|
194
|
+
end
|
195
|
+
|
196
|
+
# Fix: https://github.com/crohr/syslogger/issues/29
|
197
|
+
# See: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/tagged_logging.rb#L47
|
198
|
+
def current_tags
|
199
|
+
# We use our object ID here to avoid conflicting with other instances
|
200
|
+
thread_key = @thread_key ||= "syslogger_tagged_logging_tags:#{object_id}".freeze
|
201
|
+
Thread.current[thread_key] ||= []
|
202
|
+
end
|
203
|
+
|
204
|
+
def tags_text
|
205
|
+
tags = current_tags
|
206
|
+
tags.collect { |tag| "[#{tag}] " }.join if tags.any?
|
207
|
+
end
|
208
|
+
end
|
202
209
|
end
|
data/lib/syslogger/version.rb
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Syslogger
|
2
|
-
|
4
|
+
|
5
|
+
def self.gem_version
|
6
|
+
Gem::Version.new VERSION::STRING
|
7
|
+
end
|
8
|
+
|
9
|
+
module VERSION
|
10
|
+
MAJOR = 1
|
11
|
+
MINOR = 6
|
12
|
+
TINY = 6
|
13
|
+
PRE = nil
|
14
|
+
|
15
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
|
16
|
+
end
|
3
17
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'simplecov'
|
2
2
|
require 'rspec'
|
3
|
+
require 'active_job'
|
3
4
|
|
4
5
|
# Start Simplecov
|
5
6
|
SimpleCov.start
|
@@ -17,5 +18,36 @@ RSpec.configure do |config|
|
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
21
|
+
# Module helper for unit tests
|
22
|
+
module JobBuffer
|
23
|
+
class << self
|
24
|
+
def clear
|
25
|
+
values.clear
|
26
|
+
end
|
27
|
+
|
28
|
+
def add(value)
|
29
|
+
values << value
|
30
|
+
end
|
31
|
+
|
32
|
+
def values
|
33
|
+
@values ||= []
|
34
|
+
end
|
35
|
+
|
36
|
+
def last_value
|
37
|
+
values.last
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Class helper for unit tests
|
43
|
+
class HelloJob < ActiveJob::Base
|
44
|
+
def perform(greeter = "David")
|
45
|
+
JobBuffer.add("#{greeter} says hello")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Configure I18n otherwise it throws errors in syslog
|
50
|
+
I18n.available_locales = [:en]
|
51
|
+
|
20
52
|
# Load lib
|
21
53
|
require 'syslogger'
|
data/spec/syslogger_spec.rb
CHANGED
@@ -64,15 +64,19 @@ describe Syslogger do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'should clean formatted message' do
|
67
|
+
formatter = Class.new(Syslogger::SimpleFormatter) do
|
68
|
+
def call(severity, timestamp, progname, msg)
|
69
|
+
msg.split(//).join('%')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
67
73
|
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
68
74
|
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, "m%%e%%s%%s%%a%%g%%e")
|
69
75
|
|
70
76
|
original_formatter = logger.formatter
|
71
77
|
|
72
78
|
begin
|
73
|
-
logger.formatter =
|
74
|
-
msg.split(//).join('%')
|
75
|
-
end
|
79
|
+
logger.formatter = formatter.new
|
76
80
|
logger.add(Logger::INFO, 'message')
|
77
81
|
ensure
|
78
82
|
logger.formatter = original_formatter
|
@@ -118,11 +122,14 @@ describe Syslogger do
|
|
118
122
|
end
|
119
123
|
|
120
124
|
it 'should apply the log formatter to the message' do
|
125
|
+
formatter = Class.new(Syslogger::SimpleFormatter) do
|
126
|
+
def call(severity, timestamp, progname, msg)
|
127
|
+
"test #{msg}!"
|
128
|
+
end
|
129
|
+
end
|
121
130
|
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
122
131
|
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'test message!')
|
123
|
-
logger.formatter =
|
124
|
-
"test #{msg}!"
|
125
|
-
end
|
132
|
+
logger.formatter = formatter.new
|
126
133
|
logger.add(Logger::INFO, 'message')
|
127
134
|
end
|
128
135
|
end
|
@@ -295,6 +302,19 @@ describe Syslogger do
|
|
295
302
|
end
|
296
303
|
end
|
297
304
|
|
305
|
+
# Fix https://github.com/crohr/syslogger/issues/29
|
306
|
+
describe '#formatter' do
|
307
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
308
|
+
|
309
|
+
it 'should not raise error' do
|
310
|
+
ActiveJob::Base.logger = logger
|
311
|
+
expect(logger).to receive(:info).at_least(1).times.with(nil)
|
312
|
+
expect {
|
313
|
+
HelloJob.perform_later "Cristian"
|
314
|
+
}.to_not raise_error
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
298
318
|
describe '#push_tags' do
|
299
319
|
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
300
320
|
after(:each) { logger.clear_tags! }
|
data/syslogger.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/syslogger/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'syslogger'
|
7
|
-
s.version = Syslogger::VERSION
|
7
|
+
s.version = Syslogger::VERSION::STRING
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ['Cyril Rohr']
|
10
10
|
s.email = ['cyril.rohr@gmail.com']
|
@@ -12,16 +12,21 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = 'Dead simple Ruby Syslog logger'
|
13
13
|
s.description = 'Same as SyslogLogger, but without the ridiculous number of dependencies and with the possibility to specify the syslog facility'
|
14
14
|
s.license = 'MIT'
|
15
|
+
s.metadata = {
|
16
|
+
'homepage_uri' => 'https://github.com/crohr/syslogger',
|
17
|
+
'changelog_uri' => 'https://github.com/crohr/syslogger/blob/master/CHANGELOG.md',
|
18
|
+
'source_code_uri' => 'https://github.com/crohr/syslogger',
|
19
|
+
'bug_tracker_uri' => 'https://github.com/crohr/syslogger/issues'
|
20
|
+
}
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
15
23
|
|
24
|
+
s.add_development_dependency 'activejob'
|
25
|
+
s.add_development_dependency 'appraisal'
|
26
|
+
s.add_development_dependency 'guard-rspec'
|
16
27
|
s.add_development_dependency 'rake'
|
17
|
-
s.add_development_dependency 'rspec'
|
18
28
|
s.add_development_dependency 'rdoc'
|
29
|
+
s.add_development_dependency 'rspec'
|
30
|
+
s.add_development_dependency 'rubocop'
|
19
31
|
s.add_development_dependency 'simplecov'
|
20
|
-
|
21
|
-
s.files = `git ls-files`.split("\n")
|
22
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
-
s.require_paths = ['lib']
|
25
|
-
|
26
|
-
s.rdoc_options = ['--charset=UTF-8']
|
27
32
|
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: syslogger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Rohr
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activejob
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: appraisal
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard-rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
- !ruby/object:Gem::Dependency
|
14
56
|
name: rake
|
15
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +66,20 @@ dependencies:
|
|
24
66
|
- - ">="
|
25
67
|
- !ruby/object:Gem::Version
|
26
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rdoc
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
27
83
|
- !ruby/object:Gem::Dependency
|
28
84
|
name: rspec
|
29
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,7 +95,7 @@ dependencies:
|
|
39
95
|
- !ruby/object:Gem::Version
|
40
96
|
version: '0'
|
41
97
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
98
|
+
name: rubocop
|
43
99
|
requirement: !ruby/object:Gem::Requirement
|
44
100
|
requirements:
|
45
101
|
- - ">="
|
@@ -74,13 +130,25 @@ executables: []
|
|
74
130
|
extensions: []
|
75
131
|
extra_rdoc_files: []
|
76
132
|
files:
|
133
|
+
- ".github/workflows/ci.yml"
|
77
134
|
- ".gitignore"
|
78
|
-
- ".
|
135
|
+
- ".rubocop.yml"
|
136
|
+
- Appraisals
|
79
137
|
- CHANGELOG.md
|
80
138
|
- Gemfile
|
139
|
+
- Guardfile
|
81
140
|
- LICENSE
|
82
141
|
- README.md
|
83
142
|
- Rakefile
|
143
|
+
- bin/_guard-core
|
144
|
+
- bin/appraisal
|
145
|
+
- bin/guard
|
146
|
+
- bin/rake
|
147
|
+
- bin/rspec
|
148
|
+
- bin/rubocop
|
149
|
+
- gemfiles/rails_5.2.4.gemfile
|
150
|
+
- gemfiles/rails_6.0.3.gemfile
|
151
|
+
- gemfiles/rails_6.1.0.gemfile
|
84
152
|
- lib/syslogger.rb
|
85
153
|
- lib/syslogger/version.rb
|
86
154
|
- spec/spec_helper.rb
|
@@ -89,10 +157,13 @@ files:
|
|
89
157
|
homepage: http://github.com/crohr/syslogger
|
90
158
|
licenses:
|
91
159
|
- MIT
|
92
|
-
metadata:
|
93
|
-
|
94
|
-
|
95
|
-
|
160
|
+
metadata:
|
161
|
+
homepage_uri: https://github.com/crohr/syslogger
|
162
|
+
changelog_uri: https://github.com/crohr/syslogger/blob/master/CHANGELOG.md
|
163
|
+
source_code_uri: https://github.com/crohr/syslogger
|
164
|
+
bug_tracker_uri: https://github.com/crohr/syslogger/issues
|
165
|
+
post_install_message:
|
166
|
+
rdoc_options: []
|
96
167
|
require_paths:
|
97
168
|
- lib
|
98
169
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -106,11 +177,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
177
|
- !ruby/object:Gem::Version
|
107
178
|
version: '0'
|
108
179
|
requirements: []
|
109
|
-
|
110
|
-
|
111
|
-
signing_key:
|
180
|
+
rubygems_version: 3.2.7
|
181
|
+
signing_key:
|
112
182
|
specification_version: 4
|
113
183
|
summary: Dead simple Ruby Syslog logger
|
114
|
-
test_files:
|
115
|
-
- spec/spec_helper.rb
|
116
|
-
- spec/syslogger_spec.rb
|
184
|
+
test_files: []
|