1 minute read

elixir 1.15에서 erlang logger 와의 통합이 이뤄졌다. 그래서 elixir에서 erlang의 파일 로거 핸들러를 손쉽게 사용할 수 있다. elixir logger backend가 deprecated 돼서 설정을 바꾸는게 귀찮았지만 erlang의 파일 로거를 사용할 수 있다. elixir 스탠다드 라이브러리에 파일 로거가 직접 만들거나 파일 로거 backend 라이브러리를 추가해야 했다. 이렇게 많이 쓰는 걸 왜 추가하지 않나 했는데, 다 계획이 있었구나.

로거의 디폴트 핸들러는 하나만 설치할 수 있다.

config :logger, :default_handler,
  config: [
    type: :file,
    file: ~c"logs/app.log",
    max_no_bytes: 10_000_000,
    max_no_files: 5,
    file_check: 5000,
    filesync_repeat_interval: 5000
  ]

즉, 이렇게 세팅하면 콘솔 출력 로거는 사라지고 파일로만 로그가 남는다. 디폴트 핸들러는 그대로 놔두고 파일 로거를 추가해보자.

config :app, :logger, [
  {:handler, :file_log, :logger_std_h,
   %{
     config: %{
       type: :file,
       file: ~c"logs/app.log",
       max_no_bytes: 10_000_000,
       max_no_files: 5,
       file_check: 5000,
       filesync_repeat_interval: 5000
     },
     level: :info,
     formatter:
     Logger.Formatter.new(
       format: "$date $time [$level] $metadata$message\n"
     )
   }}
]

config 파일에 파일 로거 핸들러를 추가한다. elixir 구조체를 보기 좋게 하려면 Logger.Formatter 를 formatter로 세팅한다. 핸들러를 정의했으니 추가할 차례다.

Logger.add_handlers(:app)

Application.start/2 콜백에서 정의한 로거 파일 핸들러를 추가한다.

erlang에서 검증된 로거 라이브러리를 사용할 수 있게 됐다. 설정 방법은 부자연스럽다. config 파일 수정 하나로 끝났으면 좋겠는데, 핸들러 정의까지만 가능하다. 핸들러 추가 함수를 따로 호출해 줘야 한다. 핸들러 이름을 명시해서 추가하는 방식이 아니라 config 파일에 Application 이름으로 정의한 핸들러를 통째로 추가하는 방식도 어색하다.