[Akka] Classic Logging 1

smlee·2023년 9월 14일
0

Akka

목록 보기
24/50
post-thumbnail

Akka에서의 로깅은 특정 로깅 백엔드에 묶여 있지 않다. 기본적으로 로그 메시지는 STDOUT에 출력되지만 SLF4J 로거나 자신의 로거를 플러그인할 수 있다. 로깅은 로깅이 성능에 미치는 영향이 최소가 되도록 비동기적으로 수행된다. 로깅은 일반적으로 I/O와 lock을 의미하므로 동기적으로 수행되었다면 코드의 작동을 늦출 수 있다.

Log하는 법

LoggingAdapter를 생성하고 error, warning, info 그리고 debug 메서드들을 사용한다.

밑의 예시는 해당 어댑터의 예시이다.

import akka.event.Logging

class MyActor extends Actor {
  val log = Logging(context.system, this)
  override def preStart() = {
    log.debug("Starting")
  }
  override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    log.error(reason, "Restarting due to [{}] when processing [{}]", reason.getMessage, message.getOrElse(""))
  }
  def receive = {
    case "test" => log.info("Received test")
    case x      => log.warning("Received unknown message: {}", x)
  }
}

편의상 위와 같이 정의하는 대신 로그 멤버를 Actor로 혼합할 수 있다.

class MyActor extends Actor with akka.actor.ActorLogging {
  ...
}

Logging에 대한 첫 번째 파라미터는 임의의 LoggingBus, 특히 system.eventStream이 될 수도 있다. 위의 예시의 경우, 액터 시스템의 주소는 로그 소스의 akkaSource 표현에 포함되지만(위의 내용의 경우 9MDC의 Logging Thread, AkkaSource 및 액터 시스템 참조), 두 번째 경우에는 이것이 자동으로 이루어지지 않는다. Logging에 대한 두 번째 파라미터는 이 로깅 채널의 소스이다. 소스 객체는 다음 규칙에 따라 String으로 변환된다.

  1. Actor 또는 ActorRef인 경우 경로가 사용된다.
  2. 문자열의 경우 그대로 사용된다.
  3. 클래스의 경우 단순 이름의 근사치가 사용된다.
  4. 문제의 유형에 대해 암묵적인 LogSource[T]가 적용되지 않는 한 다른 모든 경우 컴파일 오류가 발생한다.

로그 메시지는 로그 레벨이 활성화되면 대체될 인수 자리 표시자 {}를 포함할 수 있다. 로그 메시지를 위한 전체 문자열을 구성하는 것에 비해 로그 레벨이 비활성화될 때 불필요한 문자열 연결 및 개체 할당을 피할 수 있는 장점이 있다. 자리 표시자보다 많은 인수를 지정하면 로그 문에 경고가 추가된다(즉, 심각도가 동일한 줄에). 배열의 요소를 개별적으로 처리할 수 있는 유일한 대체 인수로 전달할 수 있다.

val args = Array("The", "brown", "fox", "jumps", 42)
system.log.debug("five parameters: {}, {}, {}, {}, {}", args)

로그 소스의 Java Class도 생성된 LogEvent에 포함된다. 간단한 문자열의 경우 SLF4J event listener가 사용할 로거 인스턴스를 조회하기 위해 클래스 이름 대신 문자열을 사용하는 등 이 경우를 특별하게 처리할 수 있도록 "marker" 클래스 DummyClassForStringSources로 대체된다.

Dead Letters들의 로깅

기본적으로 Dead Letter로 보낸 메시지는 INFO 수준으로 기록된다. Dead Letter가 있다고 해서 반드시 문제가 있는 것은 아니지만 주의를 위해 기본적으로 기록된다. 몇 개의 메시지가 표시되면 로그가 누수되는 것을 방지하기 위해 이 기록을 해제할 수 있다. 이 기록을 완전히 해제하거나 기록되는 Dead Letter의 수를 조정할 수 있다. 시스템이 종료되는 동안 행위자 사서함에 보류 중인 메시지가 Dead Letter로 전송되므로 Dead Letter가 표시될 가능성이 있다. 종료되는 동안 Dead Letter의 기록을 해제할 수도 있다.

akka {
  log-dead-letters = 10
  log-dead-letters-during-shutdown = on
}

로그를 추가로 사용자 지정하거나 Dead Letter에 대해 다른 작업을 수행하려면 이벤트 스트림에 가입할 수 있습니다.

0개의 댓글