-
Logging MDCscala/playframework 2023. 2. 19. 01:40
------------------------------------------------------------------------------------------------------------
개인적으로 만들어 본 것
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