对log4cpp进一步封装

mac2022-06-30  19

//Mylog.h如下:

#pragma once//#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/SimpleLayout.hh>#include <log4cpp/PatternLayout.hh>#include <log4cpp/BasicConfigurator.hh>#include <log4cpp/PropertyConfigurator.hh>#include <log4cpp/Priority.hh>#include <log4cpp/NDC.hh>#include <string>#include "log4cppEnum.h "using namespace std;using namespace log4cpp;#pragma comment(lib,".\\Result\\log4cpp.lib")        ////enum PriorityLevel//{    //    EMERG,                        //EMERG  = 0, //    FATAL,                        //FATAL  = 0,//    ALERT,                        //ALERT  = 100,//    CRIT,                        //CRIT   = 200,//    ERROR,                        //ERROR  = 300, //    WARN,                        //WARN   = 400,//    NOTICE,                        //NOTICE = 500,//    INFO,                        //INFO   = 600,//    DEBUG,                        //DEBUG  = 700,//    NOTSET,                        //NOTSET = 800,//    PriorityLevel_Num            //PriorityLevel_Num = 10//};////enum AppenderStyle//{//    CONSOLE_APPENDER,            //无//    OSTREAM_APPENDER,//    FILE_APPENDER,//    ROLLING_FILE_APPENDER,//    STRING_QUEUE_APPENDER,//    NTEVENTLOG_APPENDER,//    SYSLOG_APPENDER,            //无            //    LogStyle_Num//};////enum LayoutStyle//{//    BASIC_LAYOUT,//    SIMPLE_LAYOUT,//    PATTERN_LAYOUT,//    layoutStyle_Num//};class MyLog{private:    PriorityLevel m_prioritylevel;    AppenderStyle m_appenderstyle;    LayoutStyle m_layoutstyle;    log4cpp::Appender* m_pAppender;    log4cpp::Layout* m_pLayout;    log4cpp::Category* m_pCategory;public:    MyLog(void);    ~MyLog(void);public:    //void NotSet();    void Debug(const char* msg);    void Info(const char* msg);    void Notice(const char* msg);    void Warn(const char* msg);    void Error(const char* msg);    void Crit(const char* msg);    void Alert(const char* msg);    void Fatal(const char* msg);    void Emerg(const char* msg);    void SetPriority(PriorityLevel level);    void SetAppender(AppenderStyle style, const char*  filename = nullptr);    void SetLayout(LayoutStyle style);    void SetPatternFormat(const char* format = nullptr);    void ShowAllStringQueueMessages(const char* filename = nullptr);    void Message(PriorityLevel level, std::string format, ...);    void SetNDC(const char* ndc);    void ClearNDC();    void LoadConfigure(const char* filename = nullptr);    MyLog& operator<<(PriorityLevel level);    MyLog& operator<<(const char* msg);    MyLog& operator<<(std::string& msg);    MyLog& operator>>(AppenderStyle appender);    MyLog& operator>>(const char* szFileName);    std::string bin2str( const unsigned char* buf, int nstrlen );};

//MyLog.cpp如下:

#include "StdAfx.h"#include "MyLog.h"#include <queue>#include <fstream>#include <cstdio>                    // for vsprintf #include <cstdarg>//#include <vector>MyLog::MyLog(void){    log4cpp::NDC::clear();    m_prioritylevel = NOTSET;    m_appenderstyle = OSTREAM_APPENDER;    m_layoutstyle = BASIC_LAYOUT;    m_pAppender = new log4cpp::OstreamAppender("OstreamAppender", &std::cout);    m_pLayout = new log4cpp::BasicLayout();    m_pAppender->setLayout(m_pLayout);    m_pCategory = &log4cpp::Category::getRoot();    m_pCategory->setAppender(m_pAppender);    m_pCategory->setPriority(log4cpp::Priority::DEBUG);}MyLog::~MyLog(void){    log4cpp::NDC::clear();    log4cpp::Category::shutdown();}//void MyLog::NotSet()//{////}void MyLog::Debug(const char* msg)    {    m_pCategory->debug(msg);}void MyLog::Info(const char* msg)    {    m_pCategory->info(msg);}void MyLog::Notice(const char* msg){    m_pCategory->notice(msg);}void MyLog::Warn(const char* msg)    {    m_pCategory->warn(msg);}void MyLog::Error(const char* msg)    {    m_pCategory->error(msg);}void MyLog::Crit(const char* msg)    {    m_pCategory->crit(msg);}void MyLog::Alert(const char* msg)    {    m_pCategory->alert(msg);}void MyLog::Fatal(const char* msg)    {    m_pCategory->fatal(msg);}void MyLog::Emerg(const char* msg)    {    m_pCategory->emerg(msg);}void MyLog::SetPriority(PriorityLevel level){    m_prioritylevel = level;    switch (m_prioritylevel)    {    case EMERG:        m_pCategory->setPriority(log4cpp::Priority::EMERG);        break;    case FATAL:        m_pCategory->setPriority(log4cpp::Priority::FATAL);        break;    case ALERT:        m_pCategory->setPriority(log4cpp::Priority::ALERT);        break;    case CRIT:        m_pCategory->setPriority(log4cpp::Priority::CRIT);        break;    case ERROR:        m_pCategory->setPriority(log4cpp::Priority::ERROR);        break;    case WARN:        m_pCategory->setPriority(log4cpp::Priority::WARN);        break;    case NOTICE:        m_pCategory->setPriority(log4cpp::Priority::NOTICE);        break;    case INFO:        m_pCategory->setPriority(log4cpp::Priority::INFO);        break;    case DEBUG:        m_pCategory->setPriority(log4cpp::Priority::DEBUG);        break;    case NOTSET:        //default        //break;    default:        //m_pCategory->setPriority(log4cpp::Priority::NOTSET);            //根节点不能设置为NOTSET        m_pCategory->setPriority(log4cpp::Priority::DEBUG);        break;    }}void MyLog::SetAppender(AppenderStyle style, const char* filename){    m_pCategory->removeAppender(m_pAppender);    m_appenderstyle = style;    switch (m_appenderstyle)    {    case FILE_APPENDER:        if (nullptr == filename)        {            filename = "fileappender.log";        }         m_pAppender = new log4cpp::FileAppender("FileAppender", filename);        break;    case ROLLING_FILE_APPENDER:        if (nullptr == filename)        {            filename = "RollingFileAppender.log";        }         m_pAppender = new log4cpp::RollingFileAppender( "RollingFileAppender",filename, 1*1024*1024, 10);        break;    case STRING_QUEUE_APPENDER:        m_pAppender = new log4cpp::StringQueueAppender("StringQueueAppender");        break;    case NTEVENTLOG_APPENDER:        if (nullptr == filename)        {            filename = "NTEventLogAppender.log";        }         m_pAppender = new log4cpp::NTEventLogAppender("NTEventLogAppender", filename);        break;    case SYSLOG_APPENDER:        //NULL                                                                            //break;                                                case CONSOLE_APPENDER:        //NULL            //break;    case OSTREAM_APPENDER:        //default        //break;            default:        m_pAppender = new log4cpp::OstreamAppender("OstreamAppender", &std::cout);        break;    }    m_pCategory->setAppender(m_pAppender);}void MyLog::SetLayout(LayoutStyle style){    m_layoutstyle = style;    switch (m_layoutstyle)    {    case SIMPLE_LAYOUT:        m_pLayout = new log4cpp::SimpleLayout();        break;    case PATTERN_LAYOUT:        m_pLayout = new log4cpp::PatternLayout();        ((PatternLayout*)m_pLayout)->setConversionPattern("%t\t%p\t%x:%m\t\t%d{%Y-%m-%d %H:%M:%S.%l}%n");        break;    case BASIC_LAYOUT:    default:        m_pLayout = new log4cpp::BasicLayout();        break;    }    m_pAppender->setLayout(m_pLayout);}void MyLog::ShowAllStringQueueMessages(const char* filename){    if (m_appenderstyle == STRING_QUEUE_APPENDER)    {        queue<string>& myStrQ = ((StringQueueAppender*)m_pAppender)->getQueue();        if (filename == nullptr)        {            filename = "stringqueue.log";        }        ofstream writetofile(filename);        while(!myStrQ.empty())        {            std::string& stringqueue = myStrQ.front();            cout<< stringqueue;            //writetofile.write(stringqueue.c_str(),stringqueue.size());            writetofile<<stringqueue<<endl;            writetofile.flush();            myStrQ.pop();        }        writetofile.close();    }}void MyLog::SetPatternFormat(const char* format){    if (m_layoutstyle == PATTERN_LAYOUT)    {        if (format != nullptr)        {            ((PatternLayout*)m_pLayout)->setConversionPattern(format);        }         else        {            ((PatternLayout*)m_pLayout)->setConversionPattern("%t\t%p\t%x:%m\t\t%d{%Y-%m-%d %H:%M:%S.%l}%n");        }    }}void MyLog::Message(PriorityLevel level, std::string format, ...){    std::string message;                                        //vector<char>    va_list args;    va_start(args,format);    message.reserve(_vscprintf(format.c_str(),args) + 1);        //_vscprintf只能在windows上使用    vsprintf((char*)message.c_str(),format.c_str(),args);    switch (level)    {    case EMERG:        Emerg(message.c_str());        break;    case FATAL:        Fatal(message.c_str());        break;    case ALERT:        Alert(message.c_str());        break;    case CRIT:        Crit(message.c_str());        break;    case ERROR:        Error(message.c_str());        break;    case WARN:                        //default        Warn(message.c_str());        break;    case NOTICE:        Notice(message.c_str());        break;    case INFO:        Info(message.c_str());        break;    case DEBUG:        Debug(message.c_str());        break;    case NOTSET:                //break;    default:        Warn(message.c_str());        break;    }}void MyLog::SetNDC(const char* ndc){    log4cpp::NDC::push(ndc);}void MyLog::ClearNDC(){    log4cpp::NDC::clear();}void MyLog::LoadConfigure(const char* filename){    if (filename == nullptr)    {        filename = ".\\include\\tests\\log4cpp.property";    }    log4cpp::PropertyConfigurator::configure(filename);    m_pCategory = &log4cpp::Category::getRoot();}MyLog& MyLog::operator<<(PriorityLevel level){    SetPriority(level);    return *this;}MyLog& MyLog::operator<<(const char* msg){    Message(m_prioritylevel, msg);    return *this;}MyLog& MyLog::operator<<(std::string& msg){    Message(m_prioritylevel, msg);    return *this;}MyLog& MyLog::operator>>(AppenderStyle appender){    SetAppender(appender);    return *this;}MyLog& MyLog::operator>>(const char* filename){    SetAppender(m_appenderstyle,filename);    return *this;}std::string MyLog::bin2str( const unsigned char* buf, int nstrlen ){    stringstream ss;    ss.setf(ios::hex | ios::uppercase );    ss.width(2);    ss.fill('0');    for (int i = 0;i < nstrlen ; ++i)    {        ss << hex << (short)buf[i];    }    return ss.str();}

转载于:https://www.cnblogs.com/shenchao/p/3263646.html

相关资源:log4cpp--C 的一个强大的日志管理类(log4j很相似)使用示例
最新回复(0)