태그 보관물: 로깅

로그를 이용해 디버깅하는 법


로깅은 로그라고 하는 정보성 기록을 만들어도록 시스템을 작성하는 실천법입니다. 임시 코드 출력(Printlining)은 간단하고, 대개 임시로 쓸 로그를 만들어내는 것입니다. 초보자는 프로그래밍 지식이 제한적이기 때문에 로그를 이해하고 사용해야 하고, 시스템 아키텍트는 시스템의 복잡성 때문에 로그를 이해하고 사용해야 합니다. 로그에서 제공하는 정보의 양은 설정 가능해야 합니다(이상적인 경우 프로그램이 실행 중인 동안에도). 일반적으로 로그는 세 가지 기본적인 이점을 제공합니다.

  • 로그는 재현하기 힘든 버그(배포 환경에서는 발생하지만 테스트 환경에서는 재현할 수 없는 것과 같은)에 관한 유용한 정보를 제공할 수 있습니다.
  • 로그는 성능과 관련된 통계와 데이터를 제공할 수 있습니다(예: 두 문장 사이에 소요된 시간).
  • 로그를 설정할 수 있는 경우, 예상치 못한 특정 문제를 디버깅하기 위해 해당 문제만를 해결하는 코드를 수정 및(또는) 재배포할 필요 없이 일반적인 정보를 확보할 수 있습니다.

로그에 출력하는 내용의 양은 정보와 간결성 사이에서 절충 가능합니다. 정보가 너무 많으면 로그를 처리하는 비용이 높아지고 스크롤의 압박이 생겨서 원하는 정보를 찾기가 힘들어집니다. 반면 정보가 너무 적으면 필요한 정보가 포함돼 있지 않을지도 모릅니다. 이러한 이유로 로그에 출력하는 내용을 설정 가능하게 만들면 아주 유용합니다. 대개 로그상의 각 레코드는 소스 코드 상의 위치, 실행된 스레드, 정확한 실행 시간, 그리고 공통적으로 특정 변수의 값, 여유 메모리의 양, 데이터 객체의 수 등과 같이 추가적인 유용한 정보를 파악하게 해줍니다. 이러한 로그문은 소스코드 도처에 흩어져 있으며, 특히 주요 기능 지점과 위험성 있는 코드 주변에 지정돼 있습니다. 각 로그문에는 레벨을 할당할 수 있고 시스템이 현재 해당 레벨로 설정돼 있는 경우에만 로그 레코드를 출력할 것입니다. 로그문은 예상되는 문제를 해결하도록 설계해야 합니다. 성능 측정의 필요성을 예상해 보십시오.

영구적인 로그가 있다면 로그 레코드 측면에서 임시 코드 출력(Printlining)을 해볼 수 있으며, 아마도 그러한 디버깅 문장의 일부는 영구적으로 로깅 시스템에 추가될 것입니다.