@@ -53,7 +53,7 @@ import kotlin.reflect.KClass
53
53
@kotlin.jvm.JvmInline // Inline value class, to wrap the underlying platform logger without overhead
54
54
public value class Logger
55
55
internal constructor (
56
- @PublishedApi internal val underlyingLogger: PlatformLogger ,
56
+ internal val underlyingLogger: PlatformLogger ,
57
57
) {
58
58
/* *
59
59
* Calls the given lambda to build a log message, and logs it at [LogLevel.INFO], if enabled.
@@ -96,8 +96,10 @@ internal constructor(
96
96
cause : Throwable ? = null,
97
97
buildLog : LogBuilder .() -> String ,
98
98
) {
99
- if (underlyingLogger.isInfoEnabled()) {
100
- log(LogLevel .INFO , cause, buildLog)
99
+ if (isInfoEnabled) {
100
+ val builder = createLogBuilder(LogLevel .INFO , this )
101
+ val message = builder.buildLog()
102
+ log(builder, message, cause)
101
103
}
102
104
}
103
105
@@ -146,8 +148,10 @@ internal constructor(
146
148
cause : Throwable ? = null,
147
149
buildLog : LogBuilder .() -> String ,
148
150
) {
149
- if (underlyingLogger.isWarnEnabled()) {
150
- log(LogLevel .WARN , cause, buildLog)
151
+ if (isWarnEnabled) {
152
+ val builder = createLogBuilder(LogLevel .WARN , this )
153
+ val message = builder.buildLog()
154
+ log(builder, message, cause)
151
155
}
152
156
}
153
157
@@ -196,8 +200,10 @@ internal constructor(
196
200
cause : Throwable ? = null,
197
201
buildLog : LogBuilder .() -> String ,
198
202
) {
199
- if (underlyingLogger.isErrorEnabled()) {
200
- log(LogLevel .ERROR , cause, buildLog)
203
+ if (isErrorEnabled) {
204
+ val builder = createLogBuilder(LogLevel .ERROR , this )
205
+ val message = builder.buildLog()
206
+ log(builder, message, cause)
201
207
}
202
208
}
203
209
@@ -242,8 +248,10 @@ internal constructor(
242
248
cause : Throwable ? = null,
243
249
buildLog : LogBuilder .() -> String ,
244
250
) {
245
- if (underlyingLogger.isDebugEnabled()) {
246
- log(LogLevel .DEBUG , cause, buildLog)
251
+ if (isDebugEnabled) {
252
+ val builder = createLogBuilder(LogLevel .DEBUG , this )
253
+ val message = builder.buildLog()
254
+ log(builder, message, cause)
247
255
}
248
256
}
249
257
@@ -288,8 +296,10 @@ internal constructor(
288
296
cause : Throwable ? = null,
289
297
buildLog : LogBuilder .() -> String ,
290
298
) {
291
- if (underlyingLogger.isTraceEnabled()) {
292
- log(LogLevel .TRACE , cause, buildLog)
299
+ if (isTraceEnabled) {
300
+ val builder = createLogBuilder(LogLevel .TRACE , this )
301
+ val message = builder.buildLog()
302
+ log(builder, message, cause)
293
303
}
294
304
}
295
305
@@ -344,24 +354,23 @@ internal constructor(
344
354
buildLog : LogBuilder .() -> String ,
345
355
) {
346
356
if (isEnabledFor(level)) {
347
- log(level, cause, buildLog)
357
+ val builder = createLogBuilder(level, this )
358
+ val message = builder.buildLog()
359
+ log(builder, message, cause)
348
360
}
349
361
}
350
362
351
363
@PublishedApi
352
- internal inline fun log (
353
- level : LogLevel ,
364
+ internal fun log (
365
+ logBuilder : LogBuilder ,
366
+ message : String ,
354
367
cause : Throwable ? ,
355
- buildLog : LogBuilder .() -> String ,
356
368
) {
357
- val builder = LogBuilder (createLogEvent(level, underlyingLogger))
358
- val message = builder.buildLog()
359
369
if (cause != null ) {
360
- // Call this after buildLog(), so cause exception fields don't overwrite LogBuilder fields
361
- builder.setCause(cause, underlyingLogger)
370
+ logBuilder.setCause(cause, underlyingLogger)
362
371
}
363
372
364
- builder .logEvent.log(message, underlyingLogger)
373
+ logBuilder .logEvent.log(message, underlyingLogger)
365
374
}
366
375
367
376
/* *
@@ -372,7 +381,7 @@ internal constructor(
372
381
* [Logback configuration docs](https://logback.qos.ch/manual/configuration.html#loggerElement)).
373
382
*/
374
383
public val isErrorEnabled: Boolean
375
- inline get() = underlyingLogger.isErrorEnabled()
384
+ get() = underlyingLogger.isErrorEnabled()
376
385
377
386
/* *
378
387
* Returns true if [LogLevel.WARN] is enabled for this logger.
@@ -382,7 +391,7 @@ internal constructor(
382
391
* [Logback configuration docs](https://logback.qos.ch/manual/configuration.html#loggerElement)).
383
392
*/
384
393
public val isWarnEnabled: Boolean
385
- inline get() = underlyingLogger.isWarnEnabled()
394
+ get() = underlyingLogger.isWarnEnabled()
386
395
387
396
/* *
388
397
* Returns true if [LogLevel.INFO] is enabled for this logger.
@@ -392,7 +401,7 @@ internal constructor(
392
401
* [Logback configuration docs](https://logback.qos.ch/manual/configuration.html#loggerElement)).
393
402
*/
394
403
public val isInfoEnabled: Boolean
395
- inline get() = underlyingLogger.isInfoEnabled()
404
+ get() = underlyingLogger.isInfoEnabled()
396
405
397
406
/* *
398
407
* Returns true if [LogLevel.DEBUG] is enabled for this logger.
@@ -402,7 +411,7 @@ internal constructor(
402
411
* [Logback configuration docs](https://logback.qos.ch/manual/configuration.html#loggerElement)).
403
412
*/
404
413
public val isDebugEnabled: Boolean
405
- inline get() = underlyingLogger.isDebugEnabled()
414
+ get() = underlyingLogger.isDebugEnabled()
406
415
407
416
/* *
408
417
* Returns true if [LogLevel.TRACE] is enabled for this logger.
@@ -412,7 +421,7 @@ internal constructor(
412
421
* [Logback configuration docs](https://logback.qos.ch/manual/configuration.html#loggerElement)).
413
422
*/
414
423
public val isTraceEnabled: Boolean
415
- inline get() = underlyingLogger.isTraceEnabled()
424
+ get() = underlyingLogger.isTraceEnabled()
416
425
417
426
/* *
418
427
* Returns true if the given log level is enabled for this logger.
@@ -525,7 +534,6 @@ public expect fun getLogger(name: String): Logger
525
534
*
526
535
* On the JVM, we use SLF4J as the underlying logger.
527
536
*/
528
- @PublishedApi
529
537
internal expect interface PlatformLogger {
530
538
fun getName (): String
531
539
@@ -561,3 +569,13 @@ internal fun normalizeLoggerName(name: String?): String {
561
569
else -> name
562
570
}
563
571
}
572
+
573
+ /* *
574
+ * SLF4J has the concept of a "caller boundary": the fully qualified class name of the logger class
575
+ * that made the log. This is used by logger implementations, such as Logback, when the user enables
576
+ * "caller info": showing the location in the source code where the log was made. Logback then knows
577
+ * to exclude stack trace elements up to this caller boundary, since the user wants to see where in
578
+ * _their_ code the log was made, not the location in the logging library. In our case, our boundary
579
+ * is the [Logger] class.
580
+ */
581
+ internal const val LOGGER_CLASS_NAME = " dev.hermannm.devlog.Logger"
0 commit comments