[ https://issues.apache.org/jira/browse/LOG4J2-3327?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17470762#comment-17470762 ]
Matt Sicker commented on LOG4J2-3327: ------------------------------------- Could be a feature gap. I doubt that the Scala compiler supports the Java annotation processing API. I haven't used Scala professionally in a few years, so I can't recall any specifics. I'd imagine most people have just used the workaround, though that's certainly not ideal! If you know of or can find any info about how Scala can process its own annotations at compile time (perhaps via the macro system or somewhere along those lines), that would help a lot as writing the .dat file generator would be fairly simple in theory. > scala: add support for creating custom PatternConverter plugins > --------------------------------------------------------------- > > Key: LOG4J2-3327 > URL: https://issues.apache.org/jira/browse/LOG4J2-3327 > Project: Log4j 2 > Issue Type: Improvement > Components: Plugins > Reporter: Conor Griffin > Assignee: Mikael Ståldal > Priority: Major > Labels: scala > > I tried to add a custom pattern converter using Scala but the plugin does not > seem to get picked up or the pattern conversion does not work. Here's my > sample scala implementation where I am trying to use {{%W}} as the pattern to > substitute a correlation ID > {code:java} > package com.mycompany.log4jext > import org.apache.logging.log4j.core.LogEvent > import org.apache.logging.log4j.core.config.plugins.{Plugin, PluginFactory} > import org.apache.logging.log4j.core.pattern.{ConverterKeys, > LogEventPatternConverter, PatternConverter} > import java.lang > import java.util.UUID > @Plugin(name = "CustomPatternConverter", category = PatternConverter.CATEGORY) > @ConverterKeys(Array("W")) > class CustomPatternConverter(name: String, style: String) extends > LogEventPatternConverter(name: String, style: String) { > def this(options:Array[String]) { > this("CustomPatternConverter", "none") > } > override def format(obj: Any, output: lang.StringBuilder): Unit = { > obj match { > case l:LogEvent => format(l, output) > } > } > override def format(event: LogEvent, toAppendTo: lang.StringBuilder): Unit > = { > Option(CorrelationId.getCorrelationId) match { > case Some(value) => toAppendTo.append(s"[commonId=$value]") > } > } > } > object CustomPatternConverter { > @PluginFactory > def newInstance(options:Array[String]): CustomPatternConverter = { > new CustomPatternConverter(options) > } > } > object CorrelationId { > private val ID = new ThreadLocal[String]() > def clearCorrelationId(): Unit = { > ID.remove() > } > def setCorrelationId(id: String): Unit = setCorrelationId(Option(id)) > def setCorrelationId(maybeId: Option[String]): Unit = { > maybeId foreach { ID.set } > } > def getCorrelationId: String = ID.get() > def generateCorrelationId: String = s"MyApp|${UUID.randomUUID().toString}" > }{code} > I have enabled debug with {{log4j2.debug=true}} and see debug logs but don't > see evidence that the pattern converter is loaded. I also don't see the > correlation ID logged however this used to be logged under log4j1. > Is there special configuration needed to get log4j2 to load plugins written > in scala? Or is there an error in how I've written the code above? > I also tried without the {{@PluginFactory}} annotation without success. -- This message was sent by Atlassian Jira (v8.20.1#820001)