ougai 1.5.0 → 1.5.2

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: 207074987e412815fd6fbb4acb718da9b4451c95
4
- data.tar.gz: 1e0d8320ba60fcd41c87c0dfb575cabc6cd77683
3
+ metadata.gz: 19d87c28c425031fb5819e07593210f5078ef857
4
+ data.tar.gz: 4dce59c9d66c03394b471e72715dfbf131cb6720
5
5
  SHA512:
6
- metadata.gz: 5ebf1a15410b890788c3ff9ea531d05286ec447c479bd348491a08a1735fa46d64783f805c84eedb31e73c074fa02b449c5deb2eb7a78321f493cb181696b092
7
- data.tar.gz: 2c3e322ba81f980a55572b31aebbdc753636db5cd394fadbf1a107e160e8c9e6c74a228c64aa3d5820455744f2d37bdbccb1e4decda40daa2e9bb46c44e0b8c9
6
+ metadata.gz: aefa5448b0a64c2332ee30f7432fa6c941c929da5393a94ce664b0248723f1c4c7fb5a70e47c0e49864863b8cddba5ef1d5a41ae50032ec304db753fce831d85
7
+ data.tar.gz: 603ec53229871b4ea8df521a35873a37842a96b3fd8bc7a3a8542a26a8737f5b10f21f22f44eea77bc45031bdcf7b5db74d6a2759d949ab870731f11155f5ab5
@@ -1,4 +1,3 @@
1
- require 'logger'
2
1
  require 'time'
3
2
  require 'socket'
4
3
 
@@ -13,6 +12,11 @@ module Ougai
13
12
  @hostname = hostname || Socket.gethostname.force_encoding('UTF-8')
14
13
  @trace_indent = 2
15
14
  @trace_max_lines = 100
15
+ self.datetime_format = nil
16
+ end
17
+
18
+ def datetime_format=(value)
19
+ @datetime_format = value || default_datetime_format
16
20
  end
17
21
 
18
22
  def serialize_exc(ex)
@@ -30,6 +34,19 @@ module Ougai
30
34
  sp = "\n" + ' ' * @trace_indent
31
35
  trace.slice(0, @trace_max_lines).join(sp)
32
36
  end
37
+
38
+ private
39
+
40
+ def format_datetime(time)
41
+ time.strftime(@datetime_format)
42
+ end
43
+
44
+ def default_datetime_format
45
+ t = Time.new
46
+ f = '%FT%T.%3N'
47
+ f << (t.utc? ? 'Z' : '%:z')
48
+ f.freeze
49
+ end
33
50
  end
34
51
  end
35
52
  end
@@ -49,7 +49,7 @@ module Ougai
49
49
 
50
50
  def dump(data)
51
51
  return data unless @jsonize
52
- data[:time] = data[:time].iso8601(3)
52
+ data[:time] = format_datetime(data[:time])
53
53
  str = JSON.generate(data)
54
54
  str << "\n" if @with_newline
55
55
  str
@@ -20,7 +20,7 @@ module Ougai
20
20
  def call(severity, time, progname, data)
21
21
  msg = data.delete(:msg)
22
22
  level = @plain ? severity : colored_level(severity)
23
- strs = ["[#{time.iso8601(3)}] #{level}: #{msg}"]
23
+ strs = ["[#{format_datetime(time)}] #{level}: #{msg}"]
24
24
  if err_str = create_err_str(data)
25
25
  strs.push(err_str)
26
26
  end
data/lib/ougai/logger.rb CHANGED
@@ -21,7 +21,7 @@ module Ougai
21
21
  # @param logger [Logger] The logger receiving broadcast logs.
22
22
  def self.broadcast(logger)
23
23
  Module.new do |mdl|
24
- ::Logger::Severity.constants.each do |severity|
24
+ Logger::Severity.constants.each do |severity|
25
25
  method_name = severity.downcase.to_sym
26
26
 
27
27
  mdl.send(:define_method, method_name) do |*args|
data/lib/ougai/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ougai
2
- VERSION = "1.5.0"
2
+ VERSION = "1.5.2"
3
3
  end
@@ -3,6 +3,24 @@ require 'spec_helper'
3
3
  describe Ougai::Formatters::Base do
4
4
  subject { described_class.new(app_name, hostname) }
5
5
 
6
+ context 'default' do
7
+ let (:app_name) { nil }
8
+ let (:hostname) { nil }
9
+
10
+ it 'has datetime format default ISO8601' do
11
+ expect(subject.datetime_format).to match(/^\%FT\%T\.\%3N(Z|\%\:z)$/)
12
+ end
13
+
14
+ it 'has datetime_format accessor' do
15
+ subject.datetime_format = '%I:%M:%S %p'
16
+ expect(subject.datetime_format).to eq('%I:%M:%S %p')
17
+
18
+ # revert default format by to set nil
19
+ subject.datetime_format = nil
20
+ expect(subject.datetime_format).to match(/^\%FT\%T\.\%3N(Z|\%\:z)$/)
21
+ end
22
+ end
23
+
6
24
  context 'without arguments and hostname contains a UTF-8 char' do
7
25
  let (:app_name) { nil }
8
26
  let (:hostname) { nil }
@@ -114,4 +114,20 @@ describe Ougai::Formatters::Bunyan do
114
114
  end
115
115
  end
116
116
 
117
+ describe '#datetime_format' do
118
+ subject do
119
+ formatter.call('DEBUG', Time.now, nil, data)
120
+ end
121
+
122
+ context 'is time AM/PM format' do
123
+ before do
124
+ formatter.datetime_format = '%I:%M:%S %p'
125
+ end
126
+
127
+ it 'applys output' do
128
+ result = JSON.parse(subject, symbolize_names: true)
129
+ expect(result[:time]).to match(/^\d{2}:\d{2}:\d{2} [AP]M$/)
130
+ end
131
+ end
132
+ end
117
133
  end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Ougai::Formatters::Readable do
4
+ let!(:re_start_with_datetime) { /^\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}(Z|[\+\-\:0-9]{4,6})]/ }
5
+
4
6
  let(:data) do
5
7
  {
6
8
  msg: 'Log Message!',
@@ -18,62 +20,73 @@ describe Ougai::Formatters::Readable do
18
20
  }
19
21
  end
20
22
 
23
+ let(:formatter) { described_class.new }
24
+
21
25
  context 'when severity is TRACE' do
22
- subject { described_class.new.call('TRACE', Time.now, nil, data) }
26
+ subject { formatter.call('TRACE', Time.now, nil, data) }
23
27
 
24
28
  it 'includes valid strings' do
29
+ expect(subject).to match(re_start_with_datetime)
25
30
  expect(subject).to include("\e[0;34mTRACE\e[0m: Log Message!")
26
31
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include(':status => 200')
27
32
  end
28
33
  end
29
34
 
30
35
  context 'when severity is DEBUG' do
31
- subject { described_class.new.call('DEBUG', Time.now, nil, data) }
36
+ subject { formatter.call('DEBUG', Time.now, nil, data) }
32
37
 
33
38
  it 'includes valid strings' do
39
+ expect(subject).to match(re_start_with_datetime)
34
40
  expect(subject).to include("\e[0;37mDEBUG\e[0m: Log Message!")
35
41
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include(':status => 200')
36
42
  end
37
43
  end
38
44
 
39
45
  context 'when severity is INFO' do
40
- subject { described_class.new.call('INFO', Time.now, nil, data) }
46
+ subject { formatter.call('INFO', Time.now, nil, data) }
41
47
 
42
48
  it 'includes valid strings' do
49
+ expect(subject).to match(re_start_with_datetime)
43
50
  expect(subject).to include("\e[0;36mINFO\e[0m: Log Message!")
44
51
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include(':method => "GET"')
45
52
  end
46
53
  end
47
54
 
48
55
  context 'when severity is WARN' do
49
- subject { described_class.new.call('WARN', Time.now, nil, data) }
56
+ subject { formatter.call('WARN', Time.now, nil, data) }
50
57
 
51
58
  it 'includes valid strings' do
59
+ expect(subject).to match(re_start_with_datetime)
52
60
  expect(subject).to include("\e[0;33mWARN\e[0m: Log Message!")
53
61
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include(':path => "/"')
54
62
  end
55
63
  end
56
64
 
57
65
  context 'when severity is ERROR' do
58
- subject { described_class.new.call('ERROR', Time.now, nil, data.merge({ err: err })) }
66
+ subject { formatter.call('ERROR', Time.now, nil, data.merge({ err: err })) }
59
67
 
60
68
  it 'includes valid strings' do
69
+ expect(subject).to match(re_start_with_datetime)
61
70
  expect(subject).to include("\e[0;31mERROR\e[0m: Log Message!")
62
71
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include('DummyError (it is dummy.):')
63
72
  end
64
73
  end
65
74
 
66
75
  context 'when severity is FATAL' do
67
- subject { described_class.new.call('FATAL', Time.now, nil, { msg: 'TheEnd', err: err }) }
76
+ subject { formatter.call('FATAL', Time.now, nil, { msg: 'TheEnd', err: err }) }
77
+
68
78
  it 'includes valid strings' do
79
+ expect(subject).to match(re_start_with_datetime)
69
80
  expect(subject).to include("\e[0;35mFATAL\e[0m: TheEnd")
70
81
  expect(subject.gsub(/\e\[([;\d]+)?m/, '')).to include("error1.rb\n error2.rb")
71
82
  end
72
83
  end
73
84
 
74
85
  context 'when severity is UNKNOWN' do
75
- subject { described_class.new.call('ANY', Time.now, nil, { msg: 'unknown msg' }) }
86
+ subject { formatter.call('ANY', Time.now, nil, { msg: 'unknown msg' }) }
87
+
76
88
  it 'includes valid strings' do
89
+ expect(subject).to match(re_start_with_datetime)
77
90
  expect(subject).to include("\e[0;32mANY\e[0m: unknown msg")
78
91
  end
79
92
  end
@@ -91,4 +104,20 @@ describe Ougai::Formatters::Readable do
91
104
  expect(plain_subject).not_to include(':method => "GET"')
92
105
  end
93
106
  end
107
+
108
+ describe '#datetime_format' do
109
+ subject do
110
+ formatter.call('DEBUG', Time.now, nil, data)
111
+ end
112
+
113
+ context 'is time AM/PM format' do
114
+ before do
115
+ formatter.datetime_format = '%I:%M:%S %p'
116
+ end
117
+
118
+ it 'applys output' do
119
+ expect(subject).to match(/^\[\d{2}:\d{2}:\d{2} [AP]M\]/)
120
+ end
121
+ end
122
+ end
94
123
  end
data/spec/logger_spec.rb CHANGED
@@ -565,6 +565,12 @@ describe Ougai::Logger do
565
565
  logger.level = Logger::INFO # propagate severity to another one
566
566
  end
567
567
 
568
+ it 'does not output trace log on both loggers' do
569
+ logger.trace(log_msg, foo: 0)
570
+ expect(item).to be_nil
571
+ expect(another_item).to be_nil
572
+ end
573
+
568
574
  it 'does not output debug log on both loggers' do
569
575
  logger.debug(log_msg, foo: 1)
570
576
  expect(item).to be_nil
@@ -602,20 +608,20 @@ describe Ougai::Logger do
602
608
 
603
609
  context 'another logger level is lower than original one' do
604
610
  before do
605
- logger.level = Logger::INFO
606
- another_logger.level = Logger::DEBUG
611
+ logger.level = Logger::DEBUG
612
+ another_logger.level = :trace
607
613
  end
608
614
 
609
- it 'outputs debug log on only another logger' do
610
- logger.debug(log_msg)
615
+ it 'does not output trace log on both loggers' do
616
+ logger.trace(log_msg)
611
617
  expect(item).to be_nil
612
- expect(another_item).to be_log_message(log_msg, 20)
618
+ expect(another_item).to be_log_message(log_msg, 10)
613
619
  end
614
620
 
615
- it 'outputs info log on both loggers' do
616
- logger.info(log_msg)
617
- expect(item).to be_log_message(log_msg, 30)
618
- expect(another_item).to be_log_message(log_msg, 30)
621
+ it 'outputs debug log on both loggers' do
622
+ logger.debug(log_msg)
623
+ expect(item).to be_log_message(log_msg, 20)
624
+ expect(another_item).to be_log_message(log_msg, 20)
619
625
  end
620
626
  end
621
627
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ougai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toshimitsu Takahashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-03 00:00:00.000000000 Z
11
+ date: 2017-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler