-
toString의 규약
- 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환
- 모든 하위 클래스에서 이 메서드를 재정의하라
- 기본적으로는
클래스_이름@16진수로_표시한_해시코드
를 반환
-
로그를 찍을 때 1안보다는 2안이 낫다. toString을 재정의하자.
getLog().error(phoneNumber + "로 문자발송을 실패하였습니다.");
//1안) {박태영=PhoneNumber@adaba}
//2안) {박태영=010-1234-5678}
- 재정의 예시
/**
* 전화번호의 문자열 표현을 반환합니다.
* 이 문자열은 XXX-YYYY-ZZZZ 형태의 11글자로 구성됩니다.
* XXX는 지역코드, YYYY는 접두사, ZZZZ는 가입자 번호입니다.
* 블라블라~
*/
@Override
public String toString() {
return String.format("%03d-%04d-%04d", areaCode, prefix, lineNum);
}
- toString을 재정의할때 필요한 것
- 객체 스스로를 완벽히 설명하는 문자열 (=객체가 가진 주요 정보를 모두 문자열로)
- 반환값 포맷을 문서화하고, 문자열 객체를 상호 전환할 수 있는 정적팩터리/생성자 제공
- 🚨주의사항🚨
- 포맷을 한번 명시하면, 프로그래머들이 해당 포맷을 파싱해서 사용할 수 있기 때문에 변경불가
- 포맷을 명시하지 않으면, 다음 배포때 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 얻음
- ==toString 대신 getter로 데이터에 접근할 수 있도록 API를 제공하자==
-
Log4j – Performance (apache.org)
- 로그레벨은 application.yml, properties, xml 등으로 설정할 수 있다.
- 로그레벨
- ⛔️ Error : 예상하지 못한 심각한 문제가 발생하는 경우, 즉시 조취를 취해야 할 수준의 레벨
- ⚠ Warn : 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리, 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분
- ✅ Info : 운영에 참고할만한 사항, 중요한 비즈니스 프로세스가 완료됨
- ⚙️ Debug : 개발 단계에서 사용하며, SQL 로깅을 할 수 있음
- 📝 Trace : 모든 레벨에 대한 로깅이 추적되므로 개발 단계에서 사용함
- 그런데 왜 println 대신 logging을 사용할까?
- 스레드, 클래스이름 같은 부가정보를 함께 자동으로 출력, 출력포맷을 조정
- 로그레벨에 따라 개발/운영서버에서 출력할 로그를 상황에 맞게 조절할 수 있음
- 표준출력외 파일/네트워크 등 로그를 별도 위치에 남길 수 있음
- 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할할 수 있음
-
로깅 적용할 때 고려할 점
- 로그가 너무 많이 쌓이면 그것도 돈이 많이 든다.
- 솔루션 로그만 쌓다가, 분석해야할 때 업무로직 로그를 쌓을 수도 있고.
- 평소에도 업무로그를 쌓되 주기적으로 압축/삭제해줄 수도 있다.
- 스프링의 'AOP' 관점에서, 로깅을 공통모듈화해서 적용하자.
- 우리 시스템은 Controller/Serive 최상위객체에 로그 관련 로직이 포함되어 있더라
- getLog()해서 쓰기만 하면됨
- 파일입출력하면 파일크기, 파일락킹, 입출력성능을 고려해야한다.
- 로그가 너무 많이 쌓이면 그것도 돈이 많이 든다.
-
순환참조에 주의하기
class A {
private B b;
@Override
public String toString() {
return "A{" + "b='" + b + "}";
}
}
class B {
private A a;
@Override
public String toString() {
return "B{" + "a='" + a + "}";
}
}
-
회사로 돌아가서 해볼일
-
문제상황
- 인터페이스 시스템을 담당하니 로그를 볼 일이 많음
- 그런데 로그파일이 너무 커서 잘라서 보는게 너무 귀찮은데다
- 로그파일 다 잘라놨더니 업무로그가 안남아있는 경우가 있음
- 인터페이스 시스템을 담당하니 로그를 볼 일이 많음
-
해볼만한 것들
-
시스템별 로그레벨 확인하고 안내하기
logback.xml
- "소스코드에서 디버그레벨 확인하고 로그확인요청을 하세요!"
- "업무로직을 로그에 남길거면 디버그레벨 확인해서 로그를 남기세요!"
-
logback에서 파일용량별 분할하기
-