Apache Software Foundation(ASF)의 log4cxx (cxx는 C++를 영문자만 가지고 표기할 때 많이 사용되는 표현(?)이다) 는 유명한 java 기반 logging library인 log4j 의 C++ 버젼이다. 사실 log4j도 ASF 산하의 프로젝트고, log4net, log4php 등등의 자매 프로젝트들이 널려 있는, MT지원이 잘 되는 로깅 라이브러리들이다.
이걸 써보려고 몇 가지 테스트(?)겸 해서 돌아가던 소스에 붙여 봤다. 일단 장점 몇 가지,
물론 단점도 존재한다.
프로그래밍 작업을 하는 동안, 눈에 띄는 장점은 char/wchar_t를 모두 기본적으로 지원하기 때문에 쓰기가 편하고(가끔 wchar_t를 쓸 수 없는 라이브러리들이 있다 -_-), 각 로거를 구조적으로 구분해서 관리할 수 있게 해준다는 점이다.
예를 들어 2종류의 DB와 연동되어 돌아가는 3개의 CGI 프로그램이 붙어있는 웹서버라고 하자.
그럼 아래와 비슷한 계층 구조를 생각할 수 있다.
이런 식으로 붙어있을 때, 각각에 대해서 괄호친 부분처럼 로거를 달아줄 수 있고, 각 단계별로 로깅을 출력할 수 있다.
(그리고 chainsaw에서 별도로 필터링해서 볼 수 있다)
그리고 실제로 로그를 출력하는 부분은 정의된 몇 가지 매크로를 사용할 것을 권하고 있는데, 다 다음과 같은 형태다.
LOG4CXX_<LevelName>( logger, message ) \
if( logger의 LevelName에 해당하는게 활성화 되어있으면 ) { message를 출력단으로 전송 }
이런 식이라서 특정 레벨(Debug, Info, Warn, Error, Fatal)이 지정되어 있을 때만 실제로 message에 해당하는 부분(포맷팅 루틴이 들어갈 가능성이 매우 크니 -_-; 부하가 그런대로 있을 것이다)이 계산되서 부하가 그런대로 줄어든다. 이런 방식을 택하게되면 전체 코드에 로깅 루틴은 그냥 놔두고(예를 들어 DEBUG), 설정 파일에서 Info 이상만 출력되게 한다는 등의 방식으로 로그를 남기게 할 수 있다 - 그리고 이 설정 레벨 역시 로거 별로 별도로 부여할 수 있다)
몇 가지 단점이 있긴 하지만, 잘 작성되고, 테스트되고 있고, (아마도) 앞으로 유지 보수가 장기간 지속될거라고 믿을 수 있는 thread-safe한 로깅 라이브러리인 것 같다.(프로그래밍 하기도 편한 편이다) 일단은 지금 하고 있는 일에 적용 시켜보고(local branch에만 일단 올려 본 상태), 잘 되는 것 같으면 전체 프로젝트 소스 트리에 적용해봐도 될 것 같다.
ps. 일단 라이센스 자체는 apache software license라서 closed-source 상용 소프트웨어에 사용하는데 문제가 없어 보인다.
노출되야 하는 인터페이스 수도 매우 적고, 전체 소스 트리가 좀 과하게 크다는 것만 빼면, 통일된 로그 인터페이스를 만들어서 쓰기에 매우 좋다고 생각한다.
태생이 자바인지라 자바 서버에서 log4j를 사용하는 걸 봤을 때는 괜찮다 싶었는데 막상 log4cxx 갖다 쓰려 하니 막막하던데 용자가 되셨군요.
…
Written by bassist. on July 25, 2007 at 9:12am
안막막하다.
처음 빌드할 때만 디락스밤바(..)였고,
빌드하고나서는 뭐 별거 없었음. 실제로 로깅 남기는 부분도 매크로로 잘 되어 있고(물론 그냥 쓸 수도 있고)
메일링 리스트도 잘 돌아가고 있는 것 같았고;
결정적으로 log4j랑 설정이 같아서(…), 그 쪽의 방대한 문서를 참고할 수 있다는게 참 좋은듯
Written by rein on July 25, 2007 at 9:16am
이형복 사이트에서 흘러들어옴.
예전에 이거 써본 적 있는데 (3년 전 -_-;)
그 때 경험했던 몇 가지 주의 사항은…
1. 내부 버퍼링 부분에 thread-safe 하지 않은 부분이 있는 것 같음.
Multi-Processor(CPU), Multi-Threaded 환경에서 Crash 발생 있었음 (결국 내부 코드에 Critical Section 집어넣어서 해결)
2. 버퍼링된 스트림을 flush 할 때 일부 출력되지 않고 남아 있는 경우 있음.
마지막에 넣은 데이터와 다음 입력이 1시간 차이나면, 로그가 1시간 뒤에 나옴. (실시간 로그 출력 시 주의)
3. 매크로 쓰는 것도 많이 넣다 보면 의외로 귀찮으므로 보통 wrapper 함수 써서 사용했음.
Written by inanis on July 27, 2007 at 2:38pm
1. Thread-safety 부분은 거진 해결된 것 같아요(9.8->10.0 넘어가는 중인 코드에서는)
2. 이건 딱히 경험한게 아니라서 모르겠네요. 확인이 필요한듯;
3. 이건(…….)
Written by rein on July 30, 2007 at 11:16am
Jump to comments