log4cxx,rapidxml,boost::format组合demo

强大的log4cxx,rapidxml,boost组合起来更加强大:


#include "stdafx.h"

// include log4cxx header files.
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <rapidxml.hpp>
#include <rapidxml_print.hpp>
#include <iostream>
#include <boost/format.hpp>

log4cxx::LoggerPtr logger(log4cxx::Logger::getRootLogger());
log4cxx::LoggerPtr logger2(log4cxx::Logger::getLogger("secondlog"));
log4cxx::LoggerPtr logger3(log4cxx::Logger::getLogger("thirdlog"));

std::string rapidxml2string(const rapidxml::xml_document<>& doc)
{
std::string doc_s;
rapidxml::print(std::back_inserter(doc_s), doc, 0);
return doc_s;
}


int main(int argc, char **argv)
{
int result = EXIT_SUCCESS;
try
{
LOG4CXX_INFO(logger, "Entering application.");
for ( int i=0; i<10; i++ )
{
LOG4CXX_INFO(logger, "loop index:" << i);
}

for ( int j=0; j<1000; j++ )
{
LOG4CXX_INFO(logger2, "second loop index:" << j);
}

for ( int j=0; j<1000; j++ )
{
LOG4CXX_INFO(logger3, "third loop index:" << j);
}

std::string xml = "<r><name>ken</name><birth nation=\"china\">1983-11</birth></r>";
rapidxml::xml_document<> doc; // character type defaults to char
doc.parse<0>((char*)xml.c_str()); // 0 means default parse flags

std::cout << "Name of my first node is: " << doc.first_node()->name() << "\n";

/// rapid xml control routine
// access
rapidxml::xml_node<> *node = doc.first_node()->first_node("birth");
std::cout << "Node birth has value " << node->value() << "\n";
for (rapidxml::xml_attribute<> *attr = node->first_attribute();
attr; attr = attr->next_attribute())
{
std::cout << "Node birth has attribute " << attr->name() << " ";
std::cout << "with value " << attr->value() << "\n";
}

// modify
rapidxml::xml_node<>* new_node = doc.allocate_node(rapidxml::node_element, "a", "Google");
doc.first_node()->append_node(new_node);
rapidxml::xml_attribute<> *attr = doc.allocate_attribute("href", "google.com");
new_node->append_attribute(attr);

// print
std::cout << "after modified:" << std::endl;
std::string doc_s = rapidxml2string(doc);

LOG4CXX_INFO(logger, boost::format("final xml:%s") % doc_s); // boost::format+log4cxx,powerful
LOG4CXX_INFO(logger, "Exiting application.");
}
catch(log4cxx::helpers::Exception& e)
{
result = EXIT_FAILURE;
}

getchar();

return result;
}


log4cxx的典型配置文件:

log4j.rootLogger=DEBUG, stdout, R
#log4j.rootLogger=debug, R

#log4j.rootLogger=debug, stdout
#log4j.rootLogger=debug

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log/example.log

log4j.appender.R.MaxFileSize=2KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %t %c - %m%n


#second log
log4j.logger.secondlog=DEBUG, a2
log4j.additivity.secondlog = false

log4j.appender.a2=org.apache.log4j.RollingFileAppender
log4j.appender.a2.File=log/second2.log

log4j.appender.a2.MaxFileSize=2KB
# Keep 5 backup file
log4j.appender.a2.MaxBackupIndex=5

log4j.appender.a2.layout=org.apache.log4j.PatternLayout
log4j.appender.a2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %t %c - %m%n

#third log
log4j.logger.thirdlog=DEBUG, a3
log4j.additivity.thirdlog = false

log4j.appender.a3=org.apache.log4j.RollingFileAppender
log4j.appender.a3.File=log/thirdlog.log

log4j.appender.a3.MaxFileSize=2KB
# Keep 5 backup file
log4j.appender.a3.MaxBackupIndex=5

log4j.appender.a3.layout=org.apache.log4j.PatternLayout
log4j.appender.a3.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %t %c - %m%n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值