EasyLogger 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.
Files changed (62) hide show
  1. data/.gitignore +10 -0
  2. data/EasyLogger.gemspec +28 -0
  3. data/EasyLogger.rdoc +62 -0
  4. data/Gemfile +21 -0
  5. data/README.rdoc +64 -0
  6. data/Rakefile +71 -0
  7. data/bin/EasyLogger +104 -0
  8. data/doc/ArubaOverrides.html +204 -0
  9. data/doc/EasyLogger.html +130 -0
  10. data/doc/EasyLogger/EasyLogger.html +188 -0
  11. data/doc/EasyLogger_rdoc.html +207 -0
  12. data/doc/File.html +208 -0
  13. data/doc/Gemfile.html +123 -0
  14. data/doc/README_rdoc.html +211 -0
  15. data/doc/Rakefile.html +136 -0
  16. data/doc/_index.html +101 -0
  17. data/doc/bin/EasyLogger.html +62 -0
  18. data/doc/class_list.html +36 -0
  19. data/doc/created.rid +11 -0
  20. data/doc/css/common.css +1 -0
  21. data/doc/css/full_list.css +53 -0
  22. data/doc/css/style.css +310 -0
  23. data/doc/features/support/env_rb.html +56 -0
  24. data/doc/file.README.html +60 -0
  25. data/doc/file_list.html +38 -0
  26. data/doc/frames.html +13 -0
  27. data/doc/index.html +60 -0
  28. data/doc/js/app.js +202 -0
  29. data/doc/js/full_list.js +149 -0
  30. data/doc/js/jquery.js +154 -0
  31. data/doc/lib/EasyLogger_version_rb.html +52 -0
  32. data/doc/lib/easy_logger/easy_logger_rb.html +52 -0
  33. data/doc/lib/easy_logger_rb.html +54 -0
  34. data/doc/method_list.html +43 -0
  35. data/doc/rdoc.css +706 -0
  36. data/doc/top-level-namespace.html +88 -0
  37. data/features/class_filtering.feature +79 -0
  38. data/features/class_method_filtering.feature +29 -0
  39. data/features/command_line.feature +25 -0
  40. data/features/method_filtering.feature +72 -0
  41. data/features/step_definitions/command_line_steps.rb +1 -0
  42. data/features/support/env.rb +14 -0
  43. data/html/EasyLogger.html +170 -0
  44. data/html/EasyLogger/EasyLogger.html +379 -0
  45. data/html/File.html +200 -0
  46. data/html/Logging.html +280 -0
  47. data/html/README_rdoc.html +212 -0
  48. data/html/bin/EasyLogger.html +64 -0
  49. data/html/created.rid +7 -0
  50. data/html/index.html +198 -0
  51. data/html/lib/EasyLogger_version_rb.html +52 -0
  52. data/html/lib/easy_logger/easy_logger_rb.html +54 -0
  53. data/html/lib/easy_logger/logging_example_rb.html +54 -0
  54. data/html/lib/easy_logger_rb.html +54 -0
  55. data/html/rdoc.css +706 -0
  56. data/lib/EasyLogger_version.rb +3 -0
  57. data/lib/easy_logger.rb +1 -0
  58. data/lib/easy_logger/easy_logger.rb +116 -0
  59. data/lib/easy_logger/logging_example.rb +46 -0
  60. data/spec/EasyLogger/easy_logger_spec.rb +63 -0
  61. data/spec/spec_helper.rb +22 -0
  62. metadata +132 -0
@@ -0,0 +1,3 @@
1
+ module EasyLogger
2
+ VERSION = '0.1.1'
3
+ end
@@ -0,0 +1 @@
1
+ require 'easy_logger/easy_logger'
@@ -0,0 +1,116 @@
1
+ require 'file/tail'
2
+ # @author Sylvain Desbureaux
3
+ module EasyLogger
4
+ # = Class EasyLogger which will do all the job of matching the lines and showing it
5
+ # @author Sylvain Desbureaux
6
+ #
7
+ # == Attributes
8
+ # @attr_reader [String] log the log file/stream that we'll look into
9
+ # @attr_reader [Array] classes the classes to match in the log
10
+ # @attr_reader [Array] methods the methods to match in the log
11
+ # @attr_reader [Boolean] verbose the verbosity of the output
12
+ # @attr_reader [String] separator the separator of the values in the log. it's "|" per default
13
+ #
14
+ # == Use
15
+ # There's two methods to use the class: file() and tail().
16
+ # Both of them use the same parameters (the attributes of the class).
17
+ # The log file need to be correctly formatted. the parser assumes that the log file has this format (with '|' as separator in the example):
18
+ # |some tag (example: the date and time)|some tag|...|class|method| free text
19
+ # The Separator could be at the end of the free text but never in the middle so choose it carefully!
20
+ # @see Logging a working logger example
21
+ #
22
+ # === File
23
+ # File will open the stream, parse and output the matching line and exit
24
+ #
25
+ # === Tail
26
+ # Tail will open the end of the stream and parse and output the matching line and exit
27
+
28
+ class EasyLogger
29
+
30
+ # Display the relevant line of the log matching the classes/methods
31
+ #
32
+ # @param [String] log the log file/stream that we'll look into
33
+ # @param [String] classes the classes to match in the log
34
+ # @param [String] methods the methods to match in the log
35
+ # @param [Boolean] verbose the verbosity of the output
36
+ # @param [String] separator the separator of the values in the log. it's "|" per default
37
+ def file(log, classes, methods, verbose, separator='|')
38
+ result = String.new
39
+ puts "Looking in #{log} I/O for line matching #{classes} classe(s) and #{methods} method(s) with separator '#{separator}'" if verbose && !classes.nil? && !methods.nil?
40
+ puts "Looking in #{log} I/O for line #{methods} method(s) with separator '#{separator}'" if verbose && classes.nil? && !methods.nil?
41
+ puts "Looking in #{log} I/O for line matching #{classes} classe(s) with separator '#{separator}'" if verbose && !classes.nil? && methods.nil?
42
+ puts "Looking in #{log} I/O for all lines" if verbose && classes.nil? && methods.nil?
43
+ classes =classes.split(',') unless classes.nil?
44
+ methods =methods.split(',') unless methods.nil?
45
+ classes.map!{|c| c.downcase} unless classes.nil?
46
+ methods.map!{|m| m.downcase} unless methods.nil?
47
+ line_number = 0
48
+ line_match = 0
49
+ IO.foreach(log) do |line|
50
+ line_number += 1
51
+ if match(line,classes,methods, separator)
52
+ puts line
53
+ line_match += 1
54
+ end
55
+
56
+ end
57
+ puts "#{line_match} lines matched on the #{line_number} lines in the log" if verbose
58
+ end
59
+
60
+ # Display the relevant <u>new</u> lines of the log matching the classes/methods
61
+ #
62
+ # @param (see EasyLogger#file)
63
+ def tail(log, classes, methods, verbose, separator='|')
64
+ result = String.new
65
+ puts "Tailing in #{log} I/O for line matching #{classes} classe(s) and #{methods} method(s) with separator '#{separator}'" if verbose && !classes.nil? && !methods.nil?
66
+ puts "Tailing in #{log} I/O for line #{methods} method(s) with separator '#{separator}'" if verbose && classes.nil? && !methods.nil?
67
+ puts "Tailing in #{log} I/O for line matching #{classes} classe(s) with separator '#{separator}'" if verbose && !classes.nil? && methods.nil?
68
+ puts "Tailing in #{log} I/O for all lines" if verbose && classes.nil? && methods.nil?
69
+ classes =classes.split(',') unless classes.nil?
70
+ methods =methods.split(',') unless methods.nil?
71
+ classes.map!{|c| c.downcase} unless classes.nil?
72
+ methods.map!{|m| m.downcase} unless methods.nil?
73
+ @line_number = 0
74
+ @line_match = 0
75
+ # interrupted = false
76
+ trap("INT") do
77
+ puts "#{@line_match} lines matched on the #{@line_number} lines in the log" if verbose
78
+ break
79
+ end
80
+ begin
81
+ File::Tail::Logfile.tail(log) do |line|
82
+ @line_number += 1
83
+ if match(line,classes,methods, separator)
84
+ puts line
85
+ @line_match += 1
86
+ end
87
+ # if interrupted
88
+ # break
89
+ # end
90
+ end
91
+ rescue
92
+ nil
93
+ end
94
+ end
95
+
96
+ # Verify if a line match the classes/method
97
+ #
98
+ # @private
99
+ # @param [String] line the line to match the regexp
100
+ # @param classes (see EasyLogger#file)
101
+ # @param methods (see EasyLogger#file)
102
+ # @param separator (see EasyLogger#file)
103
+ # @return [Boolean] True if the line is matched, false if not
104
+ @private
105
+ def match(line,classes,methods,separator)
106
+ unless line[0..-2].split(separator).length < 3
107
+ methode = line[0..-2].split(separator)[-2].strip.downcase
108
+ classe = line[0..-2].split(separator)[-3].strip.downcase
109
+
110
+ (classes.nil? || classes.include?(classe)) && (methods.nil? || methods.include?(methode))
111
+ else
112
+ false
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,46 @@
1
+ require 'logger'
2
+ # @author Sylvain Desbureaux
3
+ # Most of work grabbed from nuby on rails Hodel 3000 logger
4
+ # http://nubyonrails.com/articles/a-hodel-3000-compliant-logger-for-the-rest-of-us.
5
+ #
6
+ # I've added the way to retrieve the method which sent the log and the class via caller method.
7
+ #
8
+ # I've also taken care to take the next one in caller if the methode is lik each, block,...
9
+ #
10
+ # In your environmment file(s) (development.rb, test.rb,...) you'll need to add that in order to use this logger:
11
+ # @example
12
+ # require File.dirname(__FILE__) + "/../../app/models/logging"
13
+ # config.logger = Logging.new(config.paths.log.first )
14
+ #
15
+ # And you'll need to put this file (renammed logging.rb here) in app/models folder
16
+ class Logging < Logger
17
+ def format_message(severity, timestamp, progname, msg)
18
+ i = 2
19
+ methode = caller[i].split('`')[1].split("'")[0]
20
+ each_true = false
21
+ puts methode if methode == "each"
22
+ each_true = true if methode == ""
23
+ while methode == "debug" || methode == "info" || methode == "error" || methode.split(' ')[0] == "each"
24
+ i += 1
25
+ methode = caller[i].split('`')[1].split("'")[0]
26
+ puts methode if each_true
27
+ end
28
+ methode = methode.split(' ')[0] == "block" ? methode.split(' ')[-1].center(17) : methode.center(17)
29
+ objecte = caller[i].split(':')[0].split('/')[-1].split('.')[0].camelize.center(16)
30
+ "#{timestamp.strftime("%d %b %H:%M:%S")}|rails[#{$PID}]|#{severity.center(8)}|#{objecte}|#{methode}| #{msg2str(msg).gsub(/\n/, '').lstrip}\n"
31
+ end
32
+
33
+
34
+ def msg2str(msg)
35
+ case msg
36
+ when ::String
37
+ msg
38
+ when ::Exception
39
+ "#{ msg.message } (#{ msg.class }): " <<
40
+ (msg.backtrace || []).join(" | ")
41
+ else
42
+ msg.inspect
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), "..", "spec_helper")
3
+ require 'easy_logger'
4
+
5
+ describe EasyLogger do
6
+ before(:each) do
7
+ @easy_logger = EasyLogger::EasyLogger.new
8
+ end
9
+
10
+ it "should return true with match function when methodes and classes are nil" do
11
+ line = "{test{test{pouet{pouet"
12
+ @easy_logger.match(line,nil,nil,"{").should be_true
13
+ end
14
+
15
+ it "should return true with match function when the line match a class and methodes is nil" do
16
+ line = "RtestRtestRclasseRpouetRpouet"
17
+ line2 = "RtestRtestR classe RpouetRpouet"
18
+ @easy_logger.match(line,["classe","autre_classe"],nil,"R").should be_true
19
+ @easy_logger.match(line2,["classe","autre_classe"],nil,"R").should be_true
20
+ end
21
+
22
+ it "should return true with match function when the line match a method and classes is nil" do
23
+ line = "RtestRtestRclasseRMethodeRpouet"
24
+ line2 = "RtestRtestRclasseR Methode Rpouet"
25
+ @easy_logger.match(line,nil,["methode", "autre_methode"],"R").should be_true
26
+ @easy_logger.match(line2,nil,["methode", "autre_methode"],"R").should be_true
27
+ end
28
+
29
+ it "should return true with match function when the line match a class and a method" do
30
+ line = "RtestRtestRclasseRMethodeRpouet"
31
+ line2 = "RtestRtestR classe R Methode Rpouet"
32
+ @easy_logger.match(line,["classe","autre_classe"],["methode", "autre_methode"],"R").should be_true
33
+ @easy_logger.match(line2,["classe","autre_classe"],["methode", "autre_methode"],"R").should be_true
34
+ end
35
+
36
+ it "should return true with match function when the line match a class and a method with a separator at the end of the line" do
37
+ line = "RtestRtestRclasseRMethodeRpouetR"
38
+ line2 = "RtestRtestR classe R Methode RpouetR"
39
+ @easy_logger.match(line,["classe","autre_classe"],["methode", "autre_methode"],"R").should be_true
40
+ @easy_logger.match(line2,["classe","autre_classe"],["methode", "autre_methode"],"R").should be_true
41
+ end
42
+
43
+ it "should return false with match function when the line match a class but not a method" do
44
+ line = "RtestRtestRclasseRMethodeRpouetR"
45
+ line2 = "RtestRtestR classe R Methode RpouetR"
46
+ @easy_logger.match(line,["classe","autre_classe"],["methodes", "autre_methode"],"R").should be_false
47
+ @easy_logger.match(line2,["classe","autre_classe"],["methodes", "autre_methode"],"R").should be_false
48
+ end
49
+
50
+ it "should return false with match function when the line match a method but not a class" do
51
+ line = "RtestRtestRclasseRMethodeRpouetR"
52
+ line2 = "RtestRtestR classe R Methode RpouetR"
53
+ @easy_logger.match(line,["classes","autre_classe"],["methode", "autre_methode"],"R").should be_false
54
+ @easy_logger.match(line2,["classes","autre_classe"],["methode", "autre_methode"],"R").should be_false
55
+ end
56
+
57
+ it "should return false if the separator is not found in the line" do
58
+ line ="13456"
59
+ @easy_logger.match(line,["classes","autre_classe"],["methode", "autre_methode"],"R").should be_false
60
+ end
61
+
62
+ end
63
+
@@ -0,0 +1,22 @@
1
+ #require 'cover_me'
2
+ #require File.join(File.expand_path(File.dirname(__FILE__)), "..", "coverage", "cover_me_config")
3
+ require 'rspec'
4
+
5
+ Rspec.configure do |config|
6
+ # == Mock Framework
7
+ #
8
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
9
+ #
10
+ # config.mock_with :mocha
11
+ # config.mock_with :flexmock
12
+ # config.mock_with :r
13
+ config.expect_with :rspec
14
+ config.mock_with :rspec
15
+
16
+ #config.fixture_path = "#{::Rails.root}/spec/fixtures"
17
+
18
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
19
+ # examples within a transaction, comment the following line or assign false
20
+ # instead of true.
21
+ #config.use_transactional_fixtures = false
22
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: EasyLogger
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
+ platform: ruby
11
+ authors:
12
+ - Sylvain Desbureaux
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-16 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: |-
22
+ EasyLogger permit to filter in lines in logs, allowing to
23
+ view only the inputs you want based on Class or Method
24
+ email:
25
+ - sylvain@desbureaux.fr
26
+ executables:
27
+ - EasyLogger
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - README.rdoc
32
+ - EasyLogger.rdoc
33
+ files:
34
+ - .gitignore
35
+ - EasyLogger.gemspec
36
+ - EasyLogger.rdoc
37
+ - Gemfile
38
+ - README.rdoc
39
+ - Rakefile
40
+ - bin/EasyLogger
41
+ - doc/ArubaOverrides.html
42
+ - doc/EasyLogger.html
43
+ - doc/EasyLogger/EasyLogger.html
44
+ - doc/EasyLogger_rdoc.html
45
+ - doc/File.html
46
+ - doc/Gemfile.html
47
+ - doc/README_rdoc.html
48
+ - doc/Rakefile.html
49
+ - doc/_index.html
50
+ - doc/bin/EasyLogger.html
51
+ - doc/class_list.html
52
+ - doc/created.rid
53
+ - doc/css/common.css
54
+ - doc/css/full_list.css
55
+ - doc/css/style.css
56
+ - doc/features/support/env_rb.html
57
+ - doc/file.README.html
58
+ - doc/file_list.html
59
+ - doc/frames.html
60
+ - doc/index.html
61
+ - doc/js/app.js
62
+ - doc/js/full_list.js
63
+ - doc/js/jquery.js
64
+ - doc/lib/EasyLogger_version_rb.html
65
+ - doc/lib/easy_logger/easy_logger_rb.html
66
+ - doc/lib/easy_logger_rb.html
67
+ - doc/method_list.html
68
+ - doc/rdoc.css
69
+ - doc/top-level-namespace.html
70
+ - features/class_filtering.feature
71
+ - features/class_method_filtering.feature
72
+ - features/command_line.feature
73
+ - features/method_filtering.feature
74
+ - features/step_definitions/command_line_steps.rb
75
+ - features/support/env.rb
76
+ - html/EasyLogger.html
77
+ - html/EasyLogger/EasyLogger.html
78
+ - html/File.html
79
+ - html/Logging.html
80
+ - html/README_rdoc.html
81
+ - html/bin/EasyLogger.html
82
+ - html/created.rid
83
+ - html/index.html
84
+ - html/lib/EasyLogger_version_rb.html
85
+ - html/lib/easy_logger/easy_logger_rb.html
86
+ - html/lib/easy_logger/logging_example_rb.html
87
+ - html/lib/easy_logger_rb.html
88
+ - html/rdoc.css
89
+ - lib/EasyLogger_version.rb
90
+ - lib/easy_logger.rb
91
+ - lib/easy_logger/easy_logger.rb
92
+ - lib/easy_logger/logging_example.rb
93
+ - spec/EasyLogger/easy_logger_spec.rb
94
+ - spec/spec_helper.rb
95
+ has_rdoc: true
96
+ homepage: ""
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options:
101
+ - --title
102
+ - EasyLogger
103
+ - --main
104
+ - README.rdoc
105
+ - -ri
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ requirements: []
125
+
126
+ rubyforge_project: EasyLogger
127
+ rubygems_version: 1.3.7
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: EasyLogger permit to filter in lines in logs
131
+ test_files: []
132
+