log4r 1.0.6

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 (74) hide show
  1. data/doc/content/contact.html +22 -0
  2. data/doc/content/contribute.html +21 -0
  3. data/doc/content/index.html +90 -0
  4. data/doc/content/license.html +56 -0
  5. data/doc/content/manual.html +449 -0
  6. data/doc/dev/README.developers +55 -0
  7. data/doc/dev/checklist +23 -0
  8. data/doc/dev/things-to-do +5 -0
  9. data/doc/images/log4r-logo.png +0 -0
  10. data/doc/images/logo2.png +0 -0
  11. data/doc/log4r.css +111 -0
  12. data/doc/templates/main.html +147 -0
  13. data/examples/README +19 -0
  14. data/examples/customlevels.rb +34 -0
  15. data/examples/fileroll.rb +40 -0
  16. data/examples/log4r_yaml.yaml +0 -0
  17. data/examples/logclient.rb +25 -0
  18. data/examples/logserver.rb +18 -0
  19. data/examples/moderate.xml +29 -0
  20. data/examples/moderateconfig.rb +66 -0
  21. data/examples/myformatter.rb +23 -0
  22. data/examples/outofthebox.rb +21 -0
  23. data/examples/rrconfig.xml +63 -0
  24. data/examples/rrsetup.rb +42 -0
  25. data/examples/simpleconfig.rb +39 -0
  26. data/examples/xmlconfig.rb +25 -0
  27. data/examples/yaml.rb +30 -0
  28. data/src/log4r.rb +17 -0
  29. data/src/log4r/base.rb +74 -0
  30. data/src/log4r/config.rb +9 -0
  31. data/src/log4r/configurator.rb +224 -0
  32. data/src/log4r/formatter/formatter.rb +105 -0
  33. data/src/log4r/formatter/patternformatter.rb +107 -0
  34. data/src/log4r/lib/drbloader.rb +52 -0
  35. data/src/log4r/lib/xmlloader.rb +24 -0
  36. data/src/log4r/logevent.rb +28 -0
  37. data/src/log4r/logger.rb +194 -0
  38. data/src/log4r/loggerfactory.rb +89 -0
  39. data/src/log4r/logserver.rb +28 -0
  40. data/src/log4r/outputter/consoleoutputters.rb +18 -0
  41. data/src/log4r/outputter/datefileoutputter.rb +110 -0
  42. data/src/log4r/outputter/emailoutputter.rb +116 -0
  43. data/src/log4r/outputter/fileoutputter.rb +49 -0
  44. data/src/log4r/outputter/iooutputter.rb +55 -0
  45. data/src/log4r/outputter/outputter.rb +132 -0
  46. data/src/log4r/outputter/outputterfactory.rb +59 -0
  47. data/src/log4r/outputter/remoteoutputter.rb +40 -0
  48. data/src/log4r/outputter/rollingfileoutputter.rb +126 -0
  49. data/src/log4r/outputter/staticoutputter.rb +30 -0
  50. data/src/log4r/outputter/syslogoutputter.rb +75 -0
  51. data/src/log4r/rdoc/configurator +243 -0
  52. data/src/log4r/rdoc/emailoutputter +103 -0
  53. data/src/log4r/rdoc/formatter +39 -0
  54. data/src/log4r/rdoc/log4r +89 -0
  55. data/src/log4r/rdoc/logger +175 -0
  56. data/src/log4r/rdoc/logserver +85 -0
  57. data/src/log4r/rdoc/outputter +108 -0
  58. data/src/log4r/rdoc/patternformatter +128 -0
  59. data/src/log4r/rdoc/syslogoutputter +29 -0
  60. data/src/log4r/rdoc/yamlconfigurator +20 -0
  61. data/src/log4r/repository.rb +65 -0
  62. data/src/log4r/staticlogger.rb +49 -0
  63. data/src/log4r/yamlconfigurator.rb +0 -0
  64. data/tests/README +10 -0
  65. data/tests/testall.rb +6 -0
  66. data/tests/testbase.rb +49 -0
  67. data/tests/testconf.xml +37 -0
  68. data/tests/testcustom.rb +27 -0
  69. data/tests/testformatter.rb +27 -0
  70. data/tests/testlogger.rb +196 -0
  71. data/tests/testoutputter.rb +111 -0
  72. data/tests/testpatternformatter.rb +21 -0
  73. data/tests/testxmlconf.rb +45 -0
  74. metadata +127 -0
@@ -0,0 +1,103 @@
1
+ = EmailOutputter
2
+
3
+ This is an experimental class that sends a number of formatted log events as
4
+ an RFC 822 email. It should work fine if Net:SMTP doesn't cause any
5
+ problems. Just in case, create a logger named 'log4r' and give it an
6
+ outputter to see the logging statements made by this class. If it fails to
7
+ send email, it will set itself to OFF and stop logging.
8
+
9
+ In order to use it,
10
+
11
+ require 'log4r/outputter/emailoutputter'
12
+
13
+ == SMTP Configuration
14
+
15
+ All arguments to Net::SMTP.start are supported. Pass them as hash
16
+ parameters to +new+. The to field is specified as a comma-delimited
17
+ list of emails (padded with \s* if desired).
18
+
19
+ An example:
20
+
21
+ email_out = EmailOutputter.new 'email_out',
22
+ :server=>'localhost',
23
+ :port=>25,
24
+ :domain=>'somewhere.com',
25
+ :from=>'me@foo.bar',
26
+ :to=>'them@foo.bar, me@foo.bar, bozo@clown.net',
27
+ :subject=>'Log Report'
28
+
29
+ == LogEvent Buffer
30
+
31
+ EmailOutputter stores log messages in a buffer. When the buffer reaches a
32
+ certain number, the <tt>buffsize</tt>, it will send an email containing the
33
+ contents of the buffer. The default +buffsize+ is 100. To set +buffsize+,
34
+
35
+ email_out.buffsize = 1000 # set the buffsize to 1000
36
+
37
+ == Flush To Send Email
38
+
39
+ Flushing an EmailOutputter will mail out all the remaining LogEvents.
40
+ This is convenient for systems that encapsulate the shutdown process. It's a
41
+ good idea to do this for all outputters,
42
+
43
+ Outputter.each_outputter {|o| o.flush}
44
+
45
+ Alternatively, one can invoke flush on the outputter directly,
46
+
47
+ email_out.flush
48
+
49
+ It's also a good idea to notify the recepient of the email that
50
+ the system is shutting down. Before flushing, log a message
51
+ to the owner of this outputter,
52
+
53
+ log_with_email_out.info "The system is shutting down at #{Time.now}"
54
+
55
+ == Format When?
56
+
57
+ LogEvents may either be formatted as they come in or as the
58
+ email is being composed. To do the former, specify a value of +true+
59
+ to the hash parameter +formatfirst+. The default is to format
60
+ during email composition.
61
+
62
+ email_out.formatfirst = true # format as soon as LogEvents are received
63
+
64
+ == Immediate Notification
65
+
66
+ EmailOutputter can be configured to flush and send the email whenever the
67
+ logger sees a certain log priority. Use the +immediate_at+ hash parameter
68
+ and specify the levels as a comma-delimited list (like an XML element).
69
+ To trigger an email on FATAL and ERROR,
70
+
71
+ email_out.immediate_at = "FATAL, ERROR"
72
+
73
+ == Example
74
+
75
+ A security logger sends email to several folks, buffering up to 25
76
+ log events and sending immediates on CRIT and WARN
77
+
78
+ EmailOutputter.new 'security',
79
+ :to => 'bob@secure.net, frank@secure.net',
80
+ :buffsize => 25,
81
+ :immediate_at => 'WARN, CRIT'
82
+
83
+ == XML Configuration
84
+
85
+ See log4r/configurator.rb for details. Here's an example:
86
+
87
+ <outputter name="security" type="EmailOutputter"
88
+ buffsize="25" level="ALL">
89
+ <immediate_at>WARN, CRIT</immediate_at>
90
+ <server>localhost</server>
91
+ <from>me@secure.net</from>
92
+ <to>
93
+ bob@secure.net, frank@secure.net
94
+ </to>
95
+ ...
96
+ </outputter>
97
+
98
+ == To Do
99
+
100
+ This class could use some sophistication, in particular a means to compress
101
+ the logs, a way to set the subject dynamically (probably via a block method),
102
+ and a time trigger. When the time trigger is introduced, a +buffsize+
103
+ of 0 should mean ignore +buffsize+ to determine when to send the email.
@@ -0,0 +1,39 @@
1
+ = Formatters
2
+
3
+ Formatters are responsible for formatting LogEvent data.
4
+ An Outputter owning a Formatter will invoke the
5
+ Log4r::Formatter#format method prior to writing.
6
+
7
+ == Available Formatters
8
+
9
+ * Log4r::BasicFormatter - default
10
+ * Log4r::PatternFormatter - most flexible. See log4r/formatter/patternformatter.rb
11
+ * Log4r::SimpleFormatter - like BasicFormatter for Strings only (low noise)
12
+ * Log4r::ObjectFormatter - for inspecting objects
13
+ * Log4r::NullFormatter - twirls on its feet and does nothing
14
+
15
+ = XML Configuration
16
+
17
+ Specify the Formatter and its class (as +type+) under an
18
+ <tt><outputter></tt> directive:
19
+
20
+ <outputter name="someout" type="sometype">
21
+ <formatter type="Log4r::BasicFormatter"/>
22
+ </outputter>
23
+
24
+ As explained in log4r/configurator.rb, the hash arguments you would normally
25
+ pass to +new+ are specified as <i>XML parameters</i>. Only PatternFormatter
26
+ has any of these.
27
+
28
+ = Custom Formatting
29
+
30
+ Building a custom Formatter is extremely easy. Just define a class
31
+ that extends Formatter and override the Formatter#format method.
32
+ Then give it to any interested Outputters.
33
+
34
+ If you're interested in setting up your custom formatters in XML,
35
+ please take a look at log4r/configurator.rb.
36
+
37
+ == Data Available
38
+
39
+ See Log4r::LogEvent
@@ -0,0 +1,89 @@
1
+ = #{version} Log4r API Reference
2
+
3
+ Welcome to the Log4r API reference. There are two classes of reference,
4
+ the file overview and the class API. They are listed under Files and Classes
5
+ respectively. File overviews cover the use of the Log4r API and some
6
+ implementation details, whereas class APIs detail the methods available to
7
+ the various objects.
8
+
9
+ The code examples in this API assume:
10
+
11
+ include Log4r
12
+
13
+ This file overview covers some of the major concepts in Log4r.
14
+
15
+
16
+ == Log Levels
17
+
18
+ Log4r provides as many levels of logging as desired. Logging levels
19
+ are an ordered set of names ranked by priority. The more important a level is,
20
+ the higher its priority and the more likely we want to see any data associated
21
+ with it. Log4r provides many ways to filter information by level.
22
+
23
+ Loggers and Outputters have a level parameter which serves as a level
24
+ threshold. Any data below this threshold will be ignored by the Logger or
25
+ Outputter. Additionally, Outputters can be set to mask out any particular
26
+ level or collection of levels.
27
+
28
+ By combining level thresholds with other Log4r features, one can direct any
29
+ set of data to any destination desired in a way that is easy to visualize
30
+ and configure.
31
+
32
+ === Default Levels
33
+
34
+ The default log levels and their priority rankings are:
35
+
36
+ DEBUG < INFO < WARN < ERROR < FATAL
37
+
38
+ === Custom Levels
39
+
40
+ You can have as many levels as you desire, with any naming scheme. Log4r
41
+ will automatically define level constants and log method names after
42
+ your custom specification.
43
+
44
+ Please see log4r/configurator.rb for details.
45
+
46
+ === Boundary Levels
47
+
48
+ There are two special levels, <tt>ALL</tt> and <tt>OFF</tt> which
49
+ denote whether we are logging at all levels or at none. The priority
50
+ ranks with respect to the logging levels are as follows:
51
+
52
+ ALL < logging levels as defined by user < OFF
53
+
54
+ Thus, setting the level to <tt>ALL</tt> will enable logging at all levels
55
+ whereas <tt>OFF</tt> will turn off logging completely.
56
+
57
+ == File Overviews
58
+
59
+ For Loggers:: log4r/logger.rb
60
+ For Outputters:: log4r/outputter/outputter.rb
61
+ For Formatters:: log4r/formatter/formatter.rb
62
+ For configuration:: log4r/configurator.rb
63
+
64
+ == Principal Classes of Log4r
65
+
66
+ * Log4r::Logger - Interface to logging
67
+ * Log4r::Outputter - An output destination for a logger.
68
+ * Log4r::Formatter - A means of formatting log data.
69
+ * Log4r::Configurator - A means of configuring Log4r
70
+
71
+ == Convenience Classes
72
+
73
+ Log4r provides several convenience Outputters and Formatters. Please
74
+ look at the file overviews of those classes for more details.
75
+
76
+ == Remote Logging
77
+
78
+ Log4r provides a way to send log events over a network. See log4r/logserver.rb
79
+ for details.
80
+
81
+ == What's Going on Inside?
82
+
83
+ Log4r has an internal logger which records much of what goes on inside. To see
84
+ the output, define a Logger named 'log4r' and give it an Outputter of some
85
+ sort. It logs only at the lowest and highest priorities. That would be
86
+ DEBUG and FATAL for the standard setup.
87
+
88
+ It is essential to view this data when using certain classes, like
89
+ Log4r::LogServer and Log4r::EmailOutputter.
@@ -0,0 +1,175 @@
1
+ = Loggers
2
+
3
+ Loggers provide the interface for logging in Log4r. To create a logger,
4
+ first come up with a name for it. Good choices include the name of the
5
+ class using it, a service name, or the name of the file.
6
+
7
+ To create a logger named 'mylog':
8
+
9
+ Logger.new('mylog')
10
+
11
+ After creating a logger, it is stashed in a repository. The logger may
12
+ be retrieved at any time:
13
+
14
+ Logger['mylog'] # get mylog back
15
+
16
+ It will return nil if the logger is not found. Alternatively, if an
17
+ Exception is desired when a nonexistant logger is referenced, the Logger#get
18
+ command can be used:
19
+
20
+ Logger.get('boguslog') # raises NameError if it doesn't exist
21
+
22
+ == Manipulating a Logger's Outputters
23
+
24
+ Loggers start out with no outputters. They can be added using the
25
+ Logger#add method or set directly by modifying the Loggers#outputters array:
26
+
27
+ mylog = Logger['mylog']
28
+
29
+ # assume we've created Outputters out1 through out4
30
+ mylog.outputters = out1, out2
31
+ mylog.add(out3, out4)
32
+ mylog.each_outputter {|o| o.flush}
33
+
34
+ # assume out5 through out7 have names 'out5' through 'out7' resp.
35
+ mylog.outputters = 'out5', 'out6'
36
+ mylog.add('out7')
37
+ mylog.remove('out5','out7')
38
+
39
+ Please see log4r/outputter/outputter.rb and Log4r::Outputter for more about
40
+ outputters.
41
+
42
+ == Logging Methods
43
+
44
+ To log something at a certain priority, use the logging method named
45
+ after the lowercased priority level name:
46
+
47
+ mylog.warn "This is a message with priority WARN"
48
+ mylog.fatal "A FATAL message"
49
+
50
+ Blocks can also be logged:
51
+
52
+ mylog.warn {"This is also a message with priority WARN"}
53
+ mylog.debug do
54
+ # some complicated string magic
55
+ return result
56
+ end
57
+
58
+ The primary difference is that the block doesn't get called unless
59
+ the Logger can log at that level. It is useful for doing computationaly
60
+ expensive things at a log event.
61
+
62
+ == Query Methods
63
+
64
+ To ask Log4r whether it is capable of logging a certain level:
65
+
66
+ mylog.warn? # are we logging WARN?
67
+ mylog.fatal? # how about FATAL?
68
+
69
+ Query methods and blocks accomplish the same thing:
70
+
71
+ mylog.warn "don't evaluate unless WARN is on" if mylog.warn?
72
+ mylog.warn {"don't evaluate unless WARN is on"}
73
+
74
+ == What About the Special Levels?
75
+
76
+ <tt>ALL</tt> and <tt>OFF</tt> can be querried, but not logged:
77
+
78
+ log.off? # true iff level is OFF
79
+ log.all? # true iff level is ALL
80
+ log.all "Try to log" => Method not defined. (NameError)
81
+
82
+ == Custom Levels and Method Names
83
+
84
+ Suppose we've set up Log4r with the custom levels:
85
+
86
+ Foo < Bar < Baz
87
+
88
+ As one might expect, the logging methods are named after them:
89
+
90
+ log.bar "something" # log at custom level Bar
91
+ log.bar? # are we logging at level Bar?
92
+
93
+ = Logger Inheritance
94
+
95
+ Normally, when a logger is created, its parent is set to RootLogger.
96
+ If a Logger's level isn't specified at creation, it will inherit the level
97
+ of its parent.
98
+
99
+ To specify an ancestors of a logger besides RootLogger, include the names
100
+ of the ancestors in order of ancestry and delimited by
101
+ Log4r::Log4rConfig::LoggerPathDelimiter. For example, if the
102
+ delimiter is the default <tt>::</tt>, our logger is 'me'
103
+ and its ancestors are 'cain', 'grandpa', and 'pa', we create the logger
104
+ like so:
105
+
106
+ Logger.new('cain::grandpa::pa::me')
107
+
108
+ This string is split into three compontents which can be used
109
+ by a Formatter to avoid parsing the name:
110
+
111
+ Logger#fullname:: The whole enchilada: 'cain::grandpa::pa::me'
112
+ Logger#name:: Just 'me'
113
+
114
+ To get this logger back from the repository,
115
+
116
+ Logger['cain::grandpa::pa::me']
117
+
118
+ = Outputter Additivity
119
+
120
+ By default, Logger Outputters are <b>additive</b>. This means that
121
+ a log event will also be sent to all of a logger's ancestors. To
122
+ stop this behavior, set a logger's +additive+ to false.
123
+
124
+ Logger['foo'].additive = false
125
+
126
+ A Logger's level, additivity and trace can be changed dynamically,
127
+ but this is an expensive operation as the logging methods have to be
128
+ redefined.
129
+
130
+ = RootLogger
131
+
132
+ Log4r::RootLogger is the ancestor of all loggers. Its level defines the global
133
+ logging threshold. Any loggers created <b>after</b> RootLogger's level is
134
+ set will not log below that level. By default, RootLogger's level is set
135
+ to <tt>ALL</tt>
136
+
137
+ RootLogger is a singleton which gets created automaticallay. It can be
138
+ retrieved at any time with Logger.root, Logger.global,
139
+ Logger['root'] or Logger['global'].
140
+
141
+ == Global Level
142
+
143
+ Suppose we want _everything_ to ignore events less than FATAL. We can
144
+ accomplish this easily:
145
+
146
+ Logger.global.level = FATAL
147
+
148
+ Just be sure to set this before any other Loggers or Outputters are defined.
149
+
150
+ == RootLogger Does Nothing
151
+
152
+ RootLogger itself behaves as if its level were permanently set to
153
+ <tt>OFF</tt>, thus making it a sort of null object.
154
+
155
+ = XML Configuration
156
+
157
+ Please see log4r/configurator.rb for an overview of XML configuratoin.
158
+
159
+ It's easy to configure a Logger in XML. The following example should be
160
+ sufficient:
161
+
162
+ ...
163
+ <logger name="papa::mylog" level="DEBUG" trace="true">
164
+ <additive>false</additive>
165
+ <outputter>stdout</outputter>
166
+ <outputters>stderr, dancer, doner, blitzen</outputters>
167
+ </logger>
168
+ <logger name="papa" outputters="stderr, stdout"/>
169
+ ...
170
+
171
+ The element +outputter+ can occur multiple times, but cannot be an attribute
172
+ of +logger+. That is, it is not an <i>XML directive</i>. However, the element
173
+ +outputters+ is an <i>XML directive</i>, as are all the others.
174
+
175
+ For more examples, check the <tt>examples</tt> directory in the Log4r package.
@@ -0,0 +1,85 @@
1
+ = Remote Logging
2
+
3
+ Want to use Log4r over a network? No problem! A Log4r::RemoteOutputter will
4
+ send its LogEvents to a Log4r::LogServer. These two classes are as easy to
5
+ set up and use as the rest of Log4r.
6
+
7
+ == Use ROMP
8
+
9
+ There is one catch though: ROMP is required to use this service. It is a
10
+ DRb-like system with superb performance and better features. Get ROMP at
11
+ http://rubystuff.org/romp/
12
+
13
+ == LogServer
14
+
15
+ LogServer is simply a kind of Logger which embeds a ROMP::Server. Like a
16
+ normal Logger, you can give it Outputters, set its level and so on. Its
17
+ logging methods are accessible over a network and are called by a
18
+ RemoteOutputter on another host.
19
+
20
+ === LogServer Setup
21
+
22
+ Setup is easy. First,
23
+
24
+ require 'log4r/logserver'
25
+
26
+ The following sets up a LogServer named 'central' on localhost port 9999:
27
+
28
+ LogServer.new('central', 'tcpromp://localhost:9999')
29
+
30
+ We manipulate it and give it outputters as normal:
31
+
32
+ serv = Logger['central'] # grab our new LogServer
33
+ serv.add 'stdout' # make it log to $stdout
34
+
35
+ == RemoteOutputter
36
+
37
+ RemoteOutputter is simply a kind of Outputter that embeds a ROMP::Client. When
38
+ RemoteOutputter gets a LogEvent, it will forward it to whatever LogServer it's
39
+ connected to. In essence, RemoteOutputter behaves like a Logger that is
40
+ forwarding a LogEvent to another Logger (as is done in hierarchical logging).
41
+
42
+ === RemoteOutputter Setup
43
+
44
+ First,
45
+
46
+ require 'log4r/outputter/remoteoutputter'
47
+
48
+ Unlike typical outputters, RemoteOutputter doesn't do any formatting. That's
49
+ up to the LogServer's outputters. Otherwise, RemoteOutputter can be
50
+ set up as usual. The ROMP uri of the LogServer must be specified.
51
+
52
+ RemoteOutputter.new 'client', :uri=>'tcpromp://localhost:9999'
53
+
54
+ === Using RemoteOutputter
55
+
56
+ Give our new RemoteOutputter to a logger:
57
+
58
+ mylog = Logger['mylog']
59
+ mylog.add 'client'
60
+
61
+ Now, whenever mylog generates a LogEvent, LogServer should get a copy. Doing
62
+ the following:
63
+
64
+ mylog.info "This is a message from 'mylog'"
65
+
66
+ Produces this output on LogServer's console:
67
+
68
+ INFO mylog: This is a message from 'mylog'
69
+
70
+ == XML Configuration
71
+
72
+ RemoteOutputter is set up like normal Outputters. LogServer is set up
73
+ like a normal Logger, but with an element name of logserver instead of
74
+ logger:
75
+
76
+ <log4r_config>
77
+ <logserver name="name" uri="tcpromp://localhost:9999">
78
+ ...
79
+
80
+ == Debugging
81
+
82
+ It is recommended to set up a logger named 'log4r' on both the server and
83
+ client to see what LogServer and RemoteOutputter are up to. Both of the classes
84
+ use Log4r's internal logging to report any problems. See the section
85
+ <b>What's Going on Inside?</b> in log4r.rb for more info.