From ba33441e8cbf0d452a63bcdd0491cda091ce6894 Mon Sep 17 00:00:00 2001 From: Alex Liubymov Date: Tue, 8 Aug 2023 18:06:00 +0300 Subject: [PATCH 1/2] Check JUL log entry params on null. --- .../logstage/adapter/jul/LogstageJulLogger.scala | 16 +++++++++------- .../test/scala/izumi/logstage/sink/JULTest.scala | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala b/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala index 5a6570ef66..bbba5c5eb3 100644 --- a/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala +++ b/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala @@ -42,25 +42,27 @@ class LogstageJulLogger(router: LogRouter) extends java.util.logging.Handler wit @inline private[this] def mkEntry(record: LogRecord): Log.Entry = { - val id = Log.LoggerId(record.getLoggerName) + val loggerName = if (record.getLoggerName == null) "unknown" else record.getLoggerName + val id = Log.LoggerId(loggerName) val thread = Thread.currentThread() val ctx = Log.StaticExtendedContext(id, SourceFilePosition.unknown) val threadData = Log.ThreadData(thread.getName, thread.getId) - val allParams = if (record.getThrown == null) { - record.getParameters.toSeq - } else { - record.getParameters.toSeq ++ Seq(record.getThrown) - } + val params = if (record.getParameters == null) Seq.empty else record.getParameters.toSeq + val allParams = if (record.getThrown == null) params else params ++ Seq(record.getThrown) val messageArgs = allParams.zipWithIndex.map { kv => Log.LogArg(Seq(s"_${kv._2}"), kv._1, hiddenName = true, None) } - val template = record.getMessage.split("\\{\\d+\\}", -1).map(_.replace("\\", "\\\\")) + val template = if (record.getMessage == null) { + Array.empty + } else { + record.getMessage.split("\\{\\d+\\}", -1).map(_.replace("\\", "\\\\")) + } val level = toLevel(record) Log.Entry( diff --git a/logstage/logstage-core/.jvm/src/test/scala/izumi/logstage/sink/JULTest.scala b/logstage/logstage-core/.jvm/src/test/scala/izumi/logstage/sink/JULTest.scala index aee94841a1..28bea7eb8f 100644 --- a/logstage/logstage-core/.jvm/src/test/scala/izumi/logstage/sink/JULTest.scala +++ b/logstage/logstage-core/.jvm/src/test/scala/izumi/logstage/sink/JULTest.scala @@ -17,6 +17,8 @@ class JULTest extends AnyWordSpec { val julogger = Logger.getLogger(getClass.getName) val arr: Array[AnyRef] = Array("param1", "param2", new RuntimeException("param2")) julogger.log(Level.INFO, "message: {0} {1} {2}", arr) + julogger.log(Level.INFO, "message", null.asInstanceOf[Array[AnyRef]]) + julogger.log(Level.INFO, "message") } } From e3f7a6830e496a96941b93e221a665e842bb605b Mon Sep 17 00:00:00 2001 From: Alex Liubymov Date: Tue, 8 Aug 2023 19:02:00 +0300 Subject: [PATCH 2/2] use options --- .../logstage/adapter/jul/LogstageJulLogger.scala | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala b/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala index bbba5c5eb3..2433c9cb49 100644 --- a/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala +++ b/logstage/logstage-core/.jvm/src/main/scala/izumi/logstage/adapter/jul/LogstageJulLogger.scala @@ -42,7 +42,7 @@ class LogstageJulLogger(router: LogRouter) extends java.util.logging.Handler wit @inline private[this] def mkEntry(record: LogRecord): Log.Entry = { - val loggerName = if (record.getLoggerName == null) "unknown" else record.getLoggerName + val loggerName = Option(record.getLoggerName).getOrElse("unknown") val id = Log.LoggerId(loggerName) val thread = Thread.currentThread() @@ -50,19 +50,17 @@ class LogstageJulLogger(router: LogRouter) extends java.util.logging.Handler wit val ctx = Log.StaticExtendedContext(id, SourceFilePosition.unknown) val threadData = Log.ThreadData(thread.getName, thread.getId) - val params = if (record.getParameters == null) Seq.empty else record.getParameters.toSeq - val allParams = if (record.getThrown == null) params else params ++ Seq(record.getThrown) + val params = Option(record.getParameters).toSeq.flatten + val allParams = params ++ Option(record.getThrown).toSeq val messageArgs = allParams.zipWithIndex.map { kv => Log.LogArg(Seq(s"_${kv._2}"), kv._1, hiddenName = true, None) } - val template = if (record.getMessage == null) { - Array.empty - } else { - record.getMessage.split("\\{\\d+\\}", -1).map(_.replace("\\", "\\\\")) - } + val template = Option(record.getMessage) + .map(_.split("\\{\\d+\\}", -1).map(_.replace("\\", "\\\\"))) + .getOrElse(Array.empty[String]) val level = toLevel(record) Log.Entry(