ACE_LOG_MSG 란?
$(ACE_ROOT)\ace\Log_Msg.h 에 정의된 ACE_Log_Msg 싱글톤 클래스의 인스턴스이다. 위 헤더를 보면 다음과 같이 디파인 되어 있다.
#define ACE_LOG_MSG ACE_Log_Msg::instance ()
log priority 켜고 끄기
u_long ACE_Log_Msg::priority_mask(u_long,MASK_TYPE=THREAD) // set u_long ACE_Log_Msg::priority_mask(MASK_TYPE=THREAD) // get
예를 들어, 다음과 같이 했더니
// clear LM_INFO, LM_ERROR u_long priority_mask = ACE_LOG_MSG->priority_mask(ACE_Log_Msg::PROCESS); ACE_CLR_BITS(priority_mask, LM_INFO|LM_ERROR); ACE_LOG_MSG->priority_mask(priority_mask, ACE_Log_Msg::PROCESS); ACE_DEBUG((LM_ERROR, "u can't see this\n")); ACE_DEBUG((LM_INFO, "u can't see this\n")); // set LM_INFO, LM_ERROR ACE_SET_BITS(priority_mask, LM_INFO|LM_ERROR); ACE_LOG_MSG->priority_mask(priority_mask, ACE_Log_Msg::PROCESS); ACE_DEBUG((LM_ERROR, "u can see this\n")); ACE_DEBUG((LM_INFO, "u can see this\n"));
그랬더니,
[yoonkn@nirvana 02.ace_log]$ ./a.out u can see this u can see this
출력 방향
우선 코드부터
int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { if( ACE_LOG_MSG->open("ProcessName") == -1 ) ACE_ERROR((LM_ERROR, "cannot open logger\n")); ACE_DEBUG((LM_DEBUG, "이 메시지는 표준에러쪽으로 보이게 된다.\n")); ACE_LOG_MSG->clr_flags(ACE_Log_Msg::STDERR); ACE_DEBUG((LM_DEBUG, "stderr쪽으로 메시지 출력하지 않도록 세팅되어서 보이지 않는다.\n")); ACE_LOG_MSG->set_flags(ACE_Log_Msg::OSTREAM); ACE_DEBUG((LM_DEBUG, "OSTREAM 이 연결되지 않아서, 이 메시지는 보이지 않는다.\n")); ofstream output("output"); ACE_LOG_MSG->msg_ostream(&output); ACE_DEBUG((LM_DEBUG, "OSTREAM 으로 지정된 파일에 이 메시지가 저장된다.\n")); ACE_LOG_MSG->set_flags(ACE_Log_Msg::STDERR); ACE_DEBUG((LM_ERROR, "이 메시지는 파일뿐만이 아니라, stderr 로도 보인다.\n")); }
이렇게 할경우, 화면엔
[yoonkn@nirvana 02.ace_log]$ ./a.out 이 메시지는 표준에러쪽으로 보이게 된다. 이 메시지는 파일뿐만이 아니라, stderr 로도 보인다.
output 이라는 파일엔
OSTREAM 으로 지정된 파일에 이 메시지가 저장된다. 이 메시지는 파일뿐만이 아니라, stderr 로도 보인다.
즉 파일로만 로그를 뽑기를 원한다면
ACE_LOG_MSG->clr_flags(ACE_Log_Msg::STDERR); // stderr 끄고 ACE_LOG_MSG->set_flags(ACE_Log_Msg::OSTREAM); // ostream 으로 보내도록 세팅하고 ofstream output("output"); // ostream 인스턴스를 만들어서 ACE_LOG_MSG->msg_ostream(&output); // ACE_LOG_MSG 에 등록한다. ACE_DEBUG((LM_DEBUG, "파일로만 보인다.\n"));
와 같이 해주면 된다.
ACE_DEBUG 등을 직접 제어하고 싶을때
ACE_Log_Msg_Callback 이라는 클래스를 상속받아서, callback 으로 등록을 하면, ACE_DEBUG 등을 직접 제어 할수도 있다(직접이라기 보단.. 콜백). 이쪽은 아직 직접 코드를 돌려보진 않았다. 잘 관리된 로그를 뽑을때는 이 기능이 유용할것 같다. 우선 멀티쓰레드에서의 로깅기능까지 공부한 후에 이쪽을 볼 생각이다.
