Akka에서의 로깅은 특정 로깅 백엔드에 묶여 있지 않다. 기본적으로 로그 메시지는 STDOUT에 출력되지만 SLF4J 로거나 자신의 로거를 플러그인할 수 있다. 로깅은 로깅이 성능에 미치는 영향이 최소가 되도록 비동기적으로 수행된다. 로깅은 일반적으로 I/O와 lock을 의미하므로 동기적으로 수행되었다면 코드의 작동을 늦출 수 있다.
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으로 변환된다.
로그 메시지는 로그 레벨이 활성화되면 대체될 인수 자리 표시자 {}를 포함할 수 있다. 로그 메시지를 위한 전체 문자열을 구성하는 것에 비해 로그 레벨이 비활성화될 때 불필요한 문자열 연결 및 개체 할당을 피할 수 있는 장점이 있다. 자리 표시자보다 많은 인수를 지정하면 로그 문에 경고가 추가된다(즉, 심각도가 동일한 줄에). 배열의 요소를 개별적으로 처리할 수 있는 유일한 대체 인수로 전달할 수 있다.
val args = Array("The", "brown", "fox", "jumps", 42)
system.log.debug("five parameters: {}, {}, {}, {}, {}", args)
로그 소스의 Java Class도 생성된 LogEvent에 포함된다. 간단한 문자열의 경우 SLF4J event listener가 사용할 로거 인스턴스를 조회하기 위해 클래스 이름 대신 문자열을 사용하는 등 이 경우를 특별하게 처리할 수 있도록 "marker" 클래스 DummyClassForStringSources로 대체된다.
기본적으로 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에 대해 다른 작업을 수행하려면 이벤트 스트림에 가입할 수 있습니다.