Provide log-encoder option for trigger-runner and trigger-service to enable json logging

CHANGELOG_BEGIN
* JSON encoder support for trigger controlled via CLI option --log-encoder

CHANGELOG_END
This commit is contained in:
Carl Pulley 2022-11-09 16:46:45 +00:00 committed by GitHub
parent 4354c5d06b
commit c43ee235d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 127 additions and 23 deletions

View File

@ -1,9 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %replace(, context: %marker){', context: $', ''} %n</pattern>
</encoder>
<appender name="STDOUT" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender-ref ref="console" />
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<if condition='isDefined("LOG_FORMAT_JSON")'>
<then>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout"/>
</encoder>
</then>
<else>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %replace(, context: %marker){', context: $', ''} %n</pattern>
</encoder>
</else>
</if>
</appender>
<logger name="io.netty" level="WARN" />

View File

@ -19,6 +19,12 @@ import com.daml.lf.speedy.Compiler
import scala.concurrent.{ExecutionContext, Future}
sealed trait LogEncoder
object LogEncoder {
object Plain extends LogEncoder
object Json extends LogEncoder
}
case class RunnerConfig(
darPath: Path,
// If defined, we will only list the triggers in the DAR and exit.
@ -37,6 +43,7 @@ case class RunnerConfig(
compilerConfig: Compiler.Config,
triggerConfig: TriggerRunnerConfig,
rootLoggingLevel: Option[Level],
logEncoder: LogEncoder,
) {
private def updatePartySpec(f: TriggerParties => TriggerParties): RunnerConfig =
if (ledgerClaims == null) {
@ -233,6 +240,15 @@ object RunnerConfig {
.valueName("<LEVEL>")
.action((level, cli) => cli.copy(rootLoggingLevel = Some(level)))
opt[String]("log-encoder")
.text("Log encoder: plain|json")
.action {
case ("json", cli) => cli.copy(logEncoder = LogEncoder.Json)
case ("plain", cli) => cli.copy(logEncoder = LogEncoder.Plain)
case (other, _) =>
throw new IllegalArgumentException(s"Unsupported logging encoder $other")
}
opt[Unit]("dev-mode-unsafe")
.action((_, c) => c.copy(compilerConfig = Compiler.Config.Dev))
.optional()
@ -316,5 +332,6 @@ object RunnerConfig {
compilerConfig = DefaultCompilerConfig,
triggerConfig = DefaultTriggerRunnerConfig,
rootLoggingLevel = None,
logEncoder = LogEncoder.Plain,
)
}

View File

@ -59,7 +59,12 @@ object RunnerMain {
RunnerConfig.parse(args) match {
case None => sys.exit(1)
case Some(config) => {
config.rootLoggingLevel.foreach(setLoggingLevel("LOG_LEVEL_ROOT", _))
config.rootLoggingLevel.foreach(setLoggingLevel)
config.logEncoder match {
case LogEncoder.Plain =>
case LogEncoder.Json =>
discard(System.setProperty("LOG_FORMAT_JSON", "true"))
}
val dar: Dar[(PackageId, Package)] =
DarDecoder.assertReadArchiveFromFile(config.darPath.toFile)
@ -125,7 +130,7 @@ object RunnerMain {
}
}
private def setLoggingLevel(name: String, level: Level): Unit = {
discard(System.setProperty(name, level.levelStr))
private def setLoggingLevel(level: Level): Unit = {
discard(System.setProperty("LOG_LEVEL_ROOT", level.levelStr))
}
}

View File

@ -1,8 +1,21 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<appender name="STDOUT" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender-ref ref="console" />
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<if condition='isDefined("LOG_FORMAT_JSON")'>
<then>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout"/>
</encoder>
</then>
<else>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</else>
</if>
</appender>
<logger name="io.netty" level="WARN">

View File

@ -1,8 +1,21 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<appender name="STDOUT" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender-ref ref="console" />
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<if condition='isDefined("LOG_FORMAT_JSON")'>
<then>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout"/>
</encoder>
</then>
<else>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</else>
</if>
</appender>
<logger name="io.netty" level="WARN">

View File

@ -54,6 +54,7 @@ private[trigger] final case class Cli(
compilerConfig: Compiler.Config,
triggerConfig: TriggerRunnerConfig,
rootLoggingLevel: Option[Level],
logEncoder: LogEncoder,
) extends StrictLogging {
def loadFromConfigFile: Option[Either[ConfigReaderFailures, TriggerServiceAppConf]] =
@ -87,6 +88,7 @@ private[trigger] final case class Cli(
compilerConfig = compilerConfig,
triggerConfig = triggerConfig,
rootLoggingLevel = rootLoggingLevel,
logEncoder = logEncoder,
)
}
@ -160,6 +162,7 @@ private[trigger] object Cli {
compilerConfig = DefaultCompilerConfig,
triggerConfig = DefaultTriggerRunnerConfig,
rootLoggingLevel = None,
logEncoder = LogEncoder.Plain,
)
@SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) // scopt builders
@ -310,6 +313,15 @@ private[trigger] object Cli {
.valueName("<LEVEL>")
.action((level, cli) => cli.copy(rootLoggingLevel = Some(level)))
opt[String]("log-encoder")
.text("Log encoder: plain|json")
.action {
case ("json", cli) => cli.copy(logEncoder = LogEncoder.Json)
case ("plain", cli) => cli.copy(logEncoder = LogEncoder.Plain)
case (other, _) =>
throw new IllegalArgumentException(s"Unsupported logging encoder $other")
}
opt[Unit]("dev-mode-unsafe")
.action((_, c) => c.copy(compilerConfig = Compiler.Config.Dev))
.optional()

View File

@ -44,4 +44,5 @@ private[trigger] final case class ServiceConfig(
compilerConfig: Compiler.Config,
triggerConfig: TriggerRunnerConfig,
rootLoggingLevel: Option[Level],
logEncoder: LogEncoder,
)

View File

@ -95,7 +95,12 @@ object ServiceMain {
) match {
case None => sys.exit(1)
case Some(config) =>
config.rootLoggingLevel.foreach(setLoggingLevel("LOG_LEVEL_ROOT", _))
config.rootLoggingLevel.foreach(setLoggingLevel)
config.logEncoder match {
case LogEncoder.Plain =>
case LogEncoder.Json =>
discard(System.setProperty("LOG_FORMAT_JSON", "true"))
}
val logger = ContextualizedLogger.get(this.getClass)
val encodedDars: List[Dar[(PackageId, DamlLf.ArchivePayload)]] =
@ -200,7 +205,7 @@ object ServiceMain {
}
}
private def setLoggingLevel(name: String, level: Level): Unit = {
discard(System.setProperty(name, level.levelStr))
private def setLoggingLevel(level: Level): Unit = {
discard(System.setProperty("LOG_LEVEL_ROOT", level.levelStr))
}
}

View File

@ -64,9 +64,19 @@ private[trigger] object TriggerServiceAppConf {
}
})
implicit val levelRead: ConfigReader[Level] =
implicit val levelReader: ConfigReader[Level] =
ConfigReader.fromString[Level](level => Right(Level.valueOf(level)))
implicit val logEncoderReader: ConfigReader[LogEncoder] =
ConfigReader.fromString[LogEncoder](ConvertHelpers.catchReadError {
case "plain" => LogEncoder.Plain
case "json" => LogEncoder.Json
case s =>
throw new IllegalArgumentException(
s"Value '$s' for log-encoder is not one of 'plain' or 'json'"
)
})
implicit val serviceCfgReader: ConfigReader[TriggerServiceAppConf] =
deriveReader[TriggerServiceAppConf]
@ -97,6 +107,7 @@ private[trigger] final case class TriggerServiceAppConf(
compilerConfig: Compiler.Config = Compiler.Config.Default,
triggerConfig: TriggerRunnerConfig = DefaultTriggerRunnerConfig,
rootLoggingLevel: Option[Level] = None,
logEncoder: LogEncoder = LogEncoder.Plain,
) {
def toServiceConfig: ServiceConfig = {
ServiceConfig(
@ -127,6 +138,7 @@ private[trigger] final case class TriggerServiceAppConf(
compilerConfig = compilerConfig,
triggerConfig = triggerConfig,
rootLoggingLevel = rootLoggingLevel,
logEncoder = logEncoder,
)
}
}

View File

@ -1,8 +1,21 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %replace(, context: %marker){', context: $', ''} %n</pattern>
</encoder>
<appender name="STDOUT" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender-ref ref="console" />
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<if condition='isDefined("LOG_FORMAT_JSON")'>
<then>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout"/>
</encoder>
</then>
<else>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %replace(, context: %marker){', context: $', ''} %n</pattern>
</encoder>
</else>
</if>
</appender>
<logger name="io.netty" level="WARN">