mtn_log4r 1.1.11

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 (106) hide show
  1. checksums.yaml +15 -0
  2. data/doc/content/contact.html +22 -0
  3. data/doc/content/contribute.html +21 -0
  4. data/doc/content/index.html +90 -0
  5. data/doc/content/license.html +56 -0
  6. data/doc/content/manual.html +449 -0
  7. data/doc/dev/README.developers +55 -0
  8. data/doc/dev/checklist +23 -0
  9. data/doc/dev/things-to-do +5 -0
  10. data/doc/images/log4r-logo.png +0 -0
  11. data/doc/images/logo2.png +0 -0
  12. data/doc/log4r.css +111 -0
  13. data/doc/rdoc-log4r.css +696 -0
  14. data/doc/templates/main.html +147 -0
  15. data/examples/README +19 -0
  16. data/examples/ancestors.rb +53 -0
  17. data/examples/chainsaw_settings.xml +7 -0
  18. data/examples/customlevels.rb +34 -0
  19. data/examples/filelog.rb +25 -0
  20. data/examples/fileroll.rb +40 -0
  21. data/examples/gmail.rb +30 -0
  22. data/examples/gmail.yaml +95 -0
  23. data/examples/log4r_yaml.yaml +0 -0
  24. data/examples/logclient.rb +25 -0
  25. data/examples/logserver.rb +18 -0
  26. data/examples/moderate.xml +29 -0
  27. data/examples/moderateconfig.rb +66 -0
  28. data/examples/myformatter.rb +23 -0
  29. data/examples/outofthebox.rb +21 -0
  30. data/examples/rdoc-gen +2 -0
  31. data/examples/rrconfig.xml +63 -0
  32. data/examples/rrsetup.rb +42 -0
  33. data/examples/simpleconfig.rb +39 -0
  34. data/examples/syslogcustom.rb +52 -0
  35. data/examples/xmlconfig.rb +25 -0
  36. data/examples/yaml.rb +30 -0
  37. data/lib/log4r/GDC.rb +41 -0
  38. data/lib/log4r/MDC.rb +59 -0
  39. data/lib/log4r/NDC.rb +86 -0
  40. data/lib/log4r/base.rb +74 -0
  41. data/lib/log4r/config.rb +9 -0
  42. data/lib/log4r/configurator.rb +224 -0
  43. data/lib/log4r/formatter/formatter.rb +109 -0
  44. data/lib/log4r/formatter/log4jxmlformatter.rb +65 -0
  45. data/lib/log4r/formatter/patternformatter.rb +145 -0
  46. data/lib/log4r/lib/drbloader.rb +52 -0
  47. data/lib/log4r/lib/xmlloader.rb +24 -0
  48. data/lib/log4r/logevent.rb +28 -0
  49. data/lib/log4r/logger.rb +199 -0
  50. data/lib/log4r/loggerfactory.rb +89 -0
  51. data/lib/log4r/logserver.rb +28 -0
  52. data/lib/log4r/outputter/consoleoutputters.rb +18 -0
  53. data/lib/log4r/outputter/datefileoutputter.rb +117 -0
  54. data/lib/log4r/outputter/emailoutputter.rb +143 -0
  55. data/lib/log4r/outputter/fileoutputter.rb +56 -0
  56. data/lib/log4r/outputter/iooutputter.rb +55 -0
  57. data/lib/log4r/outputter/outputter.rb +134 -0
  58. data/lib/log4r/outputter/outputterfactory.rb +61 -0
  59. data/lib/log4r/outputter/rabbitoutputter.rb +70 -0
  60. data/lib/log4r/outputter/remoteoutputter.rb +40 -0
  61. data/lib/log4r/outputter/rollingfileoutputter.rb +234 -0
  62. data/lib/log4r/outputter/scribeoutputter.rb +37 -0
  63. data/lib/log4r/outputter/staticoutputter.rb +30 -0
  64. data/lib/log4r/outputter/syslogoutputter.rb +130 -0
  65. data/lib/log4r/outputter/udpoutputter.rb +53 -0
  66. data/lib/log4r/rdoc/GDC +14 -0
  67. data/lib/log4r/rdoc/MDC +16 -0
  68. data/lib/log4r/rdoc/NDC +41 -0
  69. data/lib/log4r/rdoc/configurator +243 -0
  70. data/lib/log4r/rdoc/emailoutputter +103 -0
  71. data/lib/log4r/rdoc/formatter +39 -0
  72. data/lib/log4r/rdoc/log4jxmlformatter +21 -0
  73. data/lib/log4r/rdoc/log4r +89 -0
  74. data/lib/log4r/rdoc/logger +175 -0
  75. data/lib/log4r/rdoc/logserver +85 -0
  76. data/lib/log4r/rdoc/outputter +108 -0
  77. data/lib/log4r/rdoc/patternformatter +128 -0
  78. data/lib/log4r/rdoc/scribeoutputter +16 -0
  79. data/lib/log4r/rdoc/syslogoutputter +29 -0
  80. data/lib/log4r/rdoc/win32eventoutputter +7 -0
  81. data/lib/log4r/rdoc/yamlconfigurator +20 -0
  82. data/lib/log4r/repository.rb +88 -0
  83. data/lib/log4r/staticlogger.rb +49 -0
  84. data/lib/log4r/version.rb +4 -0
  85. data/lib/log4r/yamlconfigurator.rb +198 -0
  86. data/lib/log4r.rb +18 -0
  87. data/tests/README +10 -0
  88. data/tests/testGDC.rb +24 -0
  89. data/tests/testMDC.rb +40 -0
  90. data/tests/testNDC.rb +25 -0
  91. data/tests/test_helper.rb +12 -0
  92. data/tests/testall.rb +6 -0
  93. data/tests/testbase.rb +48 -0
  94. data/tests/testchainsaw.rb +42 -0
  95. data/tests/testconf.xml +37 -0
  96. data/tests/testcustom.rb +30 -0
  97. data/tests/testformatter.rb +31 -0
  98. data/tests/testlogger.rb +200 -0
  99. data/tests/testoutputter.rb +143 -0
  100. data/tests/testpatternformatter.rb +76 -0
  101. data/tests/testthreads.rb +31 -0
  102. data/tests/testxmlconf.rb +48 -0
  103. data/tests/testyaml.rb +39 -0
  104. data/tests/testyaml_arrays.yaml +25 -0
  105. data/tests/testyaml_injection.yaml +22 -0
  106. metadata +193 -0
@@ -0,0 +1,88 @@
1
+ # :nodoc:
2
+ # Version:: $Id$
3
+ #
4
+ # Using Thread.exclusive seems to be more efficient than using
5
+ # a class wide instance of Sync.synchronize in ruby 1.8.6 - Colby
6
+ #
7
+ # Using Sync.synchronize, 5000 iterations:
8
+ # real 3m55.493s user 3m45.557s sys 0m3.478s
9
+ #
10
+ # Using Thread.exclusive, 5000 iterations:
11
+ # real 2m35.859s user 2m33.951s sys 0m1.224s
12
+ #
13
+
14
+ require 'monitor'
15
+ require "singleton"
16
+
17
+ module Log4r
18
+ class Logger
19
+
20
+ # The repository stores a Hash of loggers keyed to their fullnames and
21
+ # provides a few functions to reduce the code bloat in log4r/logger.rb.
22
+ # This class is supposed to be transparent to end users, hence it is
23
+ # a class within Logger. If anyone knows how to make this private,
24
+ # let me know.
25
+
26
+ class Repository # :nodoc:
27
+ extend MonitorMixin
28
+ include Singleton
29
+ attr_reader :loggers
30
+
31
+ def initialize
32
+ @loggers = Hash.new
33
+ end
34
+
35
+ def self.[](fullname)
36
+ self.synchronize do
37
+ instance.loggers[fullname]
38
+ end # exclusive
39
+ end
40
+
41
+ def self.[]=(fullname, logger)
42
+ self.synchronize do
43
+ instance.loggers[fullname] = logger
44
+ end # exclusive
45
+ end
46
+
47
+ # Retrieves all children of a parent
48
+ def self.all_children(parent)
49
+ # children have the parent name + delimiter in their fullname
50
+ daddy = parent.name + Private::Config::LoggerPathDelimiter
51
+ self.synchronize do
52
+ for fullname, logger in instance.loggers
53
+ yield logger if parent.is_root? || fullname =~ /#{daddy}/
54
+ end
55
+ end # exclusive
56
+ end
57
+
58
+ # when new loggers are introduced, they may get inserted into
59
+ # an existing inheritance tree. this method
60
+ # updates the children of a logger to link their new parent
61
+ def self.reassign_any_children(parent)
62
+ self.synchronize do
63
+ for fullname, logger in instance.loggers
64
+ next if logger.is_root?
65
+ logger.parent = parent if logger.path =~ /^#{parent.fullname}$/
66
+ end
67
+ end # exclusive
68
+ end
69
+
70
+ # looks for the first defined logger in a child's path
71
+ # or nil if none found (which will then be rootlogger)
72
+ def self.find_ancestor(path)
73
+ arr = path.split Log4rConfig::LoggerPathDelimiter
74
+ logger = nil
75
+ self.synchronize do
76
+ while arr.size > 0 do
77
+ logger = Repository[arr.join(Log4rConfig::LoggerPathDelimiter)]
78
+ break unless logger.nil?
79
+ arr.pop
80
+ end
81
+ end # exclusive
82
+ logger
83
+ end
84
+
85
+ end # class Repository
86
+ end # class Logger
87
+ end # Module Log4r
88
+
@@ -0,0 +1,49 @@
1
+ # :nodoc:
2
+ module Log4r
3
+ class Logger
4
+ # Returns the root logger. Identical to Logger.global
5
+ def self.root; return RootLogger.instance end
6
+ # Returns the root logger. Identical to Logger.root
7
+ def self.global; return root end
8
+
9
+ # Get a logger with a fullname from the repository or nil if logger
10
+ # wasn't found.
11
+
12
+ def self.[](_fullname)
13
+ # forces creation of RootLogger if it doesn't exist yet.
14
+ return RootLogger.instance if _fullname=='root' or _fullname=='global'
15
+ Repository[_fullname]
16
+ end
17
+
18
+ # Like Logger[] except that it raises NameError if Logger wasn't found.
19
+
20
+ def self.get(_fullname)
21
+ logger = self[_fullname]
22
+ if logger.nil?
23
+ raise NameError, "Logger '#{_fullname}' not found.", caller
24
+ end
25
+ logger
26
+ end
27
+
28
+ # Yields fullname and logger for every logger in the system.
29
+ def self.each
30
+ for fullname, logger in Repository.instance.loggers
31
+ yield fullname, logger
32
+ end
33
+ end
34
+
35
+ def self.each_logger
36
+ Repository.instance.loggers.each_value {|logger| yield logger}
37
+ end
38
+
39
+ # Internal logging for Log4r components. Accepts only blocks.
40
+ # To see such log events, create a logger named 'log4r' and give
41
+ # it an outputter.
42
+
43
+ def self.log_internal(level=1)
44
+ internal = Logger['log4r']
45
+ return if internal.nil?
46
+ internal.send(LNAMES[level].downcase, yield)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,4 @@
1
+ module Log4r
2
+ Log4rVersion = [1, 1, 11].join '.' # deprecate?
3
+ VERSION = Log4rVersion
4
+ end
@@ -0,0 +1,198 @@
1
+ # :include: rdoc/yamlconfigurator
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Version: $Id$
6
+
7
+ require "log4r/logger"
8
+ require "log4r/outputter/staticoutputter"
9
+ require "log4r/logserver"
10
+ require "log4r/outputter/remoteoutputter"
11
+
12
+ require 'yaml'
13
+
14
+ module Log4r
15
+ # Gets raised when Configurator encounters bad YAML.
16
+ class ConfigError < Exception
17
+ end
18
+
19
+ # See log4r/yamlconfigurator.rb
20
+ class YamlConfigurator
21
+ @@params = Hash.new
22
+
23
+ # Get a parameter's value
24
+ def self.[](param); @@params[param] end
25
+ # Define a parameter with a value
26
+ def self.[]=(param, value); @@params[param] = value end
27
+
28
+
29
+ def self.custom_levels( levels)
30
+ return Logger.root if levels.size == 0
31
+ for i in 0...levels.size
32
+ name = levels[i].to_s
33
+ if name =~ /\s/ or name !~ /^[A-Z]/
34
+ raise TypeError, "#{name} is not a valid Ruby Constant name", caller
35
+ end
36
+ end
37
+ Log4r.define_levels *levels
38
+ end
39
+
40
+ # Given a filename, loads the YAML configuration for Log4r.
41
+ def self.load_yaml_file( filename)
42
+ actual_load( File.open( filename))
43
+ end
44
+
45
+ # You can load a String YAML configuration instead of a file.
46
+ def self.load_yaml_string( string)
47
+ actual_load( string)
48
+ end
49
+
50
+ #######
51
+ private
52
+ #######
53
+
54
+ def self.actual_load( yaml_docs)
55
+ log4r_config = nil
56
+ YAML.load_documents( yaml_docs){ |doc|
57
+ doc.has_key?( 'log4r_config') and log4r_config = doc['log4r_config'] and break
58
+ }
59
+ if log4r_config.nil?
60
+ raise ConfigError,
61
+ "Key 'log4r_config:' not defined in yaml documents", caller[1..-1]
62
+ end
63
+ decode_yaml( log4r_config)
64
+ end
65
+
66
+ def self.decode_yaml( cfg)
67
+ decode_pre_config( cfg['pre_config'])
68
+ cfg['outputters'].each{ |op| decode_outputter( op)}
69
+ cfg['loggers'].each{ |lo| decode_logger( lo)}
70
+ cfg['logserver'].each{ |lo| decode_logserver( lo)} unless cfg['logserver'].nil?
71
+ end
72
+
73
+ def self.decode_pre_config( pre)
74
+ return Logger.root if pre.nil?
75
+ decode_custom_levels( pre['custom_levels'])
76
+ global_config( pre['global'])
77
+ global_config( pre['root'])
78
+ decode_parameters( pre['parameters'])
79
+ end
80
+
81
+ def self.decode_custom_levels( levels)
82
+ return Logger.root if levels.nil?
83
+ begin custom_levels( levels)
84
+ rescue TypeError => te
85
+ raise ConfigError, te.message, caller[1..-4]
86
+ end
87
+ end
88
+
89
+ def self.global_config( e)
90
+ return if e.nil?
91
+ globlev = e['level']
92
+ return if globlev.nil?
93
+ lev = LNAMES.index(globlev) # find value in LNAMES
94
+ Log4rTools.validate_level(lev, 4) # choke on bad level
95
+ Logger.global.level = lev
96
+ end
97
+
98
+ def self.decode_parameters( params)
99
+ params.each{ |p| @@params[p['name']] = p['value']} unless params.nil?
100
+ end
101
+
102
+ def self.decode_outputter( op)
103
+ # fields
104
+ name = op['name']
105
+ type = op['type']
106
+ level = op['level']
107
+ only_at = op['only_at']
108
+ # validation
109
+ raise ConfigError, "Outputter missing name", caller[1..-3] if name.nil?
110
+ raise ConfigError, "Outputter missing type", caller[1..-3] if type.nil?
111
+ Log4rTools.validate_level(LNAMES.index(level)) unless level.nil?
112
+ only_levels = []
113
+ unless only_at.nil?
114
+ for lev in only_at
115
+ alev = LNAMES.index(lev)
116
+ Log4rTools.validate_level(alev, 3)
117
+ only_levels.push alev
118
+ end
119
+ end
120
+
121
+ formatter = decode_formatter( op['formatter'])
122
+
123
+ opts = {}
124
+ opts[:level] = LNAMES.index(level) unless level.nil?
125
+ opts[:formatter] = formatter unless formatter.nil?
126
+ opts.merge!(decode_hash_params(op))
127
+ begin
128
+ Outputter[name] = Log4r.const_get(type).new name, opts
129
+ rescue Exception => ae
130
+ raise ConfigError,
131
+ "Problem creating outputter: #{ae.message}", caller[1..-3]
132
+ end
133
+ Outputter[name].only_at( *only_levels) if only_levels.size > 0
134
+ Outputter[name]
135
+ end
136
+
137
+ def self.decode_formatter( fo)
138
+ return nil if fo.nil?
139
+ type = fo['type']
140
+ raise ConfigError, "Formatter missing type", caller[1..-4] if type.nil?
141
+ begin
142
+ return Log4r.const_get(type).new(decode_hash_params(fo))
143
+ rescue Exception => ae
144
+ raise ConfigError,
145
+ "Problem creating outputter: #{ae.message}", caller[1..-4]
146
+ end
147
+ end
148
+
149
+ ExcludeParams = %w{formatter level name type only_at}
150
+
151
+ # Does the fancy parameter to hash argument transformation
152
+ def self.decode_hash_params(ph)
153
+ case ph
154
+ when Hash
155
+ ph.inject({}){|a,(k,v)| a[k] = self.decode_hash_params(v); a}
156
+ when Array
157
+ ph.map{|v| self.decode_hash_params(v)}
158
+ when String
159
+ self.paramsub(ph)
160
+ else
161
+ ph
162
+ end
163
+ end
164
+
165
+ # Substitues any #{foo} in the YAML with Parameter['foo']
166
+ def self.paramsub(str)
167
+ @@params.each {|param, value|
168
+ str = str.sub("\#{#{param}}", value)
169
+ }
170
+ str
171
+ end
172
+
173
+ def self.decode_logger( lo)
174
+ l = Logger.new lo['name']
175
+ decode_logger_common( l, lo)
176
+ end
177
+
178
+ def self.decode_logserver( lo)
179
+ name = lo['name']
180
+ uri = lo['uri']
181
+ l = LogServer.new name, uri
182
+ decode_logger_common(l, lo)
183
+ end
184
+
185
+ def self.decode_logger_common( l, lo)
186
+ level = lo['level']
187
+ additive = lo['additive']
188
+ trace = lo['trace']
189
+ l.level = LNAMES.index( level) unless level.nil?
190
+ l.additive = additive unless additive.nil?
191
+ l.trace = trace unless trace.nil?
192
+ # and now for outputters
193
+ outs = lo['outputters']
194
+ outs.each {|n| l.add n.strip} unless outs.nil?
195
+ end
196
+ end
197
+ end
198
+
data/lib/log4r.rb ADDED
@@ -0,0 +1,18 @@
1
+ # :include: log4r/rdoc/log4r
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Author:: Leon Torres
6
+ # Version:: $Id$
7
+
8
+ require 'log4r/version'
9
+ require "log4r/outputter/fileoutputter"
10
+ require "log4r/outputter/consoleoutputters"
11
+ require "log4r/outputter/staticoutputter"
12
+ require "log4r/outputter/rabbitoutputter"
13
+ require "log4r/outputter/rollingfileoutputter"
14
+ require "log4r/formatter/patternformatter"
15
+ require "log4r/loggerfactory"
16
+ require "log4r/GDC"
17
+ require "log4r/NDC"
18
+ require "log4r/MDC"
data/tests/README ADDED
@@ -0,0 +1,10 @@
1
+ The unit tests are currently out of date. The examples actually provide
2
+ a decent test suite for log4r. But the unit tests are still very important
3
+ because of bounds-checking and a quicker turnaround for bug discovery.
4
+ The unit files need to be converted to the new 'test/unit' paradigm.
5
+
6
+ Because Log4r dynamically defines constants according to user preferences,
7
+ the unit testing can't all be done in one instance of ruby. It is planned
8
+ to use popen to run each test that needs a clean ruby instance.
9
+
10
+ The logs/ directory is where these tests dump generated log files.
data/tests/testGDC.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class TestGDC < TestCase
4
+ include Log4r
5
+
6
+ def test_gdc_default
7
+ assert(GDC.get() == "testGDC.rb", "Expected 'testGDC.rb' got '#{GDC.get()}'" )
8
+ end
9
+
10
+ def test_gdc_set
11
+ assert_nothing_raised() { GDC.set("testGDCset") }
12
+ assert(GDC.get() == "testGDCset", "Expected 'testGDCset' got '#{GDC.get()}'" )
13
+ end
14
+
15
+ def test_gdc_threaded
16
+ assert_nothing_raised() { GDC.set("testGDCset") }
17
+ t = Thread.new("test GDC thread") do |name|
18
+ assert_raise(RuntimeError) { GDC.set("somethingelse") }
19
+ end
20
+ t.join
21
+ assert(GDC.get() == "testGDCset", "Expected 'testGDCset' got '#{GDC.get()}'" )
22
+ end
23
+
24
+ end
data/tests/testMDC.rb ADDED
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class TestMDC < TestCase
4
+ include Log4r
5
+
6
+ def test_multithread_copy
7
+ Log4r::MDC.put("user","colbygk")
8
+ t = Thread.new("test first copy") do |name|
9
+ assert(Log4r::MDC.get("user") == "colbygk",
10
+ "Did not get back expected value, '#{MDC.get("user")}'")
11
+ Log4r::MDC.put("user","unique")
12
+ assert(Log4r::MDC.get("user") == "unique",
13
+ "Did not get back expected value, '#{MDC.get("user")}'")
14
+ end
15
+ t.join
16
+ assert(Log4r::MDC.get("user") == "colbygk",
17
+ "Did not get back expected value, '#{MDC.get("user")}'")
18
+ end
19
+
20
+ def test_MDCoutput
21
+ Log4r::MDC.put(:user, "symbol")
22
+ Log4r::MDC.put("string", "string")
23
+ Log4r::MDC.put(5, "number")
24
+ l = Logger.new 'test'
25
+ o = StdoutOutputter.new 'test'
26
+ l.add o
27
+ assert_nothing_raised {
28
+ f = PatternFormatter.new :pattern=> "%l user: %X{:user} %X{strng} %X{5}"
29
+ Outputter['test'].formatter = f
30
+ l.debug "And this?"
31
+ l.info "How's this?"
32
+ l.error "and a really freaking huge line which we hope will be trimmed?"
33
+ e = ArgumentError.new("something barfed")
34
+ e.set_backtrace Array.new(5, "trace junk at thisfile.rb 154")
35
+ l.fatal e
36
+ l.info [1, 3, 5]
37
+ }
38
+
39
+ end
40
+ end
data/tests/testNDC.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class TestNDC < TestCase
4
+ include Log4r
5
+
6
+ def test_ndc_remove_push
7
+ NDC.remove()
8
+ NDC.push("ndc")
9
+ assert(Log4r::NDC.get() == "ndc", "Expected 'ndc' got '#{NDC.get()}'" )
10
+ NDC.push("ndc")
11
+ assert(Log4r::NDC.get() == "ndc ndc", "Expected 'ndc ndc' got '#{NDC.get()}'" )
12
+ end
13
+
14
+ def test_ndc_remove_push_clone_and_inherit
15
+ NDC.remove()
16
+ NDC.push("ndc")
17
+ NDC.push("ndc")
18
+ a = NDC.clone_stack()
19
+ NDC.remove()
20
+ assert(NDC.get() == "", "Expected '' got '#{NDC.get()}'" )
21
+ NDC.inherit(a)
22
+ assert(NDC.get() == "ndc ndc", "Expected 'ndc ndc' got '#{NDC.get()}'" )
23
+ end
24
+
25
+ end
@@ -0,0 +1,12 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require "test/unit"
4
+ require 'log4r'
5
+ require 'log4r/configurator'
6
+ require 'log4r/staticlogger'
7
+ require 'log4r/formatter/log4jxmlformatter'
8
+ require 'log4r/outputter/udpoutputter'
9
+ require 'log4r/outputter/consoleoutputters'
10
+ require 'log4r/yamlconfigurator'
11
+
12
+ include Test::Unit
data/tests/testall.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ # because constants are dynamically defined, some tests need to
4
+ # be opened in a fresh instance of Ruby, hence the popens
5
+
6
+ IO.popen("date") { |f| puts f.gets }
data/tests/testbase.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ class TestBase < TestCase
4
+ include Log4r
5
+
6
+ # check that LNAMES loads properly (it uses an eval to load)
7
+ def test_default_levels
8
+ Logger.root # doing this loads the default levels
9
+ assert_equal(ALL,0)
10
+ assert_equal(DEBUG,1)
11
+ assert_equal(INFO,2)
12
+ assert_equal(WARN,3)
13
+ assert_equal(ERROR,4)
14
+ assert_equal(FATAL,5)
15
+ assert_equal(OFF,6)
16
+ assert_equal(LEVELS, 7)
17
+ assert_equal(LNAMES.size, 7)
18
+ end
19
+ # check bad input and bounds for validate_level
20
+ def test_validate_level
21
+ 7.times{|i| assert_nothing_raised {Log4rTools.validate_level(i)} }
22
+ assert_raise(ArgumentError) {Log4rTools.validate_level(-1)}
23
+ assert_raise(ArgumentError) {Log4rTools.validate_level(LEVELS)}
24
+ assert_raise(ArgumentError) {Log4rTools.validate_level(String)}
25
+ assert_raise(ArgumentError) {Log4rTools.validate_level("bogus")}
26
+ end
27
+ # decode_bool turns a string 'true' into true and so on
28
+ def test_decode_bool
29
+ # when the key is a symbol :data
30
+ assert(Log4rTools.decode_bool({:data=> 'true'} ,:data,false) == true)
31
+ assert(Log4rTools.decode_bool({:data=> true} ,:data,false) == true)
32
+ assert(Log4rTools.decode_bool({:data=> 'false'} ,:data,true) == false)
33
+ assert(Log4rTools.decode_bool({:data=> false} ,:data,true) == false)
34
+ assert(Log4rTools.decode_bool({:data=> nil} ,:data,true) == true)
35
+ assert(Log4rTools.decode_bool({:data=> nil} ,:data,false) == false)
36
+ assert(Log4rTools.decode_bool({:data=> String} ,:data,true) == true)
37
+ assert(Log4rTools.decode_bool({:data=> String} ,:data,false) == false)
38
+ # now the key is a string 'data'
39
+ assert(Log4rTools.decode_bool({'data'=> 'true'} ,:data,false) == true)
40
+ assert(Log4rTools.decode_bool({'data'=> true} ,:data,false) == true)
41
+ assert(Log4rTools.decode_bool({'data'=> 'false'} ,:data,true) == false)
42
+ assert(Log4rTools.decode_bool({'data'=> false} ,:data,true) == false)
43
+ assert(Log4rTools.decode_bool({'data'=> nil} ,:data,true) == true)
44
+ assert(Log4rTools.decode_bool({'data'=> nil} ,:data,false) == false)
45
+ assert(Log4rTools.decode_bool({'data'=> String} ,:data,true) == true)
46
+ assert(Log4rTools.decode_bool({'data'=> String} ,:data,false) == false)
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ include Log4r
4
+
5
+ log4r = Logger.new 'log4r'
6
+ log4r.trace = true
7
+ log4r.outputters = StdoutOutputter.new 'log4r'
8
+ log4r.level = ALL
9
+
10
+ formatter = Log4jXmlFormatter.new
11
+ outputter = UDPOutputter.new 'udp', :hostname => "localhost", :port => 8071
12
+ outputter.formatter = formatter
13
+
14
+ mylog = Logger.new 'mylog'
15
+ mylog.trace = true
16
+ mylog.outputters = [outputter]
17
+
18
+ # Log4r::Formatter throws when formatting
19
+ # an excpetion with a nil backtrace (line 73).
20
+ def get_exception(msg)
21
+ begin
22
+ raise msg
23
+ rescue Exception => e
24
+ e
25
+ end
26
+ end
27
+
28
+ NDC.push "saw test"
29
+
30
+ MDC.put "clientip", %q{10.33.33.33}
31
+
32
+ def do_log(log)
33
+ log.debug "This is a message with level DEBUG"
34
+ log.info "This is a message with level INFO"
35
+ log.warn "This is a message with level WARN"
36
+ log.error "This is a message with level ERROR"
37
+ log.fatal "This is a message with level FATAL"
38
+
39
+ log.fatal get_exception( "This is an exception" )
40
+ end
41
+
42
+ do_log(mylog)
@@ -0,0 +1,37 @@
1
+ <test>
2
+ <log4r_config>
3
+
4
+ <pre_config>
5
+ <custom_levels>Foo, Bar,Baz, Bing</custom_levels>
6
+ <global level="Foo"/>
7
+ <parameters>
8
+ <mypattern>[%l] %d %t - %m</mypattern>
9
+ </parameters>
10
+ <parameter name="datem" value="usec"/>
11
+ </pre_config>
12
+
13
+ <!-- level and formatter are optional, -->
14
+ <outputter name="SO" type="StdoutOutputter">
15
+ <level>Foo</level>
16
+ <formatter type="Log4r::PatternFormatter">
17
+ <pattern>%d %c %l&gt; %m</pattern>
18
+ <date_method>#{datem}</date_method>
19
+ </formatter>
20
+ </outputter>
21
+ <outputter name="SE" type="StderrOutputter" level="Baz">
22
+ <formatter type="PatternFormatter" pattern="#{mypattern}">
23
+ <date_pattern>%H:%S</date_pattern>
24
+ </formatter>
25
+ </outputter>
26
+ <outputter name="F" type="FileOutputter">
27
+ <filename>#{logpath}/junk/foo.log</filename>
28
+ <trunc>true</trunc>
29
+ <only_at>Foo, Bar, Bing</only_at>
30
+ </outputter>
31
+ <!-- optional level, additive and outputters -->
32
+ <logger name="first::second" level="Bar" additive="false">
33
+ <trace>true</trace>
34
+ <outputters>SO, SE, F, stdout, stderr</outputters>
35
+ </logger>
36
+ </log4r_config>
37
+ </test>
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ # tests the customization of Log4r levels
4
+ class TestCustom < TestCase
5
+ include Log4r
6
+
7
+ def test_validation
8
+ assert_raise(TypeError) { Configurator.custom_levels "lowercase" }
9
+ assert_raise(TypeError) { Configurator.custom_levels "With space" }
10
+ end
11
+
12
+ def test_create
13
+ assert_nothing_raised { Configurator.custom_levels "Foo", "Bar", "Baz" }
14
+ assert_nothing_raised { Configurator.custom_levels }
15
+ assert_nothing_raised { Configurator.custom_levels "Bogus", "Levels" }
16
+ end
17
+ # def test_methods
18
+ # l = Logger.new 'custom1'
19
+ # assert_respond_to(l, :foo)
20
+ # assert_respond_to(l, :foo?)
21
+ # assert_respond_to(l, :bar)
22
+ # assert_respond_to(l, :bar?)
23
+ # assert_respond_to(l, :baz)
24
+ # assert_respond_to(l, :baz?)
25
+ # assert_nothing_raised { Bar }
26
+ # assert_nothing_raised { Baz }
27
+ # assert_nothing_raised { Foo }
28
+ # end
29
+
30
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ class TestFormatter < TestCase
4
+ include Log4r
5
+
6
+ def test_creation
7
+ assert_nothing_raised { Formatter.new.format(3) }
8
+ assert_nothing_raised { DefaultFormatter.new }
9
+ assert_kind_of(Formatter, DefaultFormatter.new)
10
+ end
11
+ def test_simple_formatter
12
+ sf = SimpleFormatter.new
13
+ f = Logger.new('simple formatter')
14
+ event = LogEvent.new(0, f, nil, "some data")
15
+ assert_match(sf.format(event), /simple formatter/)
16
+ end
17
+ def test_basic_formatter
18
+ b = BasicFormatter.new
19
+ f = Logger.new('fake formatter')
20
+ event = LogEvent.new(0, f, caller, "fake formatter")
21
+ event2 = LogEvent.new(0, f, nil, "fake formatter")
22
+ # this checks for tracing
23
+ assert_match(b.format(event), /in/)
24
+ assert_not_match(b.format(event2), /in/)
25
+ e = ArgumentError.new("argerror")
26
+ e.set_backtrace ['backtrace']
27
+ event3 = LogEvent.new(0, f, nil, e)
28
+ assert_match(b.format(event3), /ArgumentError/)
29
+ assert_match(b.format(LogEvent.new(0,f,nil,[1,2,3])), /Array/)
30
+ end
31
+ end