ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logging MDC
    scala/playframework 2023. 2. 19. 01:40

    https://github.com/playframework/play-samples/blob/2.8.x/play-scala-rest-api-example/app/v1/post/PostActionBuilder.scala#L29 참고

     

     

    ------------------------------------------------------------------------------------------------------------

    개인적으로 만들어 본 것

     

    import org.slf4j.MarkerFactory
    import play.api.MarkerContext
    import play.api.mvc.RequestHeader
    
    import java.util.UUID
    
    object Application {
      // marker context logging: implicit RequestHeader 가 있으면 MarkerContext 가 제공됨
      val serverStartId: String = UUID.randomUUID().toString.replace("-", "").substring(0, 8)
    
      implicit class MarkerLoggingOpt(request: RequestHeader) {
        def toMarkerContext: MarkerContext = requestHeaderToMarkerContext(request)
      }
    
      implicit def requestHeaderToMarkerContext(implicit request: RequestHeader): MarkerContext =
        MarkerFactory.getMarker(s"${serverStartId}-${request.id}")
    }
    
    
    
    ########################################################################
    
    
    import Application._
    
    @Singleton
    class Controller @Inject() (handler: RisingHandler)(val controllerComponents: ControllerComponents)(
      implicit ec: ExecutionContext
    ) extends BaseController with Logging {
      def create(rowKeyOpt: Option[String]): Action[AnyContent] = Action.async { implicit request =>
        logger.info("Request to create")
         ...
        getCandidateKeywords(...)
      }
    
      def getCandidateKeywords(targetTime: Long, size: Int)(implicit mc: MarkerContext): Future[Seq[CandidateKeyword]] = {
        logger.info(s"size=[$size]")
         ...
      }
    }
    
    
    ########################################################################
    
    
    @Singleton
    class ErrorHandler @Inject() (
      env: Environment,
      config: Configuration,
      sourceMapper: OptionalSourceMapper,
      router: Provider[Router]
    ) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) with Logging {
      override def onServerError(request: RequestHeader, exception: Throwable): Future[Result] = {
        implicit val mc: MarkerContext = request.toMarkerContext
        
        logger.info("Internal ServerError")
        ...
      }
    }

     

    logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds">
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}\t[%thread]\t[%logger{36}:%line]\t%level\t%marker\t%msg%n</pattern>
        </encoder>
      </appender>
    
      <appender name="rolling-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${application.home:-.}/logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>${application.home:-.}/logs/application-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
          <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>512MB</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
          <maxHistory>30</maxHistory>
          <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    
        <encoder>
          <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}\t[%thread]\t[%logger{36}:%line]\t%level\t%marker\t%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="rolling-file"/>
      </root>
    </configuration>

    'scala > playframework' 카테고리의 다른 글

    ScalaTest  (0) 2023.02.19
    Using ScalikeJDBC  (0) 2023.02.19
    Deploy  (0) 2023.02.19
    Filter  (0) 2023.02.19
    Action composition  (0) 2023.02.19

    댓글

Designed by Tistory.