|
5 | 5 |
|
6 | 6 | package aws.smithy.kotlin.runtime.telemetry.logging.slf4j |
7 | 7 |
|
8 | | -import aws.smithy.kotlin.runtime.telemetry.context.Context |
9 | 8 | import aws.smithy.kotlin.runtime.telemetry.logging.* |
10 | 9 | import org.slf4j.LoggerFactory |
11 | | -import org.slf4j.event.Level |
12 | | -import org.slf4j.spi.LoggingEventBuilder |
13 | 10 |
|
14 | 11 | /** |
15 | | - * SLF4J 2 based logger provider |
| 12 | + * SLF4J based logger provider |
16 | 13 | */ |
17 | 14 | public object Slf4jLoggerProvider : LoggerProvider { |
18 | | - override fun getOrCreateLogger(name: String): Logger { |
19 | | - val sl4fjLogger = LoggerFactory.getLogger(name) |
20 | | - return Slf4JLoggerAdapter(sl4fjLogger) |
21 | | - } |
22 | | -} |
23 | | - |
24 | | -private class Slf4JLoggerAdapter(private val delegate: org.slf4j.Logger) : Logger { |
25 | | - private fun logWith(t: Throwable?, msg: () -> String, builder: LoggingEventBuilder) = |
26 | | - builder.setMessage(msg) |
27 | | - .apply { |
28 | | - if (t != null) { |
29 | | - setCause(t) |
30 | | - } |
31 | | - }.log() |
32 | | - override fun trace(t: Throwable?, msg: () -> String) = logWith(t, msg, delegate.atTrace()) |
33 | | - override fun debug(t: Throwable?, msg: () -> String) = logWith(t, msg, delegate.atDebug()) |
34 | | - override fun info(t: Throwable?, msg: () -> String) = logWith(t, msg, delegate.atInfo()) |
35 | | - override fun warn(t: Throwable?, msg: () -> String) = logWith(t, msg, delegate.atWarn()) |
36 | | - override fun error(t: Throwable?, msg: () -> String) = logWith(t, msg, delegate.atError()) |
37 | | - override fun isEnabledFor(level: LogLevel): Boolean = |
38 | | - delegate.isEnabledForLevel(level.slf4jLevel) |
39 | | - |
40 | | - override fun atLevel(level: LogLevel): LogRecordBuilder = |
41 | | - Slf4jLogRecordBuilderAdapter(delegate.atLevel(level.slf4jLevel)) |
42 | | -} |
43 | | - |
44 | | -private class Slf4jLogRecordBuilderAdapter( |
45 | | - private val delegate: LoggingEventBuilder, |
46 | | -) : LogRecordBuilder { |
47 | | - override fun setCause(ex: Throwable) { |
48 | | - delegate.setCause(ex) |
49 | | - } |
50 | 15 |
|
51 | | - override fun setMessage(message: String) { |
52 | | - delegate.setMessage(message) |
| 16 | + private val useSlf4j2x = try { |
| 17 | + Class.forName("org.slf4j.spi.LoggingEventBuilder") |
| 18 | + true |
| 19 | + } catch (ex: ClassNotFoundException) { |
| 20 | + LoggerFactory.getLogger(Slf4jLoggerProvider::class.java).warn("falling back to SLF4J 1.x compatible binding") |
| 21 | + false |
53 | 22 | } |
54 | 23 |
|
55 | | - override fun setMessage(message: () -> String) { |
56 | | - delegate.setMessage(message) |
57 | | - } |
58 | | - |
59 | | - override fun setKeyValuePair(key: String, value: Any) { |
60 | | - delegate.addKeyValue(key, value) |
61 | | - } |
62 | | - |
63 | | - override fun setContext(context: Context) { |
64 | | - // TODO - add a way to get the current trace context and set the key/value pair on it? |
| 24 | + override fun getOrCreateLogger(name: String): Logger { |
| 25 | + val sl4fjLogger = LoggerFactory.getLogger(name) |
| 26 | + return if (useSlf4j2x) { |
| 27 | + Slf4j2xLoggerAdapter(sl4fjLogger) |
| 28 | + } else { |
| 29 | + Slf4j1xLoggerAdapter(sl4fjLogger) |
| 30 | + } |
65 | 31 | } |
66 | | - |
67 | | - override fun emit() = delegate.log() |
68 | 32 | } |
69 | | - |
70 | | -private val LogLevel.slf4jLevel: org.slf4j.event.Level |
71 | | - get() = when (this) { |
72 | | - LogLevel.Error -> Level.ERROR |
73 | | - LogLevel.Warning -> Level.WARN |
74 | | - LogLevel.Info -> Level.INFO |
75 | | - LogLevel.Debug -> Level.DEBUG |
76 | | - LogLevel.Trace -> Level.TRACE |
77 | | - } |
0 commit comments