green_syslogger 0.1.2 → 0.2.0

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.
data/Manifest CHANGED
@@ -1,5 +1,6 @@
1
1
  Manifest
2
2
  README.md
3
3
  Rakefile
4
+ green_syslogger.gemspec
4
5
  lib/green_syslogger.rb
5
6
  test/green_syslogger_test.rb
data/README.md CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  Syslogger that makes your life greener
6
6
 
7
+ Custom Rails Logger
8
+
9
+ * Use Syslog like back storage
10
+ * Posibility to use custom 'facility'
11
+ * Posibility to use custom 'tag'
12
+ * Posibility to use custom 'tag' only in a concrete point so you can configure Syslog to filter this concrete message to another file
13
+ * Compatible with `config.logger.auto_flushing = false` so every log of a simple request will be written on an atomic way
14
+
7
15
  ## Install
8
16
 
9
17
  $ [sudo] gem install green_syslogger
@@ -13,34 +21,45 @@ Syslogger that makes your life greener
13
21
  require 'green_syslogger'
14
22
  logger = GreenSyslogger.new
15
23
  logger.debug( 'debug message' )
16
-
17
- To configure it on the <RAILS_ENVIRONMENT>.rb:
18
24
 
25
+ To install it configure it on the <RAILS_ENVIRONMENT>.rb:
19
26
  config.logger = GreenSyslogger.new(<default tag>, <facility>, <level>)
20
27
 
21
-
22
28
  By default
23
-
24
29
  GreenSyslogger.new('rails', 'local2', :debug)
25
30
 
31
+ Example for Rails configuration:
32
+
33
+ config.log_level = :info
34
+ config.logger = GreenSyslogger.new('myapp', 'local1', config.log_level)
35
+ config.colorize_logging = false
36
+ config.logger.auto_flushing = false
26
37
 
27
38
  To use it:
28
39
 
29
40
  logger.debug("my debug message")
30
41
  logger.error("my error message")
31
42
 
32
-
33
43
  To user another tag:
34
44
 
35
45
  logger.custom("my custom message", <tag>, <level>)
36
46
 
37
-
38
47
  By default:
39
48
 
40
49
  logger.custom("my custom message", 'custom', :info)
41
50
 
42
51
  ## TODO
43
52
 
53
+ In the `GreenSyslogger.custom` there are two reopen connections just to be allowed to change the `tag`, could be better to change the `tag` without reconnect.
54
+
55
+ There is not `GreenSyslogger.silencer`. Maybe is a good idea to implemented.
56
+
57
+ ## Change log
58
+
59
+ ### v 0.2.0
60
+
61
+ * Compatible with `config.logger.auto_flushing = false` so every log of a simple request will be written on an atomic way
62
+
44
63
 
45
64
  ## Credits
46
65
 
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('green_syslogger', '0.1.2') do |p|
5
+ Echoe.new('green_syslogger', '0.2.0') do |p|
6
6
  p.description = "Syslogger that makes your life greener"
7
7
  p.url = "https://github.com/SponsorPay/GreenSyslogger"
8
8
  p.author = "Fernando Guillen <http://fernandoguillen.info> & Juan Jose Vidal <@j2vidal>"
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{green_syslogger}
5
- s.version = "0.1.2"
5
+ s.version = "0.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Fernando Guillen <http://fernandoguillen.info> & Juan Jose Vidal <@j2vidal>"]
9
- s.date = %q{2010-11-09}
9
+ s.date = %q{2010-11-12}
10
10
  s.description = %q{Syslogger that makes your life greener}
11
11
  s.email = %q{fguillen.mail@gmail.com}
12
12
  s.extra_rdoc_files = ["README.md", "lib/green_syslogger.rb"]
13
- s.files = ["Manifest", "README.md", "Rakefile", "lib/green_syslogger.rb", "test/green_syslogger_test.rb", "green_syslogger.gemspec"]
13
+ s.files = ["Manifest", "README.md", "Rakefile", "green_syslogger.gemspec", "lib/green_syslogger.rb", "test/green_syslogger_test.rb"]
14
14
  s.homepage = %q{https://github.com/SponsorPay/GreenSyslogger}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Green_syslogger", "--main", "README.md"]
16
16
  s.require_paths = ["lib"]
@@ -1,14 +1,27 @@
1
1
  require 'syslog'
2
2
 
3
3
  #
4
- # Custom log
4
+ # Custom Rails Logger
5
5
  #
6
- # To install it cofigure it on the <RAILS_ENVIRONMENT>.rb:
6
+ # * Use Syslog like back storage
7
+ # * Posibility to use custom 'facility'
8
+ # * Posibility to use custom 'tag'
9
+ # * Posibility to use custom 'tag' only in a concrete point so you can configure Syslog to filter this concrete message to another file
10
+ # * Compatible with `config.logger.auto_flushing = false` so every log of a simple request will be written on an atomic way
11
+ #
12
+ # To install it configure it on the <RAILS_ENVIRONMENT>.rb:
7
13
  # config.logger = GreenSyslogger.new(<default tag>, <facility>, <level>)
8
14
  #
9
15
  # By default
10
16
  # GreenSyslogger.new('rails', 'local2', :debug)
11
17
  #
18
+ # Example for Rails configuration:
19
+ #
20
+ # config.log_level = :info
21
+ # config.logger = GreenSyslogger.new('myapp', 'local1', config.log_level)
22
+ # config.colorize_logging = false
23
+ # config.logger.auto_flushing = false
24
+ #
12
25
  # To use it:
13
26
  #
14
27
  # logger.debug("my debug message")
@@ -32,62 +45,114 @@ class GreenSyslogger
32
45
  :warn => [:warning , 2],
33
46
  :error => [:err , 3],
34
47
  :fatal => [:emerg , 4],
35
- :unknown => [:debub , 5]
48
+ :unknown => [:debug , 5]
36
49
  }
37
50
 
38
- DEFAULT_CONF = [ Syslog::LOG_PID, Syslog::LOG_LOCAL2 ]
51
+ DEFAULT_MAX_BUFFER_SIZE = 500
39
52
 
40
53
  def initialize(tag = 'rails', facility = 'local2', level = :debug)
41
54
  @tag = tag
42
55
  @facility = facility
43
56
  @level = level
44
- @syslog = Syslog.open( @tag, Syslog::LOG_PID, Syslog.const_get( "LOG_#{@facility.upcase}" ) )
57
+ @max_buffer_size = 1
58
+ @buffer = {}
59
+ @guard = Mutex.new
60
+ @syslog = Syslog.open(@tag, Syslog::LOG_PID, Syslog.const_get("LOG_#{@facility.upcase}"))
45
61
  end
46
62
 
47
63
  def close
48
64
  @syslog.close
49
65
  end
50
-
51
- def opened?
52
- @syslog.opened?
53
- end
54
66
 
67
+ # This method is a kind of a back door, using it you can
68
+ # change the 'tag' with this message is tagged.
69
+ #
55
70
  # level default to 'info'
56
71
  # tag default 'ids-custom'
57
72
  def custom(message, tag = 'custom', level = :info)
58
- @syslog = Syslog.reopen( tag, Syslog::LOG_PID, Syslog.const_get( "LOG_#{@facility.upcase}" ) )
59
- self.log(message, level)
60
- @syslog = Syslog.reopen( @tag, Syslog::LOG_PID, Syslog.const_get( "LOG_#{@facility.upcase}" ) )
61
- end
62
-
63
- # level default to 'info'
64
- def log(message, level = :info)
65
- # File.open("/tmp/ids.log", 'w') { |f| f.write(message) }
66
- @syslog.send( LEVELS_MAP[level][0], clean( message ) )
73
+ add(tag, level, message)
67
74
  end
68
75
 
69
76
  LEVELS_MAP.each_key do |level|
70
77
  define_method level do |message|
71
- if self.send("#{level}?")
72
- self.log(message, level)
73
- end
78
+ add(@tag, level, message)
74
79
  end
75
80
 
76
81
  define_method "#{level}?" do
77
- LEVELS_MAP[level][1] >= LEVELS_MAP[@level][1]
82
+ level?(level)
83
+ end
84
+ end
85
+
86
+
87
+ # If it is set to 'true' every line will be sent in the time is wrotten
88
+ # If it is set to 'false' the buffer will be flushed at the end of the request by Rails
89
+ # There is a DEFAULT_MAX_BUFFER_SIZE security buffer size
90
+ #
91
+ # only true or false
92
+ def auto_flushing=(value)
93
+ @max_buffer_size = value ? 1 : DEFAULT_MAX_BUFFER_SIZE
94
+ end
95
+
96
+ def flush
97
+ @guard.synchronize do
98
+ buffer.each do |buff|
99
+ date = buff[0]
100
+ tag = buff[1]
101
+ level = buff[2]
102
+ message = buff[3]
103
+
104
+ message = "[#{date.strftime('%Y-%m-%d %H:%M:%S')}] #{message}"
105
+
106
+ if(tag == @tag)
107
+ @syslog.send(LEVELS_MAP[level][0], message)
108
+ else
109
+ @syslog = Syslog.reopen(tag, Syslog::LOG_PID, Syslog.const_get("LOG_#{@facility.upcase}"))
110
+ @syslog.send(LEVELS_MAP[level][0], message)
111
+ @syslog = Syslog.reopen(@tag, Syslog::LOG_PID, Syslog.const_get("LOG_#{@facility.upcase}"))
112
+ end
113
+ end
78
114
  end
115
+
116
+ clear_buffer
79
117
  end
80
118
 
81
- private
119
+
120
+ private
121
+
122
+ def level?(level)
123
+ LEVELS_MAP[level][1] >= LEVELS_MAP[@level][1]
124
+ end
125
+
126
+ def add(tag, level, message)
127
+ if(level?(level))
128
+ # The init of the request
129
+ if( message.gsub!("\n\nStarted", 'Started') )
130
+ add(tag, level, '---')
131
+ end
132
+
133
+ buffer << [Time.now, tag, level, message]
134
+ auto_flush
135
+ end
136
+ end
137
+
138
+ def auto_flush
139
+ self.flush if buffer.size >= @max_buffer_size
140
+ end
82
141
 
83
- # Clean up messages so they're nice and pretty.
84
- # Taken from SyslogLogger
85
- def clean(message)
86
- message = message.to_s.dup
87
- message.strip!
88
- message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
89
- message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
90
- return message
142
+ def buffer
143
+ @buffer[Thread.current] ||= []
91
144
  end
92
145
 
146
+ def clear_buffer
147
+ @buffer.delete(Thread.current)
148
+ end
149
+
150
+ # This is really only for debbugging
151
+ def log_to_file(message)
152
+ File.open("/tmp/my.log", 'w') do |f|
153
+ f.write(">> #{message}\n")
154
+ f.flush
155
+ end
156
+ end
157
+
93
158
  end
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'mocha'
4
+ require 'delorean'
4
5
  require File.expand_path(File.dirname(__FILE__) + '/../lib/green_syslogger')
5
6
 
6
7
 
@@ -18,43 +19,43 @@ class GreenSysloggerTest < Test::Unit::TestCase
18
19
  def test_initialize_by_default
19
20
  Syslog.expects(:open).with('rails', Syslog::LOG_PID, Syslog::LOG_LOCAL2).returns( @logger.instance_eval('@syslog') )
20
21
  @logger = GreenSyslogger.new
22
+
23
+ assert_equal('rails', @logger.instance_eval("@tag"))
24
+ assert_equal('local2', @logger.instance_eval("@facility"))
21
25
  assert_equal(:debug, @logger.instance_eval("@level"))
26
+ assert_equal(1, @logger.instance_eval("@max_buffer_size"))
22
27
  end
23
28
 
24
29
  def test_initialize_with_params
25
30
  Syslog.expects(:open).with('my tag', Syslog::LOG_PID, Syslog::LOG_LOCAL3).returns( @logger.instance_eval('@syslog') )
26
31
  @logger = GreenSyslogger.new('my tag', 'local3', :info)
32
+
33
+ assert_equal('my tag', @logger.instance_eval("@tag"))
34
+ assert_equal('local3', @logger.instance_eval("@facility"))
27
35
  assert_equal(:info, @logger.instance_eval("@level"))
36
+ assert_equal(1, @logger.instance_eval("@max_buffer_size"))
28
37
  end
29
38
 
30
39
  def test_has_a_collection_of_methods
31
40
  GreenSyslogger::LEVELS_MAP.each_key do |level|
32
- @logger.expects(:log).with(@message, level)
41
+ @logger.expects(:add).with('rails', level, @message)
33
42
  @logger.send(level, @message)
34
43
  end
35
44
  end
36
45
 
37
- def test_log
38
- @logger.instance_eval('@syslog').expects(:debug).with(@message)
39
- @logger.log(@message, :debug)
40
- end
41
-
42
- def test_log_cleaned
43
- @logger.expects(:clean).with(@message).returns("#{@message} cleaned")
44
- @logger.instance_eval('@syslog').expects(:debug).with("#{@message} cleaned")
45
- @logger.log(@message, :debug)
46
- end
47
-
48
- def test_clean
49
- dirty_message = "\x1B[[1m\x1B[[36mSQL (0.339ms)\x1B[[0m \x1B[[1m select landing_page_id, count(*) cnt from transactions \n where landing_page_id in (4278,4279,4334,4338,4340,4342) \n and status >= 45 and created_at >= '2010-11-08T11:30:22'\n group by landing_page_id\n\x1B[[0m"
50
- clean_message = "SQL (0.339ms) select landing_page_id, count(*) cnt from transactions \n where landing_page_id in (4278,4279,4334,4338,4340,4342) \n and status >= 45 and created_at >= '2010-11-08T11:30:22'\n group by landing_page_id\n"
51
-
52
- assert_equal(clean_message, @logger.send(:clean, dirty_message))
46
+ def test_debug_with_defaul_initialization
47
+ @logger.expects(:auto_flush)
48
+
49
+ Delorean.time_travel_to("2010-01-01 10:10:10") do
50
+ @logger.debug('wadus message')
51
+ end
52
+
53
+ assert_equal([Time.parse('2010-01-01 10:10:10').to_s, 'rails', 'debug', 'wadus message'], @logger.instance_eval('buffer')[0].map { |e| e.to_s })
53
54
  end
54
55
 
55
56
  def test_log_in_debug_level
56
57
  @logger.level = :debug
57
- @logger.expects(:log).times(3)
58
+ @logger.expects(:auto_flush).times(3)
58
59
  @logger.debug(@message)
59
60
  @logger.info(@message)
60
61
  @logger.error(@message)
@@ -62,16 +63,56 @@ class GreenSysloggerTest < Test::Unit::TestCase
62
63
 
63
64
  def test_log_in_info_level
64
65
  @logger.level = :info
65
- @logger.expects(:log).times(2)
66
+ @logger.expects(:auto_flush).times(2)
66
67
  @logger.debug(@message)
67
68
  @logger.info(@message)
68
69
  @logger.error(@message)
69
70
  end
70
71
 
71
72
  def test_log_with_custom_tag
72
- Syslog.expects(:reopen).returns(@logger.instance_eval('@syslog')).twice
73
- @logger.expects(:log)
74
- @logger.custom(@message)
73
+ @logger.expects(:add).with('my tag', :info, @message)
74
+ @logger.custom(@message, 'my tag')
75
+ end
76
+
77
+ def test_auto_flush_activate
78
+ @logger.auto_flushing = true
79
+ @logger.expects(:flush).times(1)
80
+ @logger.debug('wadus message')
81
+ end
82
+
83
+ def test_auto_flush_deactivate
84
+ old_max_buffer_size = GreenSyslogger::DEFAULT_MAX_BUFFER_SIZE
85
+ GreenSyslogger.send(:remove_const, :DEFAULT_MAX_BUFFER_SIZE)
86
+ GreenSyslogger.const_set(:DEFAULT_MAX_BUFFER_SIZE, 3)
87
+
88
+ @logger.auto_flushing = false
89
+ @logger.expects(:flush).times(1)
90
+
91
+ @logger.debug('wadus message')
92
+ @logger.debug('wadus message')
93
+ @logger.debug('wadus message')
94
+
95
+ GreenSyslogger.send(:remove_const, :DEFAULT_MAX_BUFFER_SIZE)
96
+ GreenSyslogger.const_set(:DEFAULT_MAX_BUFFER_SIZE, old_max_buffer_size)
75
97
  end
98
+
99
+ def test_flush
100
+ @syslog = @logger.instance_eval('@syslog')
101
+ Syslog.expects(:reopen).returns(@syslog).times(2)
102
+ @syslog.expects(:debug).times(2)
103
+ @syslog.expects(:info).times(2)
104
+
105
+ @logger.auto_flushing = false
106
+ @logger.debug('wadus debug')
107
+ @logger.info('wadus info')
108
+ @logger.custom('wadus custom tag info', 'new tag', :info)
109
+ @logger.debug('wadus info again')
76
110
 
111
+ @logger.flush
112
+ end
113
+
114
+ def test_especial_case_init_of_request
115
+ @logger.expects(:auto_flush).twice
116
+ @logger.info("\n\nStarted")
117
+ end
77
118
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: green_syslogger
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
8
  - 2
10
- version: 0.1.2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Fernando Guillen <http://fernandoguillen.info> & Juan Jose Vidal <@j2vidal>
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-09 00:00:00 +01:00
18
+ date: 2010-11-12 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -32,9 +32,9 @@ files:
32
32
  - Manifest
33
33
  - README.md
34
34
  - Rakefile
35
+ - green_syslogger.gemspec
35
36
  - lib/green_syslogger.rb
36
37
  - test/green_syslogger_test.rb
37
- - green_syslogger.gemspec
38
38
  has_rdoc: true
39
39
  homepage: https://github.com/SponsorPay/GreenSyslogger
40
40
  licenses: []