openwrt 移植log4j(四)

203 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 安装automake

指定交叉编译工具进行编译功能。--prefix指令安装路径,可以自行修改。

tar zxvf automake-1.16.tar.gz
cd automake-1.16
./configure CC=mipsel-openwrt-linux-uclibc-gcc CXX=mipsel-openwrt-linux-uclibc-g++ LD=mipsel-openwrt-linux-uclibc-ld AR=mipsel-openwrt-linux-uclibc-ar AS=mipsel-openwrt-linux-uclibc-as NM=mipsel-openwrt-linux-uclibc-nm RANLIB=mipsel-openwrt-linux-uclibc-ranlib --prefix=./build --host=mipsel-openwrt-linux-uclibc --enable-static CXXFLAGS="-std=c++11"
make
make install

2. 安装log4j

先解压log4cplus-2.0.6.7z,在复制到linux的/home目录

cd log4cplus-2.0.6
mkdir build
./configure CC=mipsel-openwrt-linux-uclibc-gcc CXX=mipsel-openwrt-linux-uclibc-g++ LD=mipsel-openwrt-linux-uclibc-ld AR=mipsel-openwrt-linux-uclibc-ar AS=mipsel-openwrt-linux-uclibc-as NM=mipsel-openwrt-linux-uclibc-nm RANLIB=mipsel-openwrt-linux-uclibc-ranlib --prefix=/home/log4cplus-2.0.6/build --host=mipsel-openwrt-linux-uclibc --enable-static CXXFLAGS="-std=c++11"
make
make install

3. 移植include和lib

log4j生产在build文件下,把include和lib目录下的文件移动到代码中,修改CMakeLists.txt,编译。 开发板需要移植liblog4cplus-2.0.so.3和libatomic.so.1(我的在~/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib找到)。

4. 使用

4.1 最简单的使用

#include "log4cplus.h"

int main()
{
  log4cplus::Initializer initializer;

  //第1步:创建ConsoleAppender
  log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender());

  //第2步:设置Appender的名称和输出格式(SimpleLayout)
  appender->setName(LOG4CPLUS_TEXT("console"));
  appender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));

  //第3步:获得一个Logger实例,并设置其日志输出等级阈值
  log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
  logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

  //第4步:为Logger实例添加ConsoleAppender
  logger.addAppender(appender);

  //第5步:使用宏将日志输出
  LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
}

4.2 同时输出到控制台和文件

#include <log4cplus/log4cplus.h>
 
int main()
{
    //用Initializer类进行初始化
    log4cplus::Initializer initializer;
 
    //第1步:创建ConsoleAppender和FileAppender(参数app表示内容追加到文件)
    log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender);
    log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(
                                                  LOG4CPLUS_TEXT("log.txt"),
                                                  std::ios_base::app
                                                  )
                                              );
 
    //第2步:设置Appender的名称和输出格式
    //ConsoleAppender使用SimpleLayout
    //FileAppender使用PatternLayout
    consoleAppender->setName(LOG4CPLUS_TEXT("console"));
    consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout()));
    fileAppender->setName(LOG4CPLUS_TEXT("file"));
    log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
    fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));
 
    //第3步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
 
    //第4步:为Logger实例添加ConsoleAppender和FileAppender
    logger.addAppender(consoleAppender);
    logger.addAppender(fileAppender);
 
    //第5步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
 
    return 0;
}

4.3 使用配置文件

新建配置文件log.properties

# 配置文件(其它日志级别配置相同):
# main函数中获取rootLogger
# 通过注释下面两条语句控制输出到到文件还是控制台
# 输出到文件
#log4cplus.rootLogger=TRACE,fileConsole
# 输出到控制台
log4cplus.rootLogger=TRACE,logConsole

# 不向默认对象(rootLogger)输出,因此信息只能输出到文件
log4cplus.additivity.file=false

############################### logConsole ##########################################
# 输出到控制台
log4cplus.appender.logConsole=log4cplus::ConsoleAppender
log4cplus.appender.logConsole.Encoding=utf-8
log4cplus.appender.logConsole.layout=log4cplus::PatternLayout
log4cplus.appender.logConsole.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S}] [%-5p] %m [%l]%n

############################### fileConsole #########################################
log4cplus.appender.fileConsole=log4cplus::TimeBasedRollingFileAppender
# 设置日志输出的的路径文件名
log4cplus.appender.fileConsole.FilenamePattern=/root/log4j_test/log/log4j_test_%d{yyyyMMdd}.log
# 设置日志更新频率为每天
log4cplus.appender.fileConsole.Schedule=DAILY
log4cplus.appender.fileConsole.MaxHistory=365
# 设置日志追加到文件尾
log4cplus.appender.fileConsole.Append=true
log4cplus.appender.fileConsole.RollOnClose=false
log4cplus.appender.fileConsole.CreateDirs=true
#设置生成日志最大个数
log4cplus.appender.fileConsole.MaxHistory=6
log4cplus.appender.fileConsole.Encoding=utf-8
# 设置日志打印方式,PatternLayout为模式布局器,采用了下面设置的格式
log4cplus.appender.fileConsole.layout=log4cplus::PatternLayout
# 设置日志打印格式
log4cplus.appender.fileConsole.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S}] [%-5p] %m [%l]%n
# 匹配相同日志级别,只有wx_uservedio日志才输入到该文件中
log4cplus.appender.fileConsole.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.fileConsole.filters.1.LogLevelMin=DEBUG
log4cplus.appender.fileConsole.filters.1.LogLevelMax=ERROR
log4cplus.appender.fileConsole.filters.1.AcceptOnMatch=true
# 会首先执行filters.2的过滤条件,关闭所有过滤器,然后执行filters.1
log4cplus.appender.fileConsole.filters.2=log4cplus::spi::DenyAllFilter

将log.properties存放到开发板上,路径为/root/log4j_test/cfg/log.properties,与main函数路径对应即可。

#include <log4cplus/log4cplus.h>

int main()
{		log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("/root/log4j_test/cfg/log.properties"));
 
  log4cplus::Logger logger = log4cplus::Logger::getRoot();

  LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello, World!"));
  LOG4CPLUS_DEBUG(logger, LOG4CPLUS_TEXT("Hello, World!"));
  LOG4CPLUS_ERROR(logger, LOG4CPLUS_TEXT("Hello, World!"));
 }

在main函数里doConfigure函数是读取到配置文件,该路径为开发板中的绝对路径。 log4cplus::Logger::getRoot()函数获取到配置文件中,log4cplus.rootLogger对应的配置名为fileConsole或logConsole。 在配置文件下面,配置了两组参数logConsole和fileConsole的参数,通过最上面的log4cplus.rootLogge选择。