jlogger 0.0.4

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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/CHANGES ADDED
@@ -0,0 +1,15 @@
1
+ 0.0.4
2
+ Switch to underlying jlogger, not slf logger, to allow parameterized logging
3
+
4
+ 0.0.3
5
+ Allow JLogger::Simple to act as a rootlogger (e.g., JLogger::Simple.info "hello",
6
+ JLogger::Simple.startConsole, etc. will all work.)
7
+
8
+ Provide a class-level 'log' method (e.g., MyClass.log.info 'hello') for use inside
9
+ class methods. (def self.hello; log 'hello'; end)
10
+
11
+ 0.0.2
12
+ First gem
13
+
14
+ 0.0.1
15
+ First release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 BillDueber
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,66 @@
1
+ # jlogger
2
+
3
+ A simple wrapper around rjack-logback to make your logging easy.
4
+
5
+
6
+ I wanted a way to just include a module and automatically get logging that integrated with the Java logging I already had. rjack-logback provided all the tools for me to make one.
7
+
8
+ ```ruby
9
+
10
+ require 'jlogger'
11
+
12
+ class MyClass
13
+ include JLogger::Simple
14
+ def hello
15
+ log.info "Calling hello" # 'log' method thanks to JLogger::Simple
16
+ puts 'Hello'
17
+ end
18
+ end
19
+
20
+
21
+ rootlog = JLogger::RootLogger.new
22
+
23
+ # Start some log output. By default, NO logging is done!
24
+
25
+ rootlog.startConsole # starts logging on STDERR
26
+ rootlog.startFile 'mylog.log' # starts logging to the file
27
+
28
+
29
+ c = MyClass.new
30
+
31
+ rootlog.info 'Hello' # logs to both STDERR and the file mylog.log
32
+ c.hello # ditto
33
+
34
+ rootlog.loglevel = :warn # use :debug, :info, :warn, :error, or :off
35
+
36
+ rootlog.info 'hello' # doesn't log to anywhere
37
+ c.hello # ditto
38
+
39
+ MyClass.loglevel = :info # set it just for this class and its subclasses
40
+
41
+ rootlog.info 'hello' # doesn't log to anywhere
42
+ c.hello # logs again
43
+
44
+ rootlog.stopFile('mylog.log') # stop logging to the file
45
+ rootlog.stopConsole # stop logging to STDERR
46
+
47
+ ```
48
+
49
+
50
+ ## Bugs
51
+
52
+ I can't seem to write a good wrapper to allow the use of File handles (converted to Outputstreams); that's something I would really like.
53
+
54
+ ## Note on Patches/Pull Requests
55
+
56
+ * Fork the project.
57
+ * Make your feature addition or bug fix.
58
+ * Add tests for it. This is important so I don't break it in a
59
+ future version unintentionally.
60
+ * Commit, do not mess with rakefile, version, or history.
61
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
62
+ * Send me a pull request. Bonus points for topic branches.
63
+
64
+ == Copyright
65
+
66
+ Copyright (c) 2010 BillDueber. See LICENSE for details.
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "jlogger"
8
+ gem.summary = %Q{Simple wrapper around rjack-logback}
9
+ gem.description = %Q{Include in your modules to get a defaul 'log' object; then use it to log stuff}
10
+ gem.email = "bill@dueber.com"
11
+ gem.homepage = "http://github.com/billdueber/jlogger"
12
+ gem.authors = ["BillDueber"]
13
+
14
+ gem.add_dependency "rjack-logback"
15
+
16
+ gem.add_development_dependency "rspec", ">= 1.2.9"
17
+ gem.add_development_dependency "yard", ">= 0"
18
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ require 'spec/rake/spectask'
26
+ Spec::Rake::SpecTask.new(:spec) do |spec|
27
+ spec.libs << 'lib' << 'spec'
28
+ spec.spec_files = FileList['spec/**/*_spec.rb']
29
+ end
30
+
31
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
32
+ spec.libs << 'lib' << 'spec'
33
+ spec.pattern = 'spec/**/*_spec.rb'
34
+ spec.rcov = true
35
+ end
36
+
37
+ task :spec => :check_dependencies
38
+
39
+ task :default => :spec
40
+
41
+ begin
42
+ require 'yard'
43
+ YARD::Rake::YardocTask.new
44
+ rescue LoadError
45
+ task :yardoc do
46
+ abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
47
+ end
48
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.4
@@ -0,0 +1,253 @@
1
+ require 'rubygems'
2
+ require 'rjack-logback'
3
+
4
+
5
+ # Redefine how to get logger names
6
+ module RJack
7
+ module SLF4J
8
+ def self.to_log_name classobject
9
+ classline = []
10
+ parent_is_a_logback = false
11
+ loggingname = 'none'
12
+ ancestors = []
13
+ classobject.ancestors.each do |c|
14
+ c = c.to_s
15
+ if c == "JLogger::Simple"
16
+ break
17
+ end
18
+ if c == "Object"
19
+ break;
20
+ end
21
+ classline.unshift c.split('::')
22
+ end
23
+ loggingname = classline.flatten.join('.')
24
+ return loggingname
25
+ end
26
+ end
27
+ end
28
+
29
+ # Allow access to teh underlying java logger
30
+ module RJack
31
+ module Logback
32
+ class Logger
33
+ attr_reader :jlogger
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+ # Create an outputstream logger
40
+ # Whoops. Nothing happens, and I don't know why. Don't worry about it for now.
41
+
42
+ # module RJack
43
+ # module Logback
44
+ # class StreamAppender < Java::ch.qos.logback.core.OutputStreamAppender
45
+ # include AppenderUtil
46
+ #
47
+ # # Sets defaults, yields self to block, and calls self.start
48
+ # def initialize( ioobject, &block )
49
+ # super()
50
+ # set_defaults
51
+ # self.setOutputStream(ioobject.to_outputstream)
52
+ # self.encoding = "UTF-8"
53
+ # finish( &block )
54
+ # end
55
+ # end
56
+ # end
57
+ # end
58
+ #
59
+
60
+
61
+ module JLogger
62
+ module Simple
63
+ include RJack::Logback
64
+
65
+ Level = Java::ch.qos.logback.classic.Level
66
+ LEVELS = {
67
+ # :off => RJack::Logback::OFF,
68
+ :off => Level::OFF,
69
+ :trace => TRACE,
70
+ :debug => DEBUG,
71
+ :info => INFO,
72
+ :warn => WARN,
73
+ :error => ERROR,
74
+ }
75
+
76
+ def self.method_missing(meth, *args)
77
+ @root.send(meth, *args)
78
+ end
79
+
80
+
81
+
82
+ # On inclusion, we set up a logger for this class
83
+
84
+ def self.included klass
85
+ @root ||= JLogger::RootLogger.new
86
+
87
+ class << klass
88
+ attr_accessor :_slflogger, :_logobject
89
+
90
+ def createlogger
91
+ RJack::Logback.root.jlogger.detachAppender('console')
92
+ @_slflogger = RJack::SLF4J[self]
93
+ @_logobject = RJack::Logback[@_slflogger.name]
94
+ @_slflogger = @_logobject.jlogger
95
+ end
96
+
97
+ def log
98
+ createlogger unless @_slflogger
99
+ return @_slflogger
100
+ end
101
+
102
+ def loglevel= level
103
+ self.createlogger unless @_slflogger
104
+
105
+ level = level.to_s.downcase.to_sym
106
+ unless LEVELS.has_key? level
107
+ raise ArgumentError, "'#{level}' is an invalid loglevel"
108
+ end
109
+
110
+ @_logobject.level = LEVELS[level]
111
+ end
112
+
113
+ end
114
+ end
115
+
116
+
117
+ # The log object. First thing we do is try to
118
+ # get a logger from the class; if we can't, go
119
+ # ahead and build one
120
+
121
+ def log
122
+ unless self.class._slflogger
123
+ self.class.createlogger
124
+ end
125
+ return self.class._slflogger
126
+ end
127
+
128
+
129
+
130
+
131
+ end
132
+ end
133
+
134
+
135
+ # The root logger
136
+
137
+ module JLogger
138
+ class RootLogger
139
+ include JLogger::Simple
140
+ PATTERN = RJack::Logback::PatternLayout.new("%-5level\t%date{HH:mm:ss}\t%5r\t%-30logger\t%msg\n")
141
+
142
+ def initialize
143
+ self.class._logobject = RJack::Logback.root
144
+ self.class._slflogger = self.class._logobject.jlogger
145
+ RJack::Logback.root.jlogger.detachAppender('console')
146
+ end
147
+
148
+ # The logging methods
149
+
150
+ def debug *args
151
+ log.debug *args
152
+ end
153
+
154
+ def info *args
155
+ log.info *args
156
+ end
157
+
158
+ def warn *args
159
+ log.warn *args
160
+ end
161
+
162
+ def error *args
163
+ log.error *args
164
+ end
165
+
166
+
167
+ def debug?
168
+ return log.debug_enabled?
169
+ end
170
+
171
+ def info?
172
+ return log.info_enabled?
173
+ end
174
+
175
+ def warn?
176
+ return log.warn_enabled?
177
+ end
178
+
179
+ def error?
180
+ return log.error_enabled?
181
+ end
182
+
183
+ # Set the log level
184
+ # Why do I need to redefine this here? self.class.loglevel = level fails with
185
+ # method not found.s
186
+
187
+ def loglevel= level
188
+ self.class.createlogger unless self.class._logobject
189
+ level = level.to_s.downcase.to_sym
190
+ unless JLogger::Simple::LEVELS.has_key? level
191
+ raise ArgumentError, "'#{level}' is an invalid loglevel"
192
+ end
193
+
194
+ self.class._logobject.level = JLogger::Simple::LEVELS[level]
195
+ end
196
+
197
+ def startConsole pattern = nil
198
+ return if RJack::Logback.root.jlogger.getAppender('jlconsole')
199
+ jlconsole = RJack::Logback::ConsoleAppender.new do |a|
200
+ a.target = "System.err"
201
+ a.name = 'jlconsole'
202
+ a.layout = pattern || PATTERN
203
+ end
204
+ RJack::Logback.root.add_appender( jlconsole )
205
+ end
206
+
207
+ def stopConsole
208
+ RJack::Logback.root.jlogger.detachAppender('jlconsole')
209
+ end
210
+
211
+
212
+
213
+ def startFile file, pattern = nil
214
+
215
+ # Get the ID and class to use
216
+
217
+ id = nil
218
+ mod = nil
219
+ if file.is_a? String
220
+ id = file
221
+ mod = RJack::Logback::FileAppender
222
+ # elsif file.respond_to? :to_outputstream
223
+ # id = 'objid' + file.object_id.to_s
224
+ # mod = RJack::Logback::StreamAppender
225
+ else
226
+ raise ArgumentError, "#{file} is not a valid target for file logging. Must be a filename"
227
+ end
228
+
229
+ return if RJack::Logback.root.jlogger.getAppender(id)
230
+
231
+ app = mod.new(file) do |a|
232
+ a.name = id
233
+ a.layout = pattern || PATTERN
234
+ end
235
+ RJack::Logback.root.add_appender( app )
236
+ end
237
+
238
+ def stopFile file
239
+ if file.is_a? String
240
+ id = file
241
+ # elsif file.respond_to? :to_outputstream
242
+ # id = 'objid' + file.object_id.to_s
243
+ else
244
+ raise ArgumentError, "#{file} is not a valid target for file logging"
245
+ end
246
+ RJack::Logback.root.jlogger.detachAppender(id)
247
+ end
248
+
249
+
250
+ end
251
+ end
252
+
253
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Jlogger" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'jlogger'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jlogger
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
11
+ platform: ruby
12
+ authors:
13
+ - BillDueber
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-15 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rjack-logback
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 13
44
+ segments:
45
+ - 1
46
+ - 2
47
+ - 9
48
+ version: 1.2.9
49
+ type: :development
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: yard
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :development
64
+ version_requirements: *id003
65
+ description: Include in your modules to get a defaul 'log' object; then use it to log stuff
66
+ email: bill@dueber.com
67
+ executables: []
68
+
69
+ extensions: []
70
+
71
+ extra_rdoc_files:
72
+ - LICENSE
73
+ - README.md
74
+ files:
75
+ - .document
76
+ - .gitignore
77
+ - CHANGES
78
+ - LICENSE
79
+ - README.md
80
+ - Rakefile
81
+ - VERSION
82
+ - lib/jlogger.rb
83
+ - spec/jlogger_spec.rb
84
+ - spec/spec.opts
85
+ - spec/spec_helper.rb
86
+ has_rdoc: true
87
+ homepage: http://github.com/billdueber/jlogger
88
+ licenses: []
89
+
90
+ post_install_message:
91
+ rdoc_options:
92
+ - --charset=UTF-8
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 3
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ requirements: []
114
+
115
+ rubyforge_project:
116
+ rubygems_version: 1.3.7
117
+ signing_key:
118
+ specification_version: 3
119
+ summary: Simple wrapper around rjack-logback
120
+ test_files:
121
+ - spec/jlogger_spec.rb
122
+ - spec/spec_helper.rb