使用LOG4CPP

     刚在优快云上问了个问题,记录之,模板,DLL,这些都是难以处理好的东西啊,尤其是模板,正是又爱又恨,最后不想用,又不得不用。
原帖地址为:http://community.youkuaiyun.com/Expert/TopicView3.asp?id=5432653


      下载log4cplus-1.0.2.tar.gz,(注意,不是最新的1.0.3)。解压在vs2005中打开
/log4cplus-1.0.2/msvc6/log4cplus.dsw,并转换为vs2005工程,在debug模式中编译其中的log4cplus_dll工程,可能出现编译错误出现在/log4cplus-1.0.2/src/stringhelper.cxx中,将此文件出错的位置也就是128行左右的__value改名,例如改成__rvalue,然后在118行处添加代码:
typedef std::output_iterator_tag iterator_category;
即可通过编译。


     注意:如在在unicode环境下使用log4cplus,则需要先将log4cplus在unicode下编译出lib,在使用时可以用以下方式:
1.wchar_t *tmp = L"test";
2.Logger logger1 = Logger::getInstance(tmp);

 


      然后在debug模式下编译其他工程如appender_test,可能出现缺少dll错误,将log4cplusd.dll拷贝至工作路径比如/log4cplus-1.0.2/msvc6/tests/appender_test_Debug
下即可运行。直接按F5可能出现编译错是因为thread_test工程编译无法通过。不过继续运行即可,并不影响其他工程运行。单独编译thread_test工程会出现如下错误:


1.   main.obj   :   error   LNK2019:   无法解析的外部符号   "__declspec(dllimport)   public:   class   TestThread   *   __thiscall   log4cplus::helpers::SharedObjectPtr <class   TestThread> ::operator-> (void)const   "   (__imp_??C?$SharedObjectPtr@VTestThread@@@helpers@log4cplus@@QBEPAVTestThread@@XZ),该符号在函数   _main   中被引用


2.   main.obj   :   error   LNK2019:   无法解析的外部符号   "__declspec(dllimport)   public:   void   __thiscall   log4cplus::helpers::SharedObjectPtr <class   TestThread> ::`default   constructor   closure '(void) "   (__imp_??_F?$SharedObjectPtr@VTestThread@@@helpers@log4cplus@@QAEXXZ),该符号在函数   _main   中被引用


3.   main.obj   :   error   LNK2019:   无法解析的外部符号   "__declspec(dllimport)   public:   __thiscall   log4cplus::helpers::SharedObjectPtr <class   TestThread> ::~SharedObjectPtr <class   TestThread> (void) "   (__imp_??1?$SharedObjectPtr@VTestThread@@@helpers@log4cplus@@QAE@XZ),该符号在函数   _main   中被引用
./thread_test_Release/thread_test.exe   :   fatal   error   LNK1120:   3   个无法解析的外部命令


于是去thread_test工程下,里面就一个main.cxx
主要就是这一句:
第83行,
log4cplus::helpers::SharedObjectPtr <TestThread>   threads[NUM_THREADS];


这里无法找到,再看生成的dll文件呢,于是dumpbin一下,发现其导出是这样的。
7         6   0001CD30   ??0?$SharedObjectPtr@VAbstractThread@thread@log4cplus@@@helpers@log4cplus@@QAE@PAVAbstractThread@thread@2@@Z


怎么会这样呢?
而且经过实验,发现VC6编译能够通过,但是通过dumpbin观察,其导出函数与VS2005很不同。


继续google,找到一位和我问题差不多的
http://www.eggheadcafe.com/forumarchives/vclanguage/Aug2005/post23130691.asp


看来就是因为模板不是real   code,所以dll无法根据实际情况导出,这里的class   TestThread只有exe知道,所以link的时候找不到,因为没有生成嘛。而VC6,是像这句话所说
Some   compilers   such   as   VC6   assume   that   all   template   code   must   have   all   possible   instantiations   in   the   ?translation   unit   that   it   is   declared   in,   but   there 's   no   real   justification    


现在我的问题就是,如何做,使得这个代码可以编译通过呢?
还是因为C++本身的语法条件局限,根本就是一个无法解决的问题呢?


多谢多谢!


PS:贪心贪心,还想问问,除了log4cplus外,是否有其他log类。
已试用log4cpp,但是似乎工程都不全,有很多.vcproject都没有,就没有搞。而且也很旧了,是2005年的。
至于log4cxx,下载的0.9.7,看介绍说有不少bug,而0.9.8因为要大改还是啥的,还没出来。
有无其他推荐?


关于这个问题的解决办法可以参考http://topic.youkuaiyun.com/u/20070331/10/7c5c90a5-565f-40a1-9100-6c81b39346e8.html
不过也没有给出比较好的解决方案。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/fangqu/archive/2008/10/27/3157801.aspx

<< `log4cpp` 是一个开源的日志库,类似于 Java 的 `log4j`, 它为 C++ 提供了强大的日志记录功能。下面是关于如何在 C++ 中配置并使用 log4cpp 进行日志输出的方法: 首先你需要确保已安装好 log4cpp 库(可以通过包管理器或源码编译的方式)。接下来按照以下步骤进行设置和调用: ### 配置文件 创建名为 "log4cpp.properties" 或者其他你喜欢的名字作为配置文件,并添加类似如下的内容: ```properties # Root logger option log4j.rootLogger=DEBUG, stdout, file # Direct log messages to stdout and a log file log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=log/output.log log4j.appender.file.MaxFileSize=1MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ``` 请注意上述示例实际上是适用于 log4j (Java) 的配置格式;对于 Log4cpp,你可能需要用对应的语法修改该文件。 实际的Log4Cpp配置应该像这样: ```properties [Category] root = DEBUG, Ostream, File [Ostream] infostring = cout [File] filename = output.log maxfilesize = 1024 * 1024 //单位字节 backupcount = 10 layout = %-7p [%t] (%F:%L) %m%n ``` ### 初始化与使用 然后,在主程序开始处加载这个属性文件以及初始化logger实例: ```cpp #include <iostream> #include <log4cpp/PropertyConfigurator.hh> #include <log4cpp/OstreamAppender.hh> #include <log4cpp/FileAppender.hh> #include <log4cpp/Priority.hh> int main() { try{ // Load configuration from property file. log4cpp::PropertyConfigurator::configure("path/to/log4cpp.properties"); // Get the root category/logger instance named "root" log4cpp::Category& root = log4cpp::Category::getRoot(); // Log some message using different priorities level root.error("An error occurred!"); root.warn("This is just warning."); root.info("Info logging..."); root.debug("Debug information"); // Close all appenders associated with this category. root.shutdown(); } catch(const std::exception &e){ std::cerr << e.what(); } } ``` 这段代码做了以下几个事情: - 使用 PropertyConfigurator 类读取外部配置信息。 - 获取根分类对象,以便我们可以在这个应用程序中定义多个不同级别的子类别。 - 利用获取到的对象来打印错误、警告、通知及调试信息等不同类型的消息。 - 在结束时关闭所有追加器以释放资源。 此外还可以根据需求自定义更多的分类(category),例如按模块分别建立自己的分类体系等等...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值