aboutsummaryrefslogblamecommitdiff
path: root/src/main/scala/xyz/driver/core/logging.scala
blob: 9a5805d090a779be338d8f9c306cf3d241d457e4 (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
 





                                               
                                  
 

                
                                                                       



                                                        



                                                                                                                       


                                                                  


                                                                                                    
                                                                                             










                                                                                                                      
                                                               
















                                                                                                   
                                                                                                                



         
 
package xyz.driver.core

import java.text.SimpleDateFormat
import java.util.Date

import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.LayoutBase
import org.apache.commons.lang3.StringUtils
import org.slf4j.helpers.NOPLogger

object logging {

  val NoLogger = com.typesafe.scalalogging.Logger(NOPLogger.NOP_LOGGER)

  class DriverLayout extends LayoutBase[ILoggingEvent] {
    import scala.collection.JavaConverters._

    private val FieldSeparator        = "="
    private val DateFormatString      = "MM/dd/yyyy HH:mm:ss"
    private val newline               = System.getProperty("line.separator")
    private val IgnoredClassesInStack = Set("org.apache.catalina", "org.apache.coyote", "sun.reflect", "javax.servlet")

    override def doLayout(loggingEvent: ILoggingEvent): String = {

      val date  = new SimpleDateFormat(DateFormatString).format(new Date(loggingEvent.getTimeStamp))
      val level = StringUtils.rightPad(loggingEvent.getLevel.toString, 5)

      val message = new StringBuilder(s"$date [$level] - ${loggingEvent.getMessage}$newline")

      logContext(message, loggingEvent)

      Option(loggingEvent.getCallerData) foreach { stacktrace =>
        val stacktraceLength = stacktrace.length

        if (stacktraceLength > 0) {
          val location = stacktrace.head

          val _ = message
            .append(s"Location: ${location.getClassName}.${location.getMethodName}:${location.getLineNumber}$newline")
            .append(s"Exception: ${location.toString}$newline")

          if (stacktraceLength > 1) {
            message.append(stacktrace.tail.filterNot { e =>
              IgnoredClassesInStack.forall(ignored => !e.getClassName.startsWith(ignored))
            } map {
              _.toString
            } mkString newline)
          }
        }
      }

      message.toString
    }

    private def logContext(message: StringBuilder, loggingEvent: ILoggingEvent) = {
      Option(loggingEvent.getMDCPropertyMap).map(_.asScala).filter(_.nonEmpty).foreach { context =>
        message.append(
          context map { case (key, value) => s"$key$FieldSeparator$value" } mkString ("Context: ", " ", newline)
        )
      }
    }
  }
}