// log4cplus.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include "log4cpp/FileAppender.hh"
#include <log4cpp/OstreamAppender.hh>
#include "log4cpp/NTEventLogAppender.hh"
#include <log4cpp/StringQueueAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
//#include "log4cpp/SyslogAppender.hh"
#include <log4cpp/Layout.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/BasicConfigurator.hh>
#include <log4cpp/PropertyConfigurator.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/NDC.hh>

#include <string>
#include <queue>

using namespace std;
using namespace log4cpp;

#pragma comment(lib,".\\Result\\log4cpp.lib")

void TestFileAppender();
void TestOstreamAppender();
void TestSyslogAppender();
void Ndc();
void TestNTEventAppender();
void TestPatternLayout();
void TestPropConfig();
void TestStringQueue();
void TestRollingFile();

int _tmain(int argc, _TCHAR* argv[])
{
    TestFileAppender();
    TestOstreamAppender();
    //TestSyslogAppender();            //#include <syslog.h> 不存在
    Ndc();
    TestNTEventAppender();
    TestPatternLayout();
    TestPropConfig();
    TestStringQueue();
    TestRollingFile();

system("puase");
    return 0;
}

void testLogva(log4cpp::Category& category,log4cpp::Priority::Value priority, const char* stringFormat,...)
{
    va_list va;
    va_start(va, stringFormat);
    category.logva(priority, stringFormat, va);
    va_end(va);
}

void TestFileAppender()
{
    log4cpp::Appender* appender = new log4cpp::FileAppender("default", "fileappender.log");
    log4cpp::Layout* layout = new log4cpp::BasicLayout();
    appender->setLayout(layout);
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.addAppender(appender);
    root.setPriority(log4cpp::Priority::INFO);
    root.log(log4cpp::Priority::INFO, "reopen log");
    if (appender->reopen())                                                        //reopenAll()
    {
        root.info("log reopened");
    }
    else
    {
        root.warn("could not reopen log");
    }
    root.log(log4cpp::Priority::ERROR, "reopen log");
    if (appender->reopen())                                                        //reopenAll()
    {
        root.info("log reopened");
    }
    else
    {
        root.warn("could not reopen log");
    }

log4cpp::Category::shutdown();
}
void TestOstreamAppender()
{
    log4cpp::Appender* appender = new log4cpp::OstreamAppender("appender", &std::cout);
    log4cpp::Layout* layout = new log4cpp::BasicLayout();
    appender->setLayout(layout);
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.setPriority(log4cpp::Priority::ERROR);
    root.removeAllAppenders();
    root.addAppender(appender);
    root.error("root error #1");
    root.warn("root error #2");        //不能被输出
    log4cpp::Appender* subappender = new log4cpp::OstreamAppender("appender", &std::cout);
    log4cpp::Category& sub = log4cpp::Category::getInstance(std::string("sub1"));
    sub.addAppender(subappender);
    sub.error("root error #3");        //输出两次
    std::cout<<(root.getAppender() == appender)<<std::endl;
    std::cout<<(root.getAppender() == subappender)<<std::endl;
    root.removeAllAppenders();
    sub.removeAllAppenders();
    root.error("root error #4");    //不能被输出
    sub.error("root error #5");        //不能被输出
    std::cout<<(root.getAppender() == subappender)<<std::endl;
    //root.addAppender(appender);    //直接中断错误
    root.error("root error #6");    //不能被显示
    root.removeAllAppenders();
    appender = new log4cpp::OstreamAppender("appender", &std::cout);
    root.addAppender(appender);
    root.error("root error #6");
    subappender = new log4cpp::OstreamAppender("appender", &std::cout);
    sub.addAppender(subappender);
    sub.setAdditivity(false);        //false覆盖,true添加又一端口
    sub.error("root error #7");        //只显示一次

std::cout << " root priority = " << root.getPriority() << std::endl;
    std::cout << " sub priority = " << sub.getPriority() << std::endl;
    sub.setPriority(log4cpp::Priority::INFO);
    std::cout << " root priority = " << root.getPriority() << std::endl;
    std::cout << " sub priority = " << sub.getPriority() << std::endl;

testLogva(root, log4cpp::Priority::EMERG, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::ALERT, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::CRIT, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::ERROR, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::WARN, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::INFO, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::NOTICE, "This contains %d %s", 2, "variable arguments");
    testLogva(root, log4cpp::Priority::DEBUG, "This contains %d %s", 2, "variable arguments");

sub.warn("sub2 warn");
    sub.error("%s %s %d", "test", "vform", 123);
    sub.warnStream() << "streamed warn";

sub << log4cpp::Priority::WARN << "warn2.." << "..warn3..value=" << 0
        << log4cpp::eol << "..warn4";

/*root.removeAllAppenders();
    sub.removeAllAppenders();*/
    std::vector<log4cpp::Category*>* allCats;
    std::vector<log4cpp::Category*>::const_iterator iter;
    allCats = log4cpp::Category::getCurrentCategories();
    // remove all appenders from all categories
    for (iter = allCats->begin(); iter != allCats->end(); iter++) {
        (*iter)->removeAllAppenders();
    }

log4cpp::Category::shutdown();
}

void TestSyslogAppender()
{
    /*log4cpp::SyslogAppender* syslogAppender;
    syslogAppender = new log4cpp::SyslogAppender("syslog", "log4cpp");*/
    log4cpp::Appender*syslogAppender = new log4cpp::FileAppender("default", "fileappender");
    syslogAppender->setLayout(new log4cpp::BasicLayout());
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.addAppender(syslogAppender);
    root.setPriority(log4cpp::Priority::ERROR);
    root.log(log4cpp::Priority::NOTICE, "reopen log");
    if (log4cpp::Appender::reopenAll())
    {
        root.info("log reopened");
    }
    else
    {
        root.warn("could not reopen log");
    }
    log4cpp::Category::shutdown();
}

void Ndc()
{
    std::cout << "1. empty NDC: " << NDC::get() << std::endl;
    NDC::push("context1");
    std::cout << "2. push context1: " << NDC::get() << std::endl;
    NDC::push("context2");
    std::cout << "3. push context2: " << NDC::get() << std::endl;
    NDC::push("context3");
    std::cout << "4. push context3: " << NDC::get() << std::endl;
    std::cout << "5. get depth: " << NDC::getDepth() << std::endl;
    std::cout << "6. pop: " << NDC::pop() << std::endl;
    NDC::clear();
    std::cout << "7. clear: " << NDC::get() << std::endl;

for(int i = 0; i < 100; i++)
    {
        char ndc2[20];
        sprintf(ndc2, "i=%d", i);
        log4cpp::NDC::push(ndc2);
        std::cout << i<<" : " << NDC::get() << std::endl;
        log4cpp::NDC::pop();
    }
    log4cpp::Category::shutdown();
}

void TestNTEventAppender()
{
    log4cpp::Appender* appender = new log4cpp::NTEventLogAppender("default", "testNTEventAppender.Log");
    log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
    sub1.addAppender(appender);
    sub1.setPriority(log4cpp::Priority::DEBUG);

sub1.emerg("sub1 emerg");
    sub1.fatal("sub1 fatal");
    sub1.alert("sub1 alert");
    sub1.crit("sub1 crit");
    sub1.error("sub1 error");
    sub1.warn("sub1 warn");
    sub1.notice("sub1 notice");
    sub1.info("sub1 info");
    sub1.debug("sub1 debug");
    sub1.log(log4cpp::Priority::NOTSET, "sub1 notset");
    sub1.log(log4cpp::Priority::ERROR, "sub1 error");

log4cpp::Category::shutdown();

}

void TestPatternLayout()
{
    /*log4cpp::Appender* appender = new log4cpp::OstreamAppender("appender", &std::cout);
    log4cpp::PatternLayout* layout = new log4cpp::PatternLayout();
    appender->setLayout(layout);
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.addAppender(appender);*/

log4cpp::BasicConfigurator::configure();                                                //初始化
    log4cpp::PatternLayout* layout = new log4cpp::PatternLayout();

layout->setConversionPattern("%d: %p %c %x: %m%n");
    log4cpp::Category::getRoot().getAppender()->setLayout(layout);

log4cpp::Category& root = log4cpp::Category::getRoot();
    log4cpp::NDC::push("ndc1");
    root.error("message");
    std::string format = "%% %r %c:%d (%R / %r) [%p] %x %m %% (%u) %n";
    layout->setConversionPattern(format);
    root.error("message");

// test date format
    format = "%d{%d %b %Y %H:%M:%S.%l} %m %n";
    layout->setConversionPattern(format);
    root.error("message");
    format = "%d{%d %b %Y %H:%M:%S.%l";
    layout->setConversionPattern(format);
    root.error("message");
    format = "%d%n";
    layout->setConversionPattern(format);
    root.error("message");

format = "%.32m %d%n";
    layout->setConversionPattern(format);
    int i;
    for (i = 0; i < 10; i++)
    {
        root.error("%d message", i);
    }

format = "%32m %d{%H:%M:%S.%l %d %b %Y}%n";
    layout->setConversionPattern(format);
    for (i = 0; i < 10; i++)
    {
        root.error("%d message", i);
    }
}

void TestPropConfig()
{
    std::string initFileName;
    initFileName = ".\\include\\tests\\log4cpp.nt.property";
    log4cpp::PropertyConfigurator::configure(initFileName);

log4cpp::Category& root = log4cpp::Category::getRoot();

log4cpp::Category& sub1 =
        log4cpp::Category::getInstance(std::string("sub1"));

log4cpp::Category& sub2 =
        log4cpp::Category::getInstance(std::string("sub1.sub2"));

root.error("root error");
    root.warn("root warn");
    sub1.error("sub1 error");
    sub1.warn("sub1 warn");
    // the following 2 should only be in A1, not A2
    sub1.info("sub1 info");
    sub1.debug("sub1 debug");

// do a few so that the log rolls over
    sub2.warn("sub2 warn 1");
    sub2.warn("sub2 warn 2");
    sub2.warn("sub2 warn 3");
    sub2.warn("sub2 warn 4");
    sub2.warn("sub2 warn 5");
    sub2.warn("sub2 warn 6");
    sub2.warn("sub2 warn 7");

#if defined(WIN32)
    log4cpp::Category& nt = log4cpp::Category::getInstance(std::string("subNT"));
    nt.error("subNT error");
    nt.warn("subNT warn");
    nt.debug("subNT debug");
#endif

log4cpp::Category::shutdown();

}

void TestStringQueue()
{
    log4cpp::StringQueueAppender* strQAppender = new log4cpp::StringQueueAppender("strQAppender");
    strQAppender->setLayout(new log4cpp::BasicLayout());
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.addAppender(strQAppender);
    root.setPriority(log4cpp::Priority::DEBUG);
    root.error("Hello log4cpp in a Error Message!");
    root.warn("Hello log4cpp in a Warning Message!");
    cout<<"Get message from Memory Queue!"<<endl;
    cout<<"-------------------------------------------"<<endl;
    queue<string>& myStrQ = strQAppender->getQueue();
    while(!myStrQ.empty())
    {
        cout<<myStrQ.front();
        myStrQ.pop();
    }
}

void TestRollingFile()
{
    log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();
    pLayout1->setConversionPattern("%d: %p %c %x: %m%n");
    log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();
    pLayout2->setConversionPattern("%d: %p %c %x: %m%n");
    log4cpp::Appender* fileAppender = new log4cpp::FileAppender("fileAppender","wxb.log");
    fileAppender->setLayout(pLayout1);
    log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender( "rollfileAppender","rollwxb.log",5*1024,1);
    rollfileAppender->setLayout(pLayout2);
    log4cpp::Category& root = log4cpp::Category::getRoot().getInstance("RootName");
    root.addAppender(fileAppender);
    root.addAppender(rollfileAppender);
    root.setPriority(log4cpp::Priority::DEBUG);
    for (int i = 0; i < 100; i++)
    {
        string strError;
        ostringstream oss;
        oss<<i<<":Root Error Message!";
        strError = oss.str();
        root.error(strError);
    }
    log4cpp::Category::shutdown();
}

/*

# property configurator test file

log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, A1, A2
log4cpp.category.sub1.sub2=DEBUG, A3

log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=BasicLayout

log4cpp.appender.A1=FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=PatternLayout
log4cpp.appender.A1.layout.ConversionPattern=The message %m at time %d%n

log4cpp.appender.A2=FileAppender
log4cpp.appender.A2.threshold=WARN
log4cpp.appender.A2.fileName=A2.log
log4cpp.appender.A2.layout=PatternLayout
log4cpp.appender.A2.layout.ConversionPattern=The message %m at time %d%n

log4cpp.appender.A3=RollingFileAppender
log4cpp.appender.A3.fileName=A3.log
log4cpp.appender.A3.maxFileSize=80
log4cpp.appender.A3.maxBackupIndex=1
log4cpp.appender.A3.layout=PatternLayout
log4cpp.appender.A3.layout.ConversionPattern=The message %m at time %d{%H:%M}%n

log4cpp.category.subNT=INFO, subNT
log4cpp.appender.subNT=NTEventLogAppender
log4cpp.appender.subNT.source=log4cpp-test

*/

/*
    log4cpp::FileAppender                       // 输出到文件

log4cpp::RollingFileAppender                // 输出到回卷文件,即当文件到达某个大小后回卷

log4cpp::OstreamAppender                    // 输出到一个ostream类

log4cpp::StringQueueAppender                // 内存队列

log4cpp::Win32DebugAppender                    // 发送到缺省系统调试器

log4cpp::NTEventLogAppender                    // 发送到win 事件日志

*/

log4cpp基础测试的更多相关文章

  1. myBatis 基础测试 表关联关系配置 集合 测试

    myBatis 基础测试 表关联关系配置 集合 测试 测试myelipse项目源码 sql 下载 http://download.csdn.net/detail/liangrui1988/599388 ...

  2. mysql基础测试

    mysql基础测试 测试原因   为什么需要做性能测试 模拟比当前系统更高的负载,找出性能瓶颈 重现线上异常 测试不同硬件软件配置 规划未来的业务增长   测试分类   性能测试的分类 设备层的测试 ...

  3. 基础测试jmeter5.0+badboy(从小白到入门)

    1]测试工具jmeter环境安装 1.1]安装jdk环境 1:必须安装jdk8.0(我尝试安装最新版本不行,好像当时没有配置好.之后安装8.0遍可以正常运行)下载地址:单击此段 配置jdk环境:鼠标右 ...

  4. 性能测试基础---测试流程,LR安装

    ·性能测试流程详解: 一般来说,性能测试通常可以分为以下过程: ·前期分析.测试计划.测试方案.测试环境的搭建.测试数据的准备.测试脚本的开发.测试场景的设计.测试场景的实现和执行.资源的监控.分析结 ...

  5. Kubeasz部署K8s基础测试环境简介

    下面介绍使用Kubeasz部署K8s集群环境. https://github.com/easzlab/kubeasz在需要使用kubeeasz项目安装的k8s时,需要将所有需要它来部署的节点上,都安装 ...

  6. weed-fs 基础测试

    =================== 启动 master 端口:9333 =================== sunsl@test-server:~$ weed master I0102 15: ...

  7. Linux基础测试--11道题

    000.创建一个目录/data mkdir /data 001.在/data 下面创建一个文件oldboy.txt touch /data/oldboy.txt 002.为oldboy.txt 增加内 ...

  8. Hive基础测试操作

    一.Hive测试 1.查看数据库 show databases; 2.使用某个数据库,如默认数据库 user default; 3.创建表 create table if not exist itst ...

  9. Python基础测试有关联的接口

    test_guanlian.py放在case文件夹下 test_guanlian.pyimport unittest import requestsfrom urllib.parse import u ...

随机推荐

  1. 【MongoDB】windows下搭建Mongo主(Master)/从(slave)数据库同步

    在前面一系列的文章中.我们讲述了mongodb的基本操作,高级查询以及索引的使用. 该篇博客主要说明在windows系统怎样创建主从数据库同步: 须要启动两个mongoDb文档数据库,一个是主模式启动 ...

  2. [ring3反作弊篇] 基于EBP遍历调用栈及模块名

    http://blog.csdn.net/wangningyu/article/details/44569803

  3. JavaScript面试(-------------------------------------------)

    this是什么 方法调用模式 构造器调用模式 函数调用模式 apply/call模式 this是什么 —大多语言中,’this’代表由类实例化的当前对象.在JavaScript中,’this’通常表示 ...

  4. 初识小米Minos

    1. Minos框架的基本介绍 小米公司不仅仅在搞手机以及MIUI rom的研发工作,云计算.虚拟化以及Hadoop也是小米现在在搞的东西,小米与2012年下半年成立了自己的Hadoop团队.介绍小米 ...

  5. 使用 pm2-web 监控 pm2 服务运行状态

    pm2-web 是一款 pm2 服务状态监控程序,基于 web . 安装 $ npm install -g pm2-web 运行(默认是在8080端口) $ pm2-web 配置 pm2-web 将会 ...

  6. 全负荷的 Node.js[转载]

    一个Node.JS 的进程只会运行在单个的物理核心上,就是因为这一点,在开发可扩展的服务器的时候就需要格外的注意. 因为有一系列稳定的API,加上原生扩展的开发来管理进程,所以有很多不同的方法来设计一 ...

  7. Struts2典型应用

    1. Struts2处理表单数据 例1.1 创建Java Web项目,编写一个Action对象,处理对表单提交的数据,模拟实现对指定用户的问候. (1)创建Java Web项目,将Struts的支持类 ...

  8. 通过nc构造telnet后门

    nc被称为网络中的“瑞士军刀”,其功能强大,如果在肉鸡上运行“nc.exe –p port –L –d –e cmd.exe”命令就可以构建一个telnet后门,即使关闭了nc.exe程序运行窗口,该 ...

  9. 数据库 DB MySQL 基本操作 CRUD 多表 MD

    操作数据库 创建数据库:create 创建一个名称为mydb1的数据库 create database mydb1; 创建一个使用gbk字符集的mydb2数据库 create database myd ...

  10. [Python爬虫] 之四:Selenium 抓取微博数据

    抓取代码: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.suppor ...