Uploaded image for project: 'Log4j 2'
  1. Log4j 2
  2. LOG4J2-3327

scala: add support for creating custom PatternConverter plugins

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • Plugins

    Description

      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

      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}"
      
      }

      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.

      Attachments

        Activity

          People

            mikaelstaldal Mikael Ståldal
            conor.griffin Conor Griffin
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: