log4cxx
log4j 를 본따 c++ 버전으로 만든 ASF(http://apache.org/)의 OSS.
(log4j 메뉴얼을 참조해도 된다. 거의 비슷..)
로그 레벨 : ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
log4cxx site : http://logging.apache.org/log4cxx/
log4cxx API : http://logging.apache.org/log4cxx/apidocs/index.html
log4j manual : http://blogimg.chinaunix.net/blog/upfile2/081221005440.pdf
log4cxx 빌드 (Visual Studio 2008)
1. Download Installation File
Apache log4cxx [ver 0.10.0]
Apache Portable Runtime (APR) [ver 1.4.2]
Apache Portable Runtime-util (APR-util) [ver 1.3.10]
GNU Sed [ver 4.2]
2. Installation
1. Decompress APR, APR-util, log4cxx File in same folder
ex) 아래와 같이 폴더 이름 변경 필수
c:\work\log4cxx\apr
c:\work\log4cxx\apr-util
c:\work\log4cxx\log4cxx
2. Install GNS sed
Run "sed-4.2-1-setup.exe"
Add environment variable %PATH% : "C:\Program Files\GnuWin32\bin"
3. In "cmd", move "C:\work\log4cxx\log4cxx" folder.
Run "configure.bat"
Run "configure-aprutil.bat"
4. Compile "C:\work\log4cxx\log4cxx\projects\log4cxx.dsw"
Result : log4cxx.dll, log4cxx.lib
("C:\work\log4cxx\log4cxx\projects\Debug or Release")
5. include file
C:\work\log4cxx\log4cxx\src\main\include
3. Visual Studio 2008 에서 사용하기 위한 설정 configuration
in Project Property Pages
"C/C++ > General > Additional Include Directories" : C:\work\log4cxx\log4cxx\src\main\include "C/C++ > Linker > Additional Library Directories" : C:\work\log4cxx\log4cxx\projects\Debug
In .cpp
#pragma warning ( disable: 4231 )
#pragma comment(lib, "log4cxx.lib")
**. log4cxx 설치 reference 사이트 http://sado13th.tistory.com/12 http://blog.naver.com/kkt3212/100102083844 http://www.yolinux.com/TUTORIALS/Log4cxx.html |
Log4cxx 사용 (properties 설정 파일)
[log4cxx.conf]
# root logger setting
#log4j.rootLogger = DEBUG, console, filelog, chainsaw, rollingfile
log4j.rootLogger = DEBUG, filelog, console
# using console appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ ISO8601 }[%-5p] % c(%L) : %m%n
#log4j.appender.console.layout.ConversionPattern = %d[%t] % -5p(%F:%L) - %m%n
# using rolling file appender
log4j.appender.rollingfile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingfile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingfile.File = Rlog.txt
log4j.appender.rollingfile.layout.ConversionPattern = [%d][%-5p](%L) - %m%n
log4j.appender.rollingfile.MaxFileSize = 500MB
log4j.appender.rollingfile.MaxBackupIndex = 3
# using filelog appender
log4j.appender.filelog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.layout = org.apache.log4j.PatternLayout
log4j.appender.filelog.layout.ConversionPattern = [%d][%-5p](%L) - %m%n
log4j.appender.filelog.Append = true
log4j.appender.filelog.DatePattern = '.'yyyy - MM - dd
log4j.appender.filelog.File = testlog.log
# using chainsaw appender
log4j.appender.chainsaw = org.apache.log4j.net.SocketAppender
log4j.appender.chainsaw.remoteHost = localhost
log4j.appender.chainsaw.port = 4445
log4j.appender.chainsaw.locationInfo = true
[.cpp]
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;
#pragma warning ( disable: 4231 )
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;
int main(void)
{
try
{
string filePath = "log4cxx.conf";
PropertyConfigurator::configure(File(filePath));
LoggerPtr rootlog = Logger::getRootLogger();
LoggerPtr log = Logger::getLogger("");
LOG4CXX_FATAL(log, "fatal output...");
LOG4CXX_ERROR(log, "error output...");
LOG4CXX_WARN(log, "warn output...");
LOG4CXX_INFO(log, "info output...");
LOG4CXX_DEBUG(log, "debug output...");
}
catch (const Exception& e) {
cout << "[ERROR] configure()\n" << e.what() << endl;
}
return EXIT_SUCCESS;
}
#pragma warning ( disable: 4231 ) 컴파일시 다음 warning 보기 싫어서 넣음. c:\work\log4cxx\log4cxx\src\main\include\log4cxx\spi\configurator.h(57) : warning C4231: nonstandard extension used : 'extern' before template explicit instantiation |
Log4cxx - 사용 (xml 설정 파일)
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="logConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
</layout>
</appender>
<appender name="logRollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="TestRolling500MB.log" />
<param name="append" value="true" />
<param name="MaxFileSize" value="500MB" />
<param name="MaxBackupIndex" value="3" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
</layout>
</appender>
aadafasf
<appender name="logTimeRollingFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="fileNamePattern" value="TestTimeRolling.%d{yyyy-MM-dd}.log"/> <!--Dailly-->
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="logConsoleAppender"/>
<appender-ref ref="logRollingFileAppender"/>
<appender-ref ref="logTimeRollingFileAppender"/>
</root>
<category name="testCategory" >
<level value ="info" />
<appender-ref ref="logTimeRollingFileAppender"/>
</category>
</log4j:configuration>
[.cpp]
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;
#pragma warning ( disable: 4231 )
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/xml/domconfigurator.h>
#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::xml;
int main(void)
{
try
{
string filePath = "log4cxx.conf";
DOMConfigurator::configure(filePath);
LoggerPtr rootlog = Logger::getRootLogger();
LoggerPtr log = Logger::getLogger("");
LOG4CXX_FATAL(log, "fatal output...");
LOG4CXX_ERROR(log, "error output...");
LOG4CXX_WARN(log, "warn output...");
LOG4CXX_INFO(log, "info output...");
LOG4CXX_DEBUG(log, "debug output...");
}
catch (const Exception& e) {
cout << "[ERROR] configure()\n" << e.what() << endl;
}
return EXIT_SUCCESS;
}
**. log4cxx 사용법 reference http://joygram.org/wiki/doku.php?id=log4cxx log4cxx 파일 안의 test 소스 |
Log4cxx - 개인용 샘플
[사용]
#include "LoggerManager.h"
int main(void)
{
wstring xmlfilepath = _T("log4cxx.xml");
try
{
CLoggerManager::initialize(xmlfilepath);
}
catch (const Exception& e)
{
cout << "[ERROR] " << e.what() << endl;
}
CLogger logger = CLoggerManager::getRootLogger();
if (logger.isDebugEnabled())
logger.debug(wstring(_T("hi")));
return 0;
}
Visual Studio 2010 에서 log4cxx 빌드
설치는 위에서 설명한 "log4cxx 빌드 (Visual Studio 2008)" 의 "1. Download Installation File" 와 "2. Installation" 까지 진행 후
log4cxx 솔루션 파일(log4cxx/projects/log4cxx.dsw) 을 Visual Studio 2010으로 열면 프로젝트 자동변환을 진행하고
아래 데로 변경하면 됩니다. (일단 32bit 기준)
설치 바이너리 버전 : apache-log4cxx-0.10.0.zip, apr-1.4.5-win32-src.zip, apr-util-1.3.12-win32-src.zip, sed-4.2.1-setup.exe
1. log4cxx 프로젝트
에러 유형 1. LOG4CXX_LIST_DEF 정의 관련..
log4cxx\src\main\include\log4cxx/helpers/simpledateformat.h(78): error C2252: 템플릿은 네임스페이스 범위에서만 명시적으로 인스턴스화할 수 있습니다.
LOG4CXX_LIST_DEF(..) 를 class 정의 밖으로 옮긴다. (namespace 정의 안, class 정의 밖)
LOG4CXX_LIST_DEF(ConnectionList, Connection); 의 경우 윗줄의
typedef log4cxx::helpers::SocketPtr Connection; 도 같이 옮긴다.
에러 유형 2. KeySet namespace 관련..
..\src\main\cpp\propertiespatternconverter.cpp(62): error C2039: 'KeySet' : 'log4cxx::spi::LoggingEvent'의 멤버가 아닙니다.
LoggingEvent::KeySet keySet 를 KeySet keySet으로 변경. (namespace 제거)
에러 유형 3. iterator 관련..
..\src\main\cpp\propertiespatternconverter.cpp(64): error C2065: 'const_iterator' : 선언되지 않은 식별자입니다.
#include <iterator> 추가
에러 유형 4. apr, aprutil 링크 에러
library 참조 수동 설정 필요.
아래와 같이 Debug, Release 에 대해 수동 설정. Debug는 LibD, Release는 LibR 폴더에 생성됨.
아래와 같이 Debug, Release 에 대해 수동 설정. Debug는 LibD, Release는 LibR 폴더에 생성됨.
"log4cxx > 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉토리 " 추가 (Release 모드는 LibD)
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD
"log4cxx > 프로젝트 속성 > 링커 > 입력 > 추가 종속성 " 추가
apr.lib
aprutil.lib
xml.lib
2. apr 프로젝트
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\.\LibR\apr.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\LibR\apr-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(apr)이(가) Library의 OutputFile 속성 값(apr-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
apr 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\apr.lib 로 변경.
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\apr.lib)
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\apr.lib)
3. aprutil 프로젝트
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(..\log4cxx\apr-util\.\LibR\aprutil.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr-util\LibR\aprutil-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(aprutil)이(가) Library의 OutputFile 속성 값(aprutil-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
aprutil 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\aprutil.lib 로 변경.
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\aprutil.lib)
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\aprutil.lib)
4. apr, aprutil, xml 빌드 후 log4cxx 프로젝트 빌드
log4cxx\projects\Debug 에 log4cxx.lib, log4cxx.dll 파일 생성
log4cxx 64 bit은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.
'C++' 카테고리의 다른 글
MiniDump (미니 덤프 생성하기) (0) | 2010.11.13 |
---|---|
Memory Pool (메모리 풀) (1) | 2010.11.13 |
virtual 와 상속 속성 (0) | 2010.11.10 |
stable priority queue (0) | 2010.11.08 |
Singleton (싱글톤) (0) | 2010.11.05 |
Win32 메모리 누수(Leak) 체크 (1) | 2010.11.04 |
Distributed Environment (분산 환경) (0) | 2010.11.04 |
ATL (Active Template Library) (0) | 2010.11.04 |