Log4Cxx 的使用方法

Table of Contents

1 Log4cxx 介绍

Log4Cxx 是 Apache 软件基金会的产物,算是 log4j 比较根正苗红的产物。

如果能用一个好用的日志类来在程序里对程序进行追踪,将对工程的开发与调试,大有裨益。

2 Windows 下的编译与使用方法

对于我们来说,我们 C++ 程序员希望 log 类具有以下几种特点:

  1. 彩色输出,即根据 debug 或 info 这样的情形,输出不同色彩的 log;
  2. 要简洁,支持跨平台。

2.1 Log4Cxx 在 Windows 下的编译

Apache log4cxx 有官方文档专门讲述如何在 Visual Studio 里编译 log4cxx,log4cxx 在 Visual Studio 里的编译并不难,可是,还是有许多需要注意的地方。

下载的原始文件包中没有包含编译后的开发库,需要自己编译生成,本文使用vc.net2003编译该源文件,编译时需要如下文件包:

apr-1.2.11-win32-src.zip和apr-util-1.2.10-win32-src.zip

这两个压缩包的下载地址分别如下:

http://archive.apache.org/dist/apr/apr-1.2.11-win32-src.zip

http://archive.apache.org/dist/apr/apr-util-1.2.10-win32-src.zip

下载完成后将这两个文件分别解压缩到和上面源代码相同的目录下。然后按照如下步骤进行编译:

a. 将apr-1.2.11-win32-src.zip解压后的文件名修改为:apr

b. 将apr-util-1.2.10-win32-src.zip解压后的文件名修改为:apr-util

c. 通过vc.net2003的DOS工具进入DOS窗口,此处直接在运行命令栏中输入cmd也可,不过为安全起见最后从.net2003的工具栏进入DOS界面

d. 使用cd 命令进入apache-log4cxx-0.10.0目录

e. 输入configure命令,执行configure.bat批处理文件

f. 输入configure-aprutil命令,执行configure-aprutil.bat批处理文件。

在运行 configure 命令的时候,正常情况应该会出现如下情况:

E:\test\apache-log4cxx-0.10.0>configure

E:\test\apache-log4cxx-0.10.0>ECHO OFF
已复制         1 个文件。
已复制         1 个文件。

当运行 configure-aprutil 的时候,出现如下错误:

E:\test\apache-log4cxx-0.10.0>ECHO OFF
'sed' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'sed' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
E:\test\apache-log4cxx-0.10.0>configure-aprutil

由于在 configure-aprutil.bat 文件中使用了 Linux 下的 sed 命令,所以该步可能会出现类似找不到 sed 命令的错误,这是由于在 Windows 环境下编译的缘故。可以使用如下三种方法解决:

  1. 下载一个sed for windows的工具;
  2. 使用Cygwin,在 Cygwin 里切换到 log4cxx 目录,再运行 configure-aprutil.bat;
  3. 手动修改 apr-util\include\apu.hw 里的内容
#define APU_HAVE_APR_ICONV      1

改为

#define APU_HAVE_APR_ICONV      0

不过浏忙绪绪强烈推荐使用第二种方法,既简单又方便。

现在你应该可以顺便地在 Windows 平台上用 Visual Studio 编译 log4cxx 了,到目录

\apache-log4cxx-0.10.0\projects

里打开工程 log4cxx.dsw 编译后会生成库文件 log4cxx.lib 和 log4cxx.lib,当然,你需要针对 release 和 debug 两个版本进行编译。

然后把这些东西整理成可链接的代码:

apache-log4cxx-0.10.0\src\main\include

以及 release 和 debug 编译出来的动态链接库。

实例代码:

a.打开 VS2005,新建一个空白的win32控制台工程,假设工程名为Test

b.添加一个cpp文件,文件名随便命名

c.右键点击Test工程,选择”属性”,然后在C++选项卡中添加附加包含目录,注意该目录为../ apache-log4cxx-0.10.0\src\main\include

附加库目录也应该设置为 XXXX

d.在属性的链接器输入选项卡的”附加依赖项”中添加” log4cxx.lib”

2.2 问题

提示如下错误:

错误    47      fatal error C1083: 无法打开包括文件:“apr.h”: No such file or directory        e:\test\apache-log4cxx-0.10.0\src\main\cpp\class.cpp    74

可以直接把 /apr/include/apr.h 这个文件改为 apr.h 即可。

同样,还有会提示如下错误的话:

错误    47      fatal error C1083: 无法打开包括文件:“apu.h”: No such file or directory        e:\test\apache-log4cxx-0.10.0\src\main\cpp\class.cpp    74

可以直接把 /apr-util/include/apu.hw 这个文件改为 apu.h

3 使用方法

把头文件包含进去,再链接库文件,再用下面的代码试一下:

#include "log4cxx/logger.h"
#include "log4cxx/basicconfigurator.h"
#include "log4cxx/helpers/exception.h"

using namespace std;
using namespace log4cxx;
using namespace log4cxx::helpers;


int _tmain(int argc, _TCHAR* argv[])
{
        ///@todo 重定向到文件
   LoggerPtr logger(Logger::getLogger("MyApp"));

   try
   {
       BasicConfigurator::configure();
       LOG4CXX_INFO(logger, _T("hello"));
       LOG4CXX_DEBUG(logger, "world");

           int x = 0;
           for ( x; x < 100; x++ )
           {
                   LOG4CXX_INFO();
           }
   }
   catch (Exception&)
   {

   }
   return 0;
}

3.1 如何重定向一个 log 到文件?

如果需要把日志同时输出到命令行及定向到文件,则需要使用如下测试代码:

#include "log4cxx/logger.h"
#include "log4cxx/PropertyConfigurator.h"

using namespace std;
using namespace log4cxx;
using namespace log4cxx::helpers;


int _tmain(int argc, _TCHAR* argv[])
{
        ///@todo 重定向到文件
    string trace = "fa";
    string Property = "./log4cxx.properties";
    log4cxx::PropertyConfigurator::configure(Property);
    LoggerPtr logger = Logger::getLogger(trace);
    logger->info(("How to use?"));
    LOG4CXX_INFO(logger, ("你说hello"));

    for(int i = 0; i < 2; i++)
    {
        LOG4CXX_DEBUG(logger, "DEBUG");
        LOG4CXX_INFO(logger, "INFO"); 
        LOG4CXX_WARN(logger, "WARN");
        LOG4CXX_ERROR(logger, "ERROR");
    }

    return 0;
}

同时,在程序的可执行目录里,添加名为 log4cxx.properties 的文本文件,并键入如下内容:

# 设置root logger为DEBUG级别,使用了ca和fa两个Appender
log4j.rootLogger=DEBUG, ca, fa

#对Appender fa进行设置:
# 这是一个文件类型的Appender,
# 其输出文件(File)为./output.log,
# 输出方式(Append)为覆盖方式,
# 输出格式(layout)为PatternLayout
log4j.appender.fa=org.apache.log4j.FileAppender
log4j.appender.fa.File=./output.log
log4j.appender.fa.Append=false
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

#对Appender ca进行设置
# 这是一个控制台类型的Appender
# 输出格式(layout)为PatternLayout
log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

将编译好的 log4cxx.lib 和 log4cxx.dll 及上面的 log4cxx.properties 文件拷贝到编译目录下,编译运行该文件,可以看到控制台输出相关日志,并且在工程目录下会得到一个 output.log 的日志文件。

Author: Water Lin <WaterLin.org@gmail.com>

Date: 2011-09-08 13:28:25

HTML generated by org-mode 6.33x in emacs 23