로그를 잘 남기기
보통의 웹 어플리케이션, 사이트 등을 만들 때 순수한 개발 외적으로 신경 써야 할 부분 중 여러 가지가 있는데 그 중에 하나가 로그이다. 잘 돌아가는 사이트들도 서버에 들어가서 로그를 남기는 형태나 로그파일을 보면 얼마나 신경을 썼는지를 알 수 있다. 이건 마치 그림의 뒷면이나, 자동차 하부를 보는것과 같다.
로그를 남기는 것은 매우 중요하다. 뭔가 문제가 생겼을 때 로그는 거의 유일한 단서가 되기도 하고 부서나 파트 별로 문제를 찾아야 할 때 설령 내 쪽 문제가 아니더라도 로그로 그것을 증명할 수 없다면, 사실상 쪽팔리게 된다.(보다 적절한 단어를 찾지는 못하겠다.)
로그를 남길 때 몇가지 주의사항이 있는데 다음과 같다.
날짜/시간을 반드시 남길 것
- 간혹 날짜를 남기지 않는 경우가 있다. 문제가 되고 로그를 찾아야 하는 경우 로그의 단서는 대부분
날짜
와키워드
이다. 그런데 이런 경우 날짜를 로그에 남기지 않으면 찾을수가 없다. 그리고 날짜와 시간을 남기게 되면 시간의 흐름에 따라서 추적할 수가 있다. 또한 시간을 작은 단위로 보게 되면 로그와 로그 사이의 시간의 간격을 문제가 있을 때 볼 수 있게 된다.
단서를 남길것
- 빨리 찾기 위한 단서를 남겨야 한다. 예를 들어, 거래ID나 주문ID를 남겨서 해당 거래ID 기준으로 사용자의 로그를 찾을 수 있도록 해야한다. 이건 약간 도메인마다 다를 것 같은데 결제쪽에서는 거래ID를 대부분의 로그에 남겨서 해당 거래ID를 가진 사용자가 어떤 행위를 하고 어떤 단계를 거쳐서 결제 혹은 오류가 났는지를 빠르게 파악할 수 있게 하고있다. 이런 단서를 남기지 않게 되면, 행위나 흐름을 보고 싶을 때 많은 사용자가 들어올 경우 어떤 데이터가 어떤 사용자의 것인지 알 수 없게 된다.
데이터가 변하는 시점에 남길 것
- 외부 API를 통해서 데이터를 가져오거나(생성), 데이터를 보내기 위해서 암호화를 하거나, 혹은 복호화를 하거나 하는 시점에는 반드시 원본데이터와 변조된 데이터를 남겨야 한다. 그리고 다른 캐릭터셋으로 바꾸거나 하는 시점에도 반드시 남겨야 한다. 필자의 경우, 결제 관련 업체에서 일을하다보니 외부 카드사 같은곳에서 데이터를 받을 경우가 있는데 이럴 경우 반드시 받은 데이터와 복호화 데이터 등을 남긴다. 데이터 변화하는 과정에서 에러가 날 경우, 이런 로그가 없으면 왜 없는지 찾기가 힘들다.
로그남기는 행위 자체에서의 에러 조심
logger.debug("tid : " + tid)
이런식으로 로그를 남겼다고 생각해 보면, 파이썬에서 tid 가 None 일 수도 있기 때문에 이런 경우 로그를 남기는 행위 자체가 에러를 발생 시킨다. 이런 경우 따로 자신만의 logger.debug 등을 활용한 wrapper 클래서를 만들거나 항상str()
로 감싸거나 하는 방법이 필요하다.
너무 많은 로그를 남기 는것은 디스크 용량에 문제를 줄수도 있지만, 개인적인 생각에는 서비스 초반에는 많은 로그를 남기고 레벨을 조정하면서 남겨지는 로그를 줄여나가는 것이 바람직하다고 생각한다. 그리고 로그를 남길때 파일이 어떤 식으로 생성되는지도 생각해봐야 한다. 예를들면, api.log 이런식으로 파일하나로 생성해서 두기 보다는 일별 로그 형태로 남겨지는 것이 좋고 그게 안된다면 일별로 분할해두는것이 좋다. 이는 당연히 찾을때의 편의를 위함이다.
개인적으로 로그를 찾아서 뭔가를 확인해달라는 요청을 자주 받는데 로그를 빨리 찾을 수 있는 자신만의 툴을 만드는 것도 중요하다고 생각한다. 이런 요청이 자주 있고, 생각보다 많은 시간을 차지 한다면 좀더 자동화된 방식으로 로그를 추출하고 볼 수 있는 스크립트 같은것을 만드는 것을 추천한다.