log4jruby 2.0.1-java → 3.0.0.rc1-java
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +32 -0
- data/README.md +151 -69
- data/lib/log4jruby/logger.rb +73 -137
- data/lib/log4jruby/logger_for_class.rb +6 -6
- data/lib/log4jruby/support/levels.rb +45 -0
- data/lib/log4jruby/support/location.rb +44 -0
- data/lib/log4jruby/support/log4j_args.rb +29 -26
- data/lib/log4jruby/support/log_manager.rb +63 -0
- data/lib/log4jruby/version.rb +3 -1
- data/lib/log4jruby.rb +3 -1
- metadata +20 -12
- data/lib/log4jruby/support/bootstrap.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 63ae3e7cb5a390af7767e58ce30270c32cc3c770ba877ce0932627e3efab1607
|
4
|
+
data.tar.gz: d80186abc03df7b0a2b10befcdda3084eef5cffeb4e1960ce957930d6be1e850
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbc3e978c3d27fe325b135ff988b063f928daadec1a3608d8cfd891766ab2eefa3e0dc08c60ae3dae9835760236fbcb6e84152bcc2cef8faebfb7d8f2b407bf9
|
7
|
+
data.tar.gz: 61d52687aa0b3d1658fb29c0c543e0e7ba45789799ebaabc640fa4f2570ea1d395972c856118bfb2e34e45d3c4780dd3e1e45285c609ae7c8c26455a4a9595ad
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,37 @@
|
|
1
1
|
# log4jruby Changelog
|
2
2
|
|
3
|
+
## v3.0.0.rc1
|
4
|
+
|
5
|
+
* JRuby 9.3.x/Ruby 2.6 support - Ruby >= 2.6.8 now required
|
6
|
+
* Updated for Log4j2
|
7
|
+
Note:
|
8
|
+
> In Log4j 1.x the Logger Hierarchy was maintained through a relationship between Loggers.
|
9
|
+
In Log4j 2 this relationship no longer exists. Instead, the hierarchy is maintained in the
|
10
|
+
relationship between LoggerConfig objects.
|
11
|
+
from the [Log4j 2 Architecture page](https://logging.apache.org/log4j/2.x/manual/architecture.html)
|
12
|
+
* Formatters and logging output
|
13
|
+
* Consistent treatment for Ruby and Java exceptions - Previously, ruby exception backtraces were
|
14
|
+
not passed directly to Log4j. Instead a backtrace string was generated and included in the exception
|
15
|
+
message. JRuby now handles mapping Ruby exceptions/errors to Java exceptions that can be
|
16
|
+
passed directly as the `Throwable` parameter to Log4j.
|
17
|
+
* Formatter parity with the standard Ruby Logger - Custom formatters
|
18
|
+
(see [formatter in the
|
19
|
+
Ruby Logger docs](https://ruby-doc.org/stdlib-2.7.0/libdoc/logger/rdoc/Logger.html)
|
20
|
+
now receive the same arguments from Log4Jruby as they would from the standard Ruby Logger
|
21
|
+
given the same logging invocation.
|
22
|
+
* Default formatter - The [standard Ruby Logger](https://ruby-doc.org/stdlib-2.7.0/libdoc/logger/rdoc/Logger.html)
|
23
|
+
uses a default formatter that outputs backtraces (without nested causes). Log4jruby now uses
|
24
|
+
a default formatter that outputs `progname` and `msg` only. Severity and timestamp are output
|
25
|
+
according to your Log4j configuration. E.g. [PatternLayout](https://logging.apache.org/log4j/2.x/manual/layouts.html)
|
26
|
+
* The output of the `formatter` is passed as the `message` parameter of the
|
27
|
+
[Log4j log methods](https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html)
|
28
|
+
* Nested ruby exceptions are now handled - E.g. The backtrace output from `logger.error { ruby_error_with_nested_causes }` will
|
29
|
+
include nested causes for both Ruby and Java exceptions.
|
30
|
+
* Log4jruby no longer utilizes deprecated [JRuby Persistence](https://github.com/jruby/jruby/wiki/Persistence)
|
31
|
+
* Development
|
32
|
+
* Rubocop introduced and violations squashed
|
33
|
+
* Mavenized log4j development dependency, added `dev:java_deps` Rake task, and removed bundled log4j jar
|
34
|
+
|
3
35
|
## v2.0.1
|
4
36
|
|
5
37
|
* JRuby 9K compatibility - https://github.com/lenny/log4jruby/issues/14
|
data/README.md
CHANGED
@@ -1,94 +1,176 @@
|
|
1
|
+
# Log4jruby
|
1
2
|
|
3
|
+
`Log4jruby` provides an interface mostly compatible with the standard ruby [Logger](http://ruby-doc.org/core/classes/Logger.html) but backed by [Log4j 2](https://logging.apache.org/log4j/2.x/).
|
4
|
+
This makes the granular log output configuration, stacktrace output, and other facilities of `log4j` available to Java and Ruby code alike. For projects that extend/integrate Java already dependent on `log4j`, it allows log configuration for Java and Ruby code in one spot.
|
2
5
|
|
3
|
-
|
6
|
+
* Automatic stacktrace output (including nested causes) for logged Java and Ruby exceptions
|
7
|
+
* Configure Java and Ruby logging together (e.g a single `log4j2.properties` file) and gain `log4j` features such as runtime output targets for Ruby code.
|
8
|
+
* Ability to configure logging per distinct logger name (typically a class)
|
9
|
+
* Supports inclusion of filename, line number, and method name in log messages via [ThreadContext](https://logging.apache.org/log4j/2.x/manual/thread-context.html). Note: `tracing` must be enabled.
|
10
|
+
* High level support for class based logging via the `enable_logger` macro.
|
11
|
+
* Compatible with the `Rails` logging.
|
4
12
|
|
5
|
-
* https://github.com/lenny/log4jruby
|
6
13
|
|
7
|
-
##
|
14
|
+
## Usage and examples
|
8
15
|
|
9
|
-
|
10
|
-
It is geared more toward those who are using JRuby to integrate with and build on top of Java code that uses Log4j.
|
11
|
-
The ```Log4jruby::Logger``` provides an interface much like the standard ruby [Logger](http://ruby-doc.org/core/classes/Logger.html).
|
12
|
-
Logging is configured via traditional Log4j methods.
|
16
|
+
Enable class level logging via `enable_logger`
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
apps that call and extend Java code into Tomcat as WARs and use a log4j.properties to configure. For the most part,
|
17
|
-
all there is to using log4jruby is making sure the log4j jar is <tt>required</tt> and that Log4j is at least minimally
|
18
|
-
configured (e.g., log4j.properties in the CLASSPATH). The examples should give you the idea.
|
18
|
+
```ruby
|
19
|
+
require 'log4jruby'
|
19
20
|
|
20
|
-
|
21
|
+
class MyClass
|
22
|
+
enable_logger
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
class << self
|
25
|
+
def my_class_method
|
26
|
+
logger.info("hello from class method")
|
27
|
+
end
|
28
|
+
end
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
+
def my_method
|
31
|
+
logger.info("hello from instance method")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
30
35
|
|
31
|
-
|
32
|
-
log4j.logger.jruby.MyClass=debug
|
36
|
+
Custom logger name
|
33
37
|
|
34
|
-
|
38
|
+
```ruby
|
39
|
+
logger = Log4jruby::Logger.get('my.logger')
|
40
|
+
logger.debug('something')
|
41
|
+
```
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
Log4jruby logger names are prefixed with `.jruby`.
|
44
|
+
|
45
|
+
e.g. `log4j2.properties`
|
46
|
+
|
47
|
+
See [examples/log4j2.properties](examples/log4j2.properties) for complete example
|
48
|
+
|
49
|
+
```ini
|
50
|
+
...
|
51
|
+
# JRuby logger
|
52
|
+
logger.jruby.name = jruby
|
53
|
+
logger.jruby.level = debug
|
54
|
+
logger.jruby.additivity = false
|
55
|
+
logger.jruby.appenderRef.stdout.ref = JRuby
|
56
|
+
```
|
57
|
+
|
58
|
+
Inclusion of filename, line number, and method name in log messages via [ThreadContext](https://logging.apache.org/log4j/2.x/manual/thread-context.html)
|
59
|
+
|
60
|
+
e.g.
|
61
|
+
|
62
|
+
```ini
|
63
|
+
appender.jruby.layout.pattern = %d %5p %c %X{methodName}:%X{lineNumber} %m%throwable%n
|
64
|
+
```
|
65
|
+
|
66
|
+
enable tracing globally
|
67
|
+
|
68
|
+
```
|
69
|
+
Log4jruby::Logger.root.tracing = true
|
70
|
+
```
|
71
|
+
|
72
|
+
or for specific logger
|
73
|
+
|
74
|
+
```
|
75
|
+
Log4jruby::Logger.get('MyClass', tracing: true)
|
76
|
+
```
|
77
|
+
|
78
|
+
produces log statements like:
|
79
|
+
|
80
|
+
```
|
81
|
+
2022-08-12 17:36:05,819 DEBUG jruby.MyClass foo:20 -- : hello from foo
|
82
|
+
```
|
83
|
+
|
84
|
+
Exceptions are logged with backtraces
|
85
|
+
|
86
|
+
```bash
|
87
|
+
> ruby ./examples/nested_ruby_exceptions.rb
|
88
|
+
2022-08-25 19:50:47,050 ERROR jruby.test <main>:31 -- : raised from foo org.jruby.exceptions.RuntimeError: (RuntimeError) raised from foo
|
89
|
+
at $_dot_.examples.nested_ruby_exceptions.foo(./examples/nested_ruby_exceptions.rb:15)
|
90
|
+
at $_dot_.examples.nested_ruby_exceptions.<main>(./examples/nested_ruby_exceptions.rb:29)
|
91
|
+
Caused by: org.jruby.exceptions.RuntimeError: (RuntimeError) raised from bar
|
92
|
+
at $_dot_.examples.nested_ruby_exceptions.bar(./examples/nested_ruby_exceptions.rb:21)
|
93
|
+
at $_dot_.examples.nested_ruby_exceptions.foo(./examples/nested_ruby_exceptions.rb:13)
|
94
|
+
... 1 more
|
95
|
+
Caused by: org.jruby.exceptions.RuntimeError: (RuntimeError) raised from baz
|
96
|
+
at $_dot_.examples.nested_ruby_exceptions.baz(./examples/nested_ruby_exceptions.rb:25)
|
97
|
+
at $_dot_.examples.nested_ruby_exceptions.bar(./examples/nested_ruby_exceptions.rb:19)
|
98
|
+
... 2 more
|
99
|
+
|
100
|
+
|
101
|
+
```
|
102
|
+
|
103
|
+
```
|
104
|
+
logger.warn(exception)
|
105
|
+
```
|
106
|
+
|
107
|
+
```
|
108
|
+
logger.warn { exception }
|
109
|
+
```
|
110
|
+
|
111
|
+
```
|
112
|
+
logger.error(msg) { exception)
|
113
|
+
```
|
114
|
+
|
115
|
+
See additional examples in [log4jruby/examples](examples).
|
116
|
+
|
117
|
+
|
118
|
+
## Configuration
|
119
|
+
|
120
|
+
Configuring log4j is left to the client via the [standard log4j configuration process](https://logging.apache.org/log4j/2.x/manual/configuration.html).
|
121
|
+
|
122
|
+
E.g.
|
123
|
+
|
124
|
+
Create a `log4j2.properties` file and make sure it is available in your classpath.
|
125
|
+
|
126
|
+
The log4j-api-2.n.jar and log4j-core-2.n.jars must be found in your classpath when `log4jruby` is loaded.
|
127
|
+
|
128
|
+
* Place files somewhere already in your classpath such as `$TOMCAT/lib` for Tomcat.
|
129
|
+
* Configure classpath via `JAVA_OPTS`
|
130
|
+
* Amend `$CLASSPATH` at runtime before loading log4jruby. See [examples/setup.rb](examples/setup.rb).
|
44
131
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
132
|
+
Note: If you're using bundler, you can specify `gem 'log4jruby', require: false` in your Gemfile to delay loading the gem too early.
|
133
|
+
|
134
|
+
In a Rails application, add the following in `config/application.rb` or the appropriate `config/environments` file.
|
135
|
+
```ini
|
136
|
+
config.logger = ActiveSupport::TaggedLogging.new(Log4jruby::Logger.get('MyApp'))
|
137
|
+
```
|
49
138
|
or older versions of Rails
|
139
|
+
```ini
|
140
|
+
config.logger = Log4jruby::Logger.get('MyApp')
|
141
|
+
```
|
142
|
+
|
143
|
+
## Formatters
|
50
144
|
|
51
|
-
|
52
|
-
|
53
|
-
### Examples
|
145
|
+
See [`formatter` in the
|
146
|
+
Ruby ::Logger docs](https://ruby-doc.org/stdlib-2.7.0/libdoc/logger/rdoc/Logger.html)
|
54
147
|
|
55
|
-
|
56
|
-
logger.debug("hello from foo")
|
57
|
-
bar
|
58
|
-
rescue => e
|
59
|
-
logger.error(e)
|
60
|
-
end
|
148
|
+
Log4jruby passes the same arguments to a `formatter` as would be passed using the standard Ruby Logger given the same logging invocations.
|
61
149
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
ERROR jruby.MyClass foo:20 - error from baz
|
66
|
-
examples/simple.rb:30:in `baz'
|
67
|
-
examples/simple.rb:25:in `bar'
|
68
|
-
examples/simple.rb:18:in `foo'
|
69
|
-
examples/simple.rb:35:in `(root)'
|
150
|
+
The default Log4jruby formatter outputs `progname` and `msg` only (as opposed to the default formatter of the Ruby Logger).
|
151
|
+
Severity, timestamp, and backtraces are handed according to your `Log4j` configuration.
|
152
|
+
E.g. [PatternLayout](https://logging.apache.org/log4j/2.x/manual/layouts.html).
|
70
153
|
|
71
|
-
|
154
|
+
The output of the `formatter` is passed as the `message` parameter of the [Log4j log methods](https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#log(org.apache.log4j.Priority,%20java.lang.Object).
|
72
155
|
|
73
|
-
|
156
|
+
## Development
|
74
157
|
|
75
|
-
|
76
|
-
enable_logger
|
158
|
+
Install log4j for tests and examples
|
77
159
|
|
78
|
-
|
79
|
-
def my_class_method
|
80
|
-
logger.info("hello from class method")
|
81
|
-
end
|
82
|
-
end
|
160
|
+
`rake dev:java_deps`
|
83
161
|
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
162
|
+
```
|
163
|
+
e.g.
|
88
164
|
|
89
|
-
|
90
|
-
|
165
|
+
ruby ./examples/simple.rb
|
166
|
+
```
|
91
167
|
|
92
|
-
|
93
|
-
They should be runnable from the source.
|
168
|
+
### IRB
|
94
169
|
|
170
|
+
```
|
171
|
+
bundle exec irb
|
172
|
+
irb(main):002:0> require './examples/setup.rb'
|
173
|
+
irb(main):003:0> require 'log4jruby'
|
174
|
+
irb(main):006:0> Log4jruby::Logger.root.debug('test')
|
175
|
+
DEBUG jruby : - test
|
176
|
+
```
|
data/lib/log4jruby/logger.rb
CHANGED
@@ -1,37 +1,27 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'log4jruby/support/log4j_args'
|
4
|
+
require 'log4jruby/support/levels'
|
5
|
+
require 'log4jruby/support/location'
|
6
|
+
require 'log4jruby/support/log_manager'
|
3
7
|
require 'logger'
|
4
8
|
|
5
9
|
module Log4jruby
|
6
|
-
|
7
10
|
# Author:: Lenny Marks
|
8
11
|
#
|
9
|
-
# Wrapper around org.apache.log4j.Logger with interface similar to standard ruby Logger.
|
12
|
+
# Wrapper around org.apache.logging.log4j.Logger with interface similar to standard ruby Logger.
|
10
13
|
#
|
11
14
|
# * Ruby and Java exceptions are logged with backtraces.
|
12
|
-
# * fileName, lineNumber, methodName available to appender layouts via
|
15
|
+
# * fileName, lineNumber, methodName available to appender layouts via
|
16
|
+
# * MDC variables(e.g. %X{lineNumber})
|
13
17
|
class Logger
|
14
|
-
|
15
|
-
Java::org.apache.log4j.Level::DEBUG => ::Logger::DEBUG,
|
16
|
-
Java::org.apache.log4j.Level::INFO => ::Logger::INFO,
|
17
|
-
Java::org.apache.log4j.Level::WARN => ::Logger::WARN,
|
18
|
-
Java::org.apache.log4j.Level::ERROR => ::Logger::ERROR,
|
19
|
-
Java::org.apache.log4j.Level::FATAL => ::Logger::FATAL,
|
20
|
-
}
|
21
|
-
|
22
|
-
# turn tracing on to make fileName, lineNumber, and methodName available to
|
23
|
-
# appender layout through MDC(ie. %X{fileName} %X{lineNumber} %X{methodName})
|
24
|
-
attr_accessor :tracing
|
25
|
-
|
26
|
-
# ::Logger::Formatter
|
27
|
-
attr_accessor :formatter
|
18
|
+
Support::LogManager.configure(logger_class: self)
|
28
19
|
|
29
20
|
class << self
|
30
21
|
# get Logger for name
|
31
22
|
def[](name)
|
32
|
-
name = name.nil? ?
|
33
|
-
|
34
|
-
fetch_logger(log4j)
|
23
|
+
name = name.nil? ? root.name : "#{root.name}.#{name.gsub('::', '.')}"
|
24
|
+
Support::LogManager.get_or_create(name)
|
35
25
|
end
|
36
26
|
|
37
27
|
# same as [] but accepts attributes
|
@@ -43,193 +33,139 @@ module Log4jruby
|
|
43
33
|
|
44
34
|
# Return root Logger(i.e. jruby)
|
45
35
|
def root
|
46
|
-
|
47
|
-
fetch_logger(log4j)
|
48
|
-
end
|
49
|
-
|
50
|
-
def reset # :nodoc:
|
51
|
-
Java::org.apache.log4j.LogManager.getCurrentLoggers.each do |l|
|
52
|
-
l.ruby_logger = nil
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def fetch_logger(log4j_logger)
|
59
|
-
Java::org.apache.log4j.Logger.getLogger(log4j_logger.getName).ruby_logger
|
36
|
+
Support::LogManager.root
|
60
37
|
end
|
61
38
|
end
|
62
39
|
|
63
40
|
def attributes=(values)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
send(setter, v) if respond_to?(setter)
|
68
|
-
end
|
41
|
+
values&.each_pair do |k, v|
|
42
|
+
setter = "#{k}="
|
43
|
+
send(setter, v) if respond_to?(setter)
|
69
44
|
end
|
70
45
|
end
|
71
46
|
|
47
|
+
def name
|
48
|
+
log4j_logger.name
|
49
|
+
end
|
50
|
+
|
72
51
|
# Shortcut for setting log levels. (:debug, :info, :warn, :error, :fatal)
|
73
52
|
def level=(level)
|
74
|
-
@
|
75
|
-
when :debug, ::Logger::DEBUG
|
76
|
-
Java::org.apache.log4j.Level::DEBUG
|
77
|
-
when :info, ::Logger::INFO
|
78
|
-
Java::org.apache.log4j.Level::INFO
|
79
|
-
when :warn, ::Logger::WARN
|
80
|
-
Java::org.apache.log4j.Level::WARN
|
81
|
-
when :error, ::Logger::ERROR
|
82
|
-
Java::org.apache.log4j.Level::ERROR
|
83
|
-
when :fatal, ::Logger::FATAL
|
84
|
-
Java::org.apache.log4j.Level::FATAL
|
85
|
-
else
|
86
|
-
raise NotImplementedError
|
87
|
-
end
|
53
|
+
@log4j_logger.level = Support::Levels.log4j_level(level)
|
88
54
|
end
|
89
55
|
|
90
56
|
def level
|
91
|
-
|
57
|
+
Support::Levels.ruby_logger_level(@log4j_logger.level)
|
92
58
|
end
|
93
59
|
|
94
60
|
def flush
|
95
|
-
#rails compatability
|
61
|
+
# rails compatability
|
96
62
|
end
|
97
63
|
|
98
64
|
def debug(object = nil, &block)
|
99
|
-
if debug?
|
100
|
-
send_to_log4j(:debug, object, nil, &block)
|
101
|
-
end
|
65
|
+
send_to_log4j(:debug, object, &block) if debug?
|
102
66
|
end
|
103
67
|
|
104
68
|
def info(object = nil, &block)
|
105
|
-
if info?
|
106
|
-
send_to_log4j(:info, object, nil, &block)
|
107
|
-
end
|
69
|
+
send_to_log4j(:info, object, &block) if info?
|
108
70
|
end
|
109
71
|
|
110
72
|
def warn(object = nil, &block)
|
111
|
-
if warn?
|
112
|
-
send_to_log4j(:warn, object, nil, &block)
|
113
|
-
end
|
73
|
+
send_to_log4j(:warn, object, &block) if warn?
|
114
74
|
end
|
115
75
|
|
116
76
|
def error(object = nil, &block)
|
117
|
-
send_to_log4j(:error, object,
|
77
|
+
send_to_log4j(:error, object, &block)
|
118
78
|
end
|
119
79
|
|
120
80
|
def log_error(msg, error)
|
121
|
-
send_to_log4j(:error, msg
|
81
|
+
send_to_log4j(:error, msg) { error }
|
122
82
|
end
|
123
83
|
|
124
84
|
def fatal(object = nil, &block)
|
125
|
-
send_to_log4j(:fatal, object,
|
85
|
+
send_to_log4j(:fatal, object, &block)
|
126
86
|
end
|
127
87
|
|
128
88
|
def log_fatal(msg, error)
|
129
|
-
send_to_log4j(:fatal, msg
|
89
|
+
send_to_log4j(:fatal, msg) { error }
|
130
90
|
end
|
131
91
|
|
132
|
-
# return org.apache.log4j.Logger instance backing this Logger
|
133
|
-
|
134
|
-
@logger
|
135
|
-
end
|
92
|
+
# return org.apache.logging.log4j.Logger instance backing this Logger
|
93
|
+
attr_reader :log4j_logger
|
136
94
|
|
137
95
|
def debug?
|
138
|
-
@
|
96
|
+
@log4j_logger.isEnabled(Java::org.apache.logging.log4j.Level::DEBUG)
|
139
97
|
end
|
140
98
|
|
141
99
|
def info?
|
142
|
-
@
|
100
|
+
@log4j_logger.isEnabled(Java::org.apache.logging.log4j.Level::INFO)
|
143
101
|
end
|
144
102
|
|
145
103
|
def warn?
|
146
|
-
@
|
104
|
+
@log4j_logger.isEnabled(Java::org.apache.logging.log4j.Level::WARN)
|
147
105
|
end
|
148
106
|
|
149
107
|
def tracing?
|
150
|
-
return @
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
108
|
+
return @tracing if defined?(@tracing)
|
109
|
+
|
110
|
+
@tracing = self == Logger.root ? false : parent.tracing?
|
111
|
+
end
|
112
|
+
alias tracing tracing?
|
113
|
+
|
114
|
+
# turn tracing on to make fileName, lineNumber, and methodName available to
|
115
|
+
# appender layout through MDC(ie. %X{fileName} %X{lineNumber} %X{methodName})
|
116
|
+
def tracing=(bool)
|
117
|
+
@tracing = !!bool
|
158
118
|
end
|
159
119
|
|
160
|
-
def
|
120
|
+
def formatter
|
161
121
|
return @formatter if defined?(@formatter)
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
end
|
122
|
+
|
123
|
+
@formatter = if self == Logger.root
|
124
|
+
->(_severity, _datetime, progname, msg) { "-- #{progname}: #{msg}" }
|
125
|
+
else
|
126
|
+
parent.formatter
|
127
|
+
end
|
169
128
|
end
|
170
129
|
|
130
|
+
# @param [::Logger::Formatter]
|
131
|
+
attr_writer :formatter
|
132
|
+
|
171
133
|
def parent
|
172
|
-
|
134
|
+
Support::LogManager.parent(log4j_logger.name)
|
173
135
|
end
|
174
136
|
|
175
137
|
# Compatibility with ActiveSupport::Logger
|
176
138
|
# needed to use a Log4jruby::Logger as an ActiveRecord::Base.logger
|
177
|
-
def silence(temporary_level = ::Logger::ERROR)
|
178
|
-
|
179
|
-
old_logger_level, self.level = level, temporary_level
|
180
|
-
yield self
|
181
|
-
ensure
|
182
|
-
self.level = old_logger_level
|
183
|
-
end
|
139
|
+
def silence(temporary_level = ::Logger::ERROR, &blk)
|
140
|
+
with_level(temporary_level, &blk)
|
184
141
|
end
|
185
142
|
|
186
|
-
|
143
|
+
def with_level(temporary_level = ::Logger::ERROR)
|
144
|
+
old_logger_level = level
|
145
|
+
self.level = temporary_level
|
146
|
+
yield self
|
147
|
+
ensure
|
148
|
+
self.level = old_logger_level
|
149
|
+
end
|
187
150
|
|
188
151
|
def initialize(logger) # :nodoc:
|
189
|
-
@
|
152
|
+
@log4j_logger = logger
|
190
153
|
end
|
191
154
|
|
192
|
-
|
193
|
-
file_line_method = parse_caller(caller(3).first)
|
194
|
-
|
195
|
-
mdc.put('fileName', file_line_method[0])
|
196
|
-
mdc.put('lineNumber', file_line_method[1])
|
197
|
-
mdc.put('methodName', file_line_method[2].to_s)
|
198
|
-
|
199
|
-
begin
|
200
|
-
yield
|
201
|
-
ensure
|
202
|
-
mdc.remove('fileName')
|
203
|
-
mdc.remove('lineNumber')
|
204
|
-
mdc.remove('methodName')
|
205
|
-
end
|
206
|
-
end
|
155
|
+
private
|
207
156
|
|
208
|
-
def send_to_log4j(level, object,
|
209
|
-
msg, throwable = Support::Log4jArgs.convert(object,
|
210
|
-
if (f =
|
211
|
-
msg = f.call(level, Time.now,
|
157
|
+
def send_to_log4j(level, object, &block)
|
158
|
+
progname, msg, throwable = Support::Log4jArgs.convert(object, &block)
|
159
|
+
if (f = formatter)
|
160
|
+
msg = f.call(level, Time.now, progname, msg)
|
212
161
|
end
|
213
162
|
if tracing?
|
214
|
-
|
215
|
-
@
|
163
|
+
Support::Location.with_location do
|
164
|
+
@log4j_logger.send(level, msg, throwable)
|
216
165
|
end
|
217
166
|
else
|
218
|
-
@
|
167
|
+
@log4j_logger.send(level, msg, throwable)
|
219
168
|
end
|
220
169
|
end
|
221
|
-
|
222
|
-
def parse_caller(at) # :nodoc:
|
223
|
-
at.match(/^(.+?):(\d+)(?::in `(.*)')?/).captures
|
224
|
-
end
|
225
|
-
|
226
|
-
def mdc
|
227
|
-
Java::org.apache.log4j.MDC
|
228
|
-
end
|
229
|
-
|
230
|
-
def fetch_logger(log4j_logger)
|
231
|
-
self.class.send(:fetch_logger, log4j_logger)
|
232
|
-
end
|
233
170
|
end
|
234
171
|
end
|
235
|
-
|
@@ -1,19 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'log4jruby'
|
2
4
|
|
3
5
|
module Log4jruby
|
4
|
-
|
5
|
-
# Gives class its own Logger and makes it available via class and instance method.
|
6
|
+
# Gives class its own Logger and makes it available via class and instance method.
|
6
7
|
module LoggerForClass
|
7
|
-
|
8
8
|
def self.included(klass)
|
9
9
|
def klass.logger
|
10
10
|
@logger ||= Logger.get(name)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def klass.logger=(logger)
|
14
14
|
@logger = logger
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def klass.set_logger(name, options = {})
|
18
18
|
@logger = Logger.get(name, options)
|
19
19
|
end
|
@@ -23,4 +23,4 @@ module Log4jruby
|
|
23
23
|
self.class.logger
|
24
24
|
end
|
25
25
|
end
|
26
|
-
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Log4jruby
|
6
|
+
module Support
|
7
|
+
# Utility methods for dealing with log levels
|
8
|
+
class Levels
|
9
|
+
LOG4J_LEVELS = {
|
10
|
+
Java::org.apache.logging.log4j.Level::DEBUG => ::Logger::DEBUG,
|
11
|
+
Java::org.apache.logging.log4j.Level::INFO => ::Logger::INFO,
|
12
|
+
Java::org.apache.logging.log4j.Level::WARN => ::Logger::WARN,
|
13
|
+
Java::org.apache.logging.log4j.Level::ERROR => ::Logger::ERROR,
|
14
|
+
Java::org.apache.logging.log4j.Level::FATAL => ::Logger::FATAL
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def ruby_logger_level(log4j_level)
|
19
|
+
LOG4J_LEVELS[log4j_level]
|
20
|
+
end
|
21
|
+
|
22
|
+
# rubocop:disable Metrics/AbcSize
|
23
|
+
def log4j_level(ruby_logger_level)
|
24
|
+
case ruby_logger_level
|
25
|
+
when :debug, ::Logger::DEBUG
|
26
|
+
Java::org.apache.logging.log4j.Level::DEBUG
|
27
|
+
when :info, ::Logger::INFO
|
28
|
+
Java::org.apache.logging.log4j.Level::INFO
|
29
|
+
when :warn, ::Logger::WARN
|
30
|
+
Java::org.apache.logging.log4j.Level::WARN
|
31
|
+
when :error, ::Logger::ERROR
|
32
|
+
Java::org.apache.logging.log4j.Level::ERROR
|
33
|
+
when :fatal, ::Logger::FATAL
|
34
|
+
Java::org.apache.logging.log4j.Level::FATAL
|
35
|
+
when nil
|
36
|
+
# noop
|
37
|
+
else
|
38
|
+
raise NotImplementedError
|
39
|
+
end
|
40
|
+
end
|
41
|
+
# rubocop:enable Metrics/AbcSize
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Log4jruby
|
4
|
+
module Support
|
5
|
+
# Utility methods for interacting with Log4j
|
6
|
+
# MDC (mapped diagnostic contexts)
|
7
|
+
# https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
|
8
|
+
class Location
|
9
|
+
class << self
|
10
|
+
def with_location # :nodoc:
|
11
|
+
file_line_method = parse_caller(caller(3).first)
|
12
|
+
context_put(file_line_method)
|
13
|
+
begin
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
context_remove
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def context_put((file, line, method))
|
23
|
+
thread_context.put('fileName', file)
|
24
|
+
thread_context.put('lineNumber', line)
|
25
|
+
thread_context.put('methodName', method.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
def context_remove
|
29
|
+
thread_context.remove('fileName')
|
30
|
+
thread_context.remove('lineNumber')
|
31
|
+
thread_context.remove('methodName')
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_caller(at) # :nodoc:
|
35
|
+
at.match(/^(.+?):(\d+)(?::in `(.*)')?/).captures
|
36
|
+
end
|
37
|
+
|
38
|
+
def thread_context
|
39
|
+
Java::org.apache.logging.log4j.ThreadContext
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,40 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Log4jruby
|
2
4
|
module Support
|
5
|
+
# Translate logger args for use by Ruby Logger formatter and log4j.
|
6
|
+
# Intention is to matches the Ruby Logger for common parameters
|
3
7
|
class Log4jArgs
|
4
8
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
exception = nil
|
24
|
-
end
|
9
|
+
# Adapt permutations of ruby Logger arguments into arguments
|
10
|
+
# for Log4j Logger with explicit throwable when possible.
|
11
|
+
#
|
12
|
+
# The :progname and :msg returned by this method matches
|
13
|
+
# the arguments that would be passed to a
|
14
|
+
# Ruby Logger#formatter
|
15
|
+
#
|
16
|
+
# @param object [String | Exception] - Correlates to the `progname` param of the
|
17
|
+
# ruby Logger. Exception passed to Log4j as throwable when no other
|
18
|
+
# arguments are provided.
|
19
|
+
# @yield [] Return object to be used as the :msg (See Ruby ::Logger). Exceptions
|
20
|
+
# will be used as Throwable arg to log4j.
|
21
|
+
#
|
22
|
+
# @return [Array<Object, Object, Java::Throwable>] -
|
23
|
+
# Ruby Logger progname, Ruby Logger msg, throwable for log4j
|
24
|
+
def convert(object = nil)
|
25
|
+
# This implementation is very complex in order to support
|
26
|
+
yielded_val = block_given? ? yield : nil
|
25
27
|
|
26
|
-
|
28
|
+
exception = exception(yielded_val) || exception(object)
|
29
|
+
msg = yielded_val || object || exception
|
30
|
+
[progname(object, yielded_val), msg, exception&.to_java]
|
27
31
|
end
|
28
32
|
|
29
33
|
private
|
30
34
|
|
31
|
-
def
|
32
|
-
|
35
|
+
def progname(object, yielded_val)
|
36
|
+
object && yielded_val ? object : nil
|
33
37
|
end
|
34
38
|
|
35
|
-
def
|
36
|
-
|
37
|
-
msg.lstrip!
|
39
|
+
def exception(obj)
|
40
|
+
obj.is_a?(::Exception) || obj.is_a?(Java::java.lang.Throwable) ? obj : nil
|
38
41
|
end
|
39
42
|
end
|
40
43
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Log4jruby
|
6
|
+
module Support
|
7
|
+
# Internal class for tracking loggers in a thread safe manor
|
8
|
+
class LogManager
|
9
|
+
@loggers = {}
|
10
|
+
@mutex = Mutex.new.freeze
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_reader :logger_class
|
14
|
+
|
15
|
+
def configure(logger_class:)
|
16
|
+
@logger_class = logger_class
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_or_create(name)
|
20
|
+
raise 'name required' if name.to_s.match?(/^\s+$/)
|
21
|
+
|
22
|
+
@mutex.synchronize do
|
23
|
+
@loggers[name] ||= new_logger(name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(name)
|
28
|
+
@mutex.synchronize { @loggers[name] }
|
29
|
+
end
|
30
|
+
|
31
|
+
# nodoc: testing only
|
32
|
+
def reset
|
33
|
+
@mutex.synchronize { @loggers.clear }
|
34
|
+
Java::org.apache.logging.log4j.LogManager.rootLogger.context.stop
|
35
|
+
end
|
36
|
+
|
37
|
+
def root
|
38
|
+
get_or_create('jruby')
|
39
|
+
end
|
40
|
+
|
41
|
+
def parent(name)
|
42
|
+
_parent(name.split('.'))
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def new_logger(name)
|
48
|
+
log4j_logger = Java::org.apache.logging.log4j.LogManager.getLogger(name)
|
49
|
+
@logger_class.new(log4j_logger)
|
50
|
+
end
|
51
|
+
|
52
|
+
def _parent(name_path)
|
53
|
+
return root if name_path.empty?
|
54
|
+
|
55
|
+
parent_path = name_path[0, name_path.size - 1]
|
56
|
+
parent_name = parent_path.join('.')
|
57
|
+
|
58
|
+
get(parent_name) || _parent(parent_path)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/log4jruby/version.rb
CHANGED
data/lib/log4jruby.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: log4jruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.rc1
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Lenny Marks
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Ruby Logger using Log4j, geared toward those who use JRuby to write Ruby
|
13
|
+
description: Ruby Logger using Log4j, geared toward those who use JRuby to write Ruby
|
14
|
+
code using/extending Java code. Ruby and Java are configured together using traditional
|
15
|
+
Log4j methods.
|
14
16
|
email:
|
15
17
|
- lenny@aps.org
|
16
18
|
executables: []
|
@@ -22,31 +24,37 @@ files:
|
|
22
24
|
- lib/log4jruby.rb
|
23
25
|
- lib/log4jruby/logger.rb
|
24
26
|
- lib/log4jruby/logger_for_class.rb
|
25
|
-
- lib/log4jruby/support/
|
27
|
+
- lib/log4jruby/support/levels.rb
|
28
|
+
- lib/log4jruby/support/location.rb
|
26
29
|
- lib/log4jruby/support/log4j_args.rb
|
30
|
+
- lib/log4jruby/support/log_manager.rb
|
27
31
|
- lib/log4jruby/version.rb
|
28
32
|
homepage: https://github.com/lenny/log4jruby
|
29
33
|
licenses:
|
30
34
|
- MIT
|
31
|
-
metadata:
|
35
|
+
metadata:
|
36
|
+
rubygems_mfa_required: 'true'
|
32
37
|
post_install_message:
|
33
38
|
rdoc_options: []
|
34
39
|
require_paths:
|
35
40
|
- lib
|
36
41
|
required_ruby_version: !ruby/object:Gem::Requirement
|
37
42
|
requirements:
|
38
|
-
- - "
|
43
|
+
- - "~>"
|
39
44
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
45
|
+
version: 2.6.8
|
41
46
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
47
|
requirements:
|
43
|
-
- - "
|
48
|
+
- - ">"
|
44
49
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
50
|
+
version: 1.3.1
|
46
51
|
requirements: []
|
47
|
-
|
48
|
-
rubygems_version: 2.4.8
|
52
|
+
rubygems_version: 3.2.29
|
49
53
|
signing_key:
|
50
54
|
specification_version: 4
|
51
|
-
summary: Log4jruby is a thin wrapper around the Log4j Logger. It is geared more toward those
|
55
|
+
summary: Log4jruby is a thin wrapper around the Log4j Logger. It is geared more toward those
|
56
|
+
who are using JRuby to integrate with and build on top of Java code that uses Log4j.
|
57
|
+
The Log4jruby::Logger provides an interface much like the standard ruby Logger.
|
58
|
+
Your ruby loggers are given a .jruby prefix and can be configured along with the
|
59
|
+
loggers for your Java code.
|
52
60
|
test_files: []
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
|
-
Java::org.apache.log4j.Logger.class_eval do
|
4
|
-
attr_accessor :ruby_logger
|
5
|
-
@ruby_logger_lock = Mutex.new
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def ruby_logger_lock
|
9
|
-
@ruby_logger_lock
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def ruby_logger
|
14
|
-
self.class.ruby_logger_lock.synchronize do
|
15
|
-
@ruby_logger ||= Log4jruby::Logger.new(self)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# https://github.com/lenny/log4jruby/issues/14
|
21
|
-
# https://github.com/jruby/jruby/wiki/Persistence
|
22
|
-
if Java::org.apache.log4j.Logger.respond_to?(:__persistent__)
|
23
|
-
Java::org.apache.log4j.Logger.__persistent__ = true
|
24
|
-
end
|
25
|
-
|