对log4cpp进一步封装
//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();
}
对log4cpp进一步封装的更多相关文章
- 进一步封装highchart,打造自己的图表插件:jHighChart.js
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表.支持的图表类型有曲线图.区域图.柱状图.饼状图.散状点图和综合 ...
- 对redis客户端jedis2.8.0的进一步封装
jedis2.8.0的进一步封装: 1.序列化存储对象 2.结合spring,创建redis连接池 3.提供了基础的单个实体操作,有序list操作和一对多关系list的操作,对list提供了分页的封装 ...
- 对boost::shared_from_this的进一步封装
对boost::shared_from_this的进一步封装 熟悉异步编程的同学可能会对boost::shared_from_this有所了解.我们在传入回调的时候,通常会想要其带上当前类对象的上下文 ...
- DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...
- 【Android】19.3 ContentProvider及安卓进一步封装后的相关类
分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF ...
- Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)
package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [iOS基础控件 - 4.4] 进一步封装"APP列表”,初见MVC模式
A.从ViewController分离View 之前的代码中,View的数据加载逻辑放在了总的ViewController中,增加了耦合性,应该对控制器ViewController隐藏数据加载到Vie ...
- QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...
随机推荐
- iScroll4插件的使用实例
iScroll是Matteo Spinelli开发的一个滚动插件,使用原生js编写,其不依赖与任何js框架.iScroll 4 完全重写了iScroll这个框架的原始代码.旨在解决移动webkit系浏 ...
- iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET
iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex
- 发布一个C++版本的ORM库SmartDB
先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...
- .Net线程问题解答
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...
- MYSQL三个默认库的介绍
数据库INFORMATION_SCHEMA:提供了访问数据库元数据的方式. 元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表述该信息的其他术语包括“数据词典”和“系 ...
- SVN — subclipse操作指引
摘自: http://jiangzhengjun.iteye.com/blog/491824 安装插件:请参照http://subclipse.tigris.org/servlets/ProjectP ...
- Nubia Z5S官方4.4 UI2.0音频Audio部分简单分析(也适用于其它8974/8064机型)以及降低破音出现几率的方法
转载请注明出处和网址链接: http://blog.csdn.net/syhost/article/details/31419749 此篇本是在Z5S的官方4.4内測版出来时写的, 主要是看到其在au ...
- (剑指Offer)面试题44:扑克牌的顺子
题目: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的,2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字. 思路: 把5张牌看成一个数组,就看排序 ...
- [笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger
[笔记][Java7并发编程实战手冊]系列文件夹 简单介绍 Exchanger 是一个同步辅助类.用于两个并发线程之间在一个同步点进行数据交换. 同意两个线程在某一个点进行数据交换. 本章exchan ...
- FileAlreadyExistsException: Output directory hdfs://ubuntu:9000/output09 already exists
14/07/21 17:49:59 ERROR security.UserGroupInformation: PriviledgedActionException as:chenlongquan ca ...