All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.epfl.scala.debugadapter.internal.LoggingAdapter.scala Maven / Gradle / Ivy

package ch.epfl.scala.debugadapter.internal

import com.microsoft.java.debug.core.{Configuration, LoggerFactory}

import java.util.logging.{Logger => JLogger, _}

private[debugadapter] class LoggingAdapter(
    logger: ch.epfl.scala.debugadapter.Logger
) extends Handler {

  /**
   * DAP server tends to send a lot of SocketClosed exceptions when the Debuggee process has exited. This helps us filter those logs
   */
  @volatile private var closingSession = false

  override def publish(record: LogRecord): Unit = {
    val message = record.getMessage
    record.getLevel match {
      case Level.INFO | Level.CONFIG => logger.info(message)
      case Level.WARNING => logger.warn(message)
      case Level.SEVERE =>
        if (isExpectedDuringCancellation(message) || isIgnoredError(message)) logger.debug(message)
        else {
          logger.error(message)
          Option(record.getThrown).foreach(logger.trace(_))
        }
      case _ => logger.debug(message)
    }
  }

  def onClosingSession(): Unit = {
    closingSession = true
  }

  def factory: LoggerFactory = { name =>
    val logger = JLogger.getLogger(name)
    logger.getHandlers.foreach(logger.removeHandler)
    logger.setUseParentHandlers(false)
    if (name == Configuration.LOGGER_NAME) logger.addHandler(this)
    logger
  }

  override def flush(): Unit = ()

  override def close(): Unit = ()

  private final val socketClosed = "java.net.SocketException: Socket closed"

  private def isExpectedDuringCancellation(message: String): Boolean = {
    message.endsWith(socketClosed) && closingSession
  }

  private final val recordingWhenVmDisconnected =
    "Exception on recording event: com.sun.jdi.VMDisconnectedException"

  private def isIgnoredError(message: String): Boolean = {
    message.startsWith(recordingWhenVmDisconnected)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy