로깅?
프로그램 동작 시 발생하는 모든 일을 기록하는 행위
모든 일?
기록?
모든일 (최소한의 목적)
서비스 동작 상태
•
시스템 로딩
•
HTTP 통신
•
트랜잭션
•
DB 요청
•
의도를 가진 Exception
장애(Exception, Error)
•
I/O Exception
•
NullPointException
•
의도하지 않은 Exception
로깅은 언제 할까?
프로젝트 성격에 맞게
팀에 맞게
로깅 시점은 때에 따라 다름
기록
System.out.println(”로깅”)
System.err.pringln(”로깅에러”)
로깅 프레임워크
로깅 프레임 워크
출력 형식을 지정할 수 있음
로그 레벨에 따라 남기고 싶은 로그를 별도로 지정할 수 있음
콘솔뿐만 아니라 파일이나, 네트워크등 로그를 별도에 위치에 남길 수 있음
로그 레벨
레벨 | 설명 | ||
Fatal | 매우 심각한 에러 프로그램이 종료되는 경우가 많음 | 작성되지 않는 경우가 생길 수 있어서 잘 작성하지 않음 | |
Error | 의도하지 않은 에러가 발생한 경우. 프로그램이 종료되진 않음 | 주로 외부 API 요청에서 오류가 발생할 때 → 프로그램 내에서 개발자가 의도하지 않은 예외를 나타낼 때 사용 | |
Warn | 에러가 될 수 있는 잠재적 가능성이 있는 경우 | 알람을 통해 개발자가 크리티컬한 에러를 맞닥트리기전 해결할 수 있는 경우 | |
Info | 명확한 의도가 있는 에러, 요구사항에 따라 시스템 동작을 보여줄 때 | 개발자가 의도한 에러를 파악할 때 | |
Debug | Info 레벨보다 더 자세한 정보가 필요한 경우. Dev 환경 | 주로 Develop 환경에서 사용함 | |
Trace | Debug 레벨보다 더 자세함. Dev 환경에서 버그를 해결하기 위해 사용 | Debug보다 더 자세한 예외 로그를 확인할 때 사용 |
로깅 vs 디버깅
프로그래밍의 절반은 디버깅이지~
디버깅을 할 수 없는 상황에서는 로깅이 최선의 선택 (ex. 실서버 구동)
디버깅을 쓸 수 있다면 디버깅을 최대한 활용하는 게 맞음
어떻게 기록할까용
사용자가 나는 ~를 하지 않았는데 ~가 됐다.
중요 로직 Log를 기록한다. → 유연하게 사용할 수 있게 어노테이션 로깅 AOP를 만듦 (메서드, 메서드 매개변수, 아이피, 브라우저, 쿠키 기록) → 한 어노테이션에서 모든 걸 다 찍는데 이것도 나눠야하나? → 매개변수 순서를 다 통일해서 Member를 첫번째에 두고 joinpoint.getArgs 한 다음 첫번째꺼 이름을 무조건 찍어야하나? arg[0] = (Member) arg[0].getNickname? 쿠키가 있어서 상관 없나? 이메일 들어있으니까 (이메일 변경 불가)
결제쪽에 대해선 어떤 사람이 어떤 메서드를 호출했다라는 정도로 밖에 안보인다. 호출했다는 것보다는 결제 진행중이고 이뤄지는 과정에서 정상 처리가 됐는지가 더 중요할 거 같다. AOP 만으로 처리를 하기에는 무리가 있다고 본다.
보통은 INFO까지 찍지 않음 → 용량 때문에 돈이 많이 듬 진짜 구축이 잘 된 서버고 사용자가 많다? INFO 까지 기록하면 서버 용량터짐 → Warn 이상레벨 만 잡음 → 지나쳐도 되는 것들에 대해서 찍는 경우가 있음 → Error 는 결제 실패등이 일어났을 때 바로 대응할 수 있게 Error로 찍음
info를 찍어도 최소한의 데이터를 찍는다고 볼 수 있음
만약에 주요 로직들이 있으면 결제, 쿠폰 이런 로그는 찍는데 Info로 찍음 생각보다 그렇게 많지는 않음 → 며칠동안 보관을 할지 비즈니스에 따라서 결정하는 게 맞음
ansi도 왜 적용이 안될까여… %clr로 해봤는데 안됩니다.
이거 보면 좋을듯
진짜 좋은 로그 예시를 찾기 힘들다 → 서비스마다 로그에 필요한 정보가 다르기 때문이라고 느껴진다.
AOP는 디도스 공격을 했다 했을 때 잡기 위해서 할 수는 있을 거 같음 해당 결제 메서드가 호출이 됐다는 걸 기록한다는 것도 나쁘지는 않음 → 트랜잭션이 어디까지 돼고 잘 수행됐는지가 더 중요
scan = true 로 바꾸고 log level 바꿨는데도 scan이 되지 않아서 서버 가동중에 warn → info 로 변경이 안됨
블로그 더 찾아보기!
왜 이런지는 모르겠음 → 도커 이미지 받아와서 서버 구동하는데 xml 파일 내부 내용을 어떻게 바꿀까요? → 도커랑 친하지 않아서 잘 모르겠습니다. →
콘솔에 warn 찍고 file엔 info를 찍어야 하나?