视频监控安防平台-基于log4cplus的log日志封装(linux版本)

视频监控安防平台-基于log4cplus的log日志封装(linux版本)

目前使用的的日志相对而言比较稳定,目前应用于多个项目,稳定之后还没有出现过问题,log4cplus源码有所改动可以根据日志目录、保存日志大小、保存天数、保存日志方式。
下面粘贴一下封装log4cplus的源码:
/******************************************************************************
* FILE:	Log.h
* Description:	
*	Trace & Debug Tools Class.
*
* Modified Code History
* Mark	Date		By			Modification Reason
*******************************************************************************
* 01	2007-1-29	songxw	Initial creation.
******************************************************************************/
#ifndef __LOG_H__
#define __LOG_H__

#include <log4cplus/logger.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/configurator.h>
#include <log4cplus/layout.h>
#include <log4cplus/appender.h>
#include <log4cplus/helpers/loglog.h>
#include <stdarg.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "MyThread.h"
#include "IPCS.h"
#include "MyFifo.h"

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

typedef enum
{
	FATAL_LEVEL			= 1 << 0,	//output fatal
	ERROR_LEVEL			= 1 << 1,	//output error
	BREAK_LEVEL			= 1 << 2,	//output break point
	MESSG_LEVEL			= 1 << 3,	//output message
	DEBUG_LEVEL			= 1 << 4,	//output debug
	TRACE_LEVEL			= 1 << 9	//output debug
}LOG_LEVEL_E;

class CLog
{
public:
    CLog();
    virtual ~CLog();	
	
public:
	
	int StartSystem(const char *LogSavePath, const char *LogSaveMode, const int LogSaveDays, const int LogSaveSizes);

    void StopSystem();

	void DoLogProc(LOG_LEVEL_E level, const char* filename, const int fileline, const char* pFormat, ...);

private:
	void CreateCatalog(const char *logcatalog);
	
public:
    static inline CLog* getSingletonPtr()
	{
        return &getSingleton();
    }
    static inline CLog& getSingleton()
    {
        static CLog instance;
        return instance;
    }
	static bool m_bInited;
	FILE *logcfgfp;
};
#define g_Logger CLog::getSingleton()
#define g_pLogger CLog::getSingletonPtr()
#define LOG_START(LogSavePath, LogSaveMode, LogSaveDays, LogSaveSizes) \
		g_Logger.StartSystem(LogSavePath, LogSaveMode, LogSaveDays, LogSaveSizes)
#define LOG_STOP() g_Logger.StopSystem()

/* Trace & Debug output function */
#define DBGPrint(module, level, string, args...) \
		g_Logger.DoLogProc(level, __FILE__, __LINE__, string, ##args)


#define DO_LOGGER(logLevel, filename, fileline, pFormat, bufSize)     \
        do                                                            \
        {                                                             \
            if (g_Logger.m_bInited==true)                                      \
            {                                                         \
                log4cplus::Logger _logger = log4cplus::Logger::getRoot(); \
                if(_logger.isEnabledFor(logLevel))                    \
                {                                                     \
                va_list args;                                         \
                va_start(args, pFormat);                              \
                char buf[bufSize] = {0};                              \
                vsnprintf(buf, sizeof(buf), pFormat, args);           \
                va_end(args);                                         \
                _logger.forcedLog(logLevel, buf, filename, fileline); \
                }                                                     \
            }                                                         \
        }while(0)
			
#endif	




源码log.cpp

   
   
/******************************************************************************
* FILE:	Log.cpp
* Description:	
*	Implementation of the Log class.
*
* Modified Code History
* Mark	Date		By			Modification Reason
*******************************************************************************
* 01	2007-1-29	songxw	Initial creation.
******************************************************************************/
#include "Log.h"

//logger						
#define LOG4PLUS_LOG_CFG_LOGGER "log4cplus.rootLogger=TRACE, ConsoleAll, ConsoleMsg, AllLog, InfoLog, DebugLog, ErrorLog, FatalLog\r\n"

//debug to fatal level
#define LOG4PLUS_CONSOLE_ALL    "log4cplus.appender.ConsoleAll=log4cplus::ConsoleAppender\r\n" \
								"log4cplus.appender.ConsoleAll.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.ConsoleAll.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.ConsoleAll.filters.1=log4cplus::spi::LogLevelRangeFilter\r\n" \
								"log4cplus.appender.ConsoleAll.filters.1.LogLevelMin=DEBUG\r\n" \
								"log4cplus.appender.ConsoleAll.filters.1.LogLevelMax=FATAL\r\n" 

//trace level
#define LOG4PLUS_CONSOLE_TRACE  "log4cplus.appender.ConsoleMsg=log4cplus::ConsoleAppender\r\n" \
								"log4cplus.appender.ConsoleMsg.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.ConsoleMsg.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.ConsoleMsg.filters.1=log4cplus::spi::LogLevelMatchFilter\r\n" \
								"log4cplus.appender.ConsoleMsg.filters.1.LogLevelToMatch=TRACE\r\n" \
								"log4cplus.appender.ConsoleMsg.filters.1.AcceptOnMatch=true\r\n" \
								"log4cplus.appender.ConsoleMsg.filters.2=log4cplus::spi::DenyAllFilter\r\n" 

//file log all						 
#define LOG4PLUS_LOG_CFG_ALL    "log4cplus.appender.AllLog=log4cplus::DailyRollingFileAppender\r\n" \
								"log4cplus.appender.AllLog.MaxFileSize=%dKB\r\n" \
								"log4cplus.appender.AllLog.File=%s/all/all.log\r\n" \
								"log4cplus.appender.AllLog.Schedule=%s\r\n" \
								"log4cplus.appender.AllLog.ImmediateFlush=true\r\n" \
								"log4cplus.appender.AllLog.MaxBackupIndex=10\r\n" \
								"log4cplus.appender.AllLog.MaxSaveDays=%d\r\n" \
								"log4cplus.appender.AllLog.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.AllLog.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.AllLog.filters.1=log4cplus::spi::LogLevelRangeFilter\r\n" \
								"log4cplus.appender.AllLog.filters.1.LogLevelMin=TRACE\r\n" \
								"log4cplus.appender.AllLog.filters.1.LogLevelMax=FATAL\r\n" 
								
//file log for info						
#define LOG4PLUS_LOG_CFG_INFO   "log4cplus.appender.InfoLog=log4cplus::DailyRollingFileAppender\r\n" \
								"log4cplus.appender.InfoLog.MaxFileSize=%dKB\r\n" \
								"log4cplus.appender.InfoLog.File=%s/info/info.log\r\n" \
								"log4cplus.appender.InfoLog.Schedule=%s\r\n" \
								"log4cplus.appender.InfoLog.ImmediateFlush=true\r\n" \
								"log4cplus.appender.InfoLog.MaxBackupIndex=10\r\n" \
								"log4cplus.appender.InfoLog.MaxSaveDays=%d\r\n" \
								"log4cplus.appender.InfoLog.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.InfoLog.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.InfoLog.filters.1=log4cplus::spi::LogLevelMatchFilter\r\n" \
								"log4cplus.appender.InfoLog.filters.1.LogLevelToMatch=INFO\r\n" \
								"log4cplus.appender.InfoLog.filters.1.AcceptOnMatch=true\r\n" \
								"log4cplus.appender.InfoLog.filters.2=log4cplus::spi::DenyAllFilter\r\n" 

#define LOG4PLUS_LOG_CFG_DEBUG  "log4cplus.appender.DebugLog=log4cplus::DailyRollingFileAppender\r\n" \
								"log4cplus.appender.DebugLog.MaxFileSize=%dKB\r\n" \
								"log4cplus.appender.DebugLog.File=%s/debug/debug.log\r\n" \
								"log4cplus.appender.DebugLog.Schedule=%s\r\n" \
								"log4cplus.appender.DebugLog.ImmediateFlush=true\r\n" \
								"log4cplus.appender.DebugLog.MaxBackupIndex=10\r\n" \
								"log4cplus.appender.DebugLog.MaxSaveDays=%d\r\n" \
								"log4cplus.appender.DebugLog.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.DebugLog.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.DebugLog.filters.1=log4cplus::spi::LogLevelMatchFilter\r\n" \
								"log4cplus.appender.DebugLog.filters.1.LogLevelToMatch=DEBUG\r\n" \
								"log4cplus.appender.DebugLog.filters.1.AcceptOnMatch=true\r\n" \
								"log4cplus.appender.DebugLog.filters.2=log4cplus::spi::DenyAllFilter\r\n" 

#define LOG4PLUS_LOG_CFG_ERROR  "log4cplus.appender.ErrorLog=log4cplus::DailyRollingFileAppender\r\n" \
								"log4cplus.appender.ErrorLog.MaxFileSize=%dKB\r\n" \
								"log4cplus.appender.ErrorLog.File=%s/error/error.log\r\n" \
								"log4cplus.appender.ErrorLog.Schedule=%s\r\n" \
								"log4cplus.appender.ErrorLog.ImmediateFlush=true\r\n" \
								"log4cplus.appender.ErrorLog.MaxBackupIndex=10\r\n" \
								"log4cplus.appender.ErrorLog.MaxSaveDays=%d\r\n" \
								"log4cplus.appender.ErrorLog.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.ErrorLog.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.ErrorLog.filters.1=log4cplus::spi::LogLevelMatchFilter\r\n" \
								"log4cplus.appender.ErrorLog.filters.1.LogLevelToMatch=ERROR\r\n" \
								"log4cplus.appender.ErrorLog.filters.1.AcceptOnMatch=true\r\n" \
								"log4cplus.appender.ErrorLog.filters.2=log4cplus::spi::DenyAllFilter\r\n"

#define LOG4PLUS_LOG_CFG_FATAL 	"log4cplus.appender.FatalLog=log4cplus::DailyRollingFileAppender\r\n" \
								"log4cplus.appender.FatalLog.MaxFileSize=%dKB\r\n" \
								"log4cplus.appender.FatalLog.File=%s/fatal/fatal.log\r\n" \
								"log4cplus.appender.FatalLog.Schedule=%s\r\n" \
								"log4cplus.appender.FatalLog.ImmediateFlush=true\r\n" \
								"log4cplus.appender.FatalLog.MaxBackupIndex=10\r\n" \
								"log4cplus.appender.FatalLog.MaxSaveDays=%d\r\n" \
								"log4cplus.appender.FatalLog.layout=log4cplus::PatternLayout\r\n" \
								"log4cplus.appender.FatalLog.layout.ConversionPattern=%s\r\n" \
								"log4cplus.appender.FatalLog.filters.1=log4cplus::spi::LogLevelMatchFilter\r\n" \
								"log4cplus.appender.FatalLog.filters.1.LogLevelToMatch=FATAL\r\n" \
								"log4cplus.appender.FatalLog.filters.1.AcceptOnMatch=true\r\n" \
								"log4cplus.appender.FatalLog.filters.2=log4cplus::spi::DenyAllFilter\r\n"

//message pattern
#define CONSOLE_TRACE_PATTERN "%m%n"
//all console pattern
#define CONSOLE_PATTERN "%D.%d{%q} <%-5p> at %l%n%m%n%n"


//file log pattern
#define SAVELOG_PATTERN "%D.%d{%q} <%-5p> at %l thread<%t>%n%m%n%n"

CLog::CLog()
{
    m_bInited = false;
}

CLog::~CLog()
{

}

bool CLog::m_bInited = false;
void CLog::DoLogProc(LOG_LEVEL_E level, const char* filename, const int fileline, const char* pFormat, ...)
{
	switch (level)
	{
	case FATAL_LEVEL:
		DO_LOGGER(log4cplus::FATAL_LOG_LEVEL, filename, fileline, pFormat, 10240);
		break;
		
	case ERROR_LEVEL:
		DO_LOGGER(log4cplus::ERROR_LOG_LEVEL, filename, fileline, pFormat, 10240);
		break;
		
	case BREAK_LEVEL:
		DO_LOGGER(log4cplus::INFO_LOG_LEVEL, filename, fileline, pFormat, 10240);
		break;
		
	case MESSG_LEVEL:
	case DEBUG_LEVEL:
		DO_LOGGER(log4cplus::DEBUG_LOG_LEVEL, filename, fileline, pFormat, 10240);
		break;

	case TRACE_LEVEL:
		DO_LOGGER(log4cplus::TRACE_LOG_LEVEL, filename, fileline, pFormat, 10240);
		break;
		
	default:
		return;	
	}
	return;
}

void CLog::CreateCatalog(const char *logcatalog)
{
    char cmd[256] = {0};
    if (access(logcatalog, F_OK) != 0)
    {
        sprintf(cmd, "mkdir -p %s", logcatalog);
		int r = system(cmd);
		if (r != 0)
		{
		    printf("CreateCatalog system cmd:%s ret:%d fail!\n\n", cmd, r);
		}
    }
	char Catelog[256] = {0};
	//all
	snprintf(Catelog, 256, "%s/all/", logcatalog);
    if (access(Catelog, F_OK) != 0)
    {
        mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);
    }
	//fatal
	snprintf(Catelog, 256, "%s/fatal/", logcatalog);
    if (access(Catelog, F_OK) != 0)
    {
        mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);
    }
	//error
	snprintf(Catelog, 256, "%s/error/", logcatalog);
    if (access(Catelog, F_OK) != 0)
    {
        mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);
    }

	//break
	snprintf(Catelog, 256, "%s/info/", logcatalog);
    if (access(Catelog, F_OK) != 0)
    {
        mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);
    }

	//debug
	snprintf(Catelog, 256, "%s/debug/", logcatalog);
    if (access(Catelog, F_OK) != 0)
    {
        mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);
    }

	return;
}

int CLog::StartSystem(const char *LogSavePath, const char *LogSaveMode, const int LogSaveDays, const int LogSaveSizes)
{
	CreateCatalog(LogSavePath);

	char LogCfgConsoleAll[2048] = {0};
	snprintf(LogCfgConsoleAll, 2048, LOG4PLUS_CONSOLE_ALL, CONSOLE_PATTERN);

	char LogCfgConsoleMsg[2048] = {0};
	snprintf(LogCfgConsoleMsg, 2048, LOG4PLUS_CONSOLE_TRACE, CONSOLE_TRACE_PATTERN);

	//console all and msg
	char LogCfgConsole[4096] = {0};
	snprintf(LogCfgConsole, 4096, "%s%s", LogCfgConsoleAll, LogCfgConsoleMsg);

	char LogCfgAll[2048] = {0};
	snprintf(LogCfgAll, 2048, LOG4PLUS_LOG_CFG_ALL, LogSaveSizes, LogSavePath, LogSaveMode, LogSaveDays, SAVELOG_PATTERN);
	
	char LogCfgInfo[2048] = {0};
	snprintf(LogCfgInfo, 2048, LOG4PLUS_LOG_CFG_INFO, LogSaveSizes, LogSavePath, LogSaveMode, LogSaveDays, SAVELOG_PATTERN);

	char LogCfgDebug[2048] = {0};
	snprintf(LogCfgDebug, 2048, LOG4PLUS_LOG_CFG_DEBUG, LogSaveSizes, LogSavePath, LogSaveMode, LogSaveDays, SAVELOG_PATTERN);

	char LogCfgError[2048] = {0};
	snprintf(LogCfgError, 2048, LOG4PLUS_LOG_CFG_ERROR, LogSaveSizes, LogSavePath, LogSaveMode, LogSaveDays, SAVELOG_PATTERN);

	char LogCfgFatal[2048] = {0};
	snprintf(LogCfgFatal, 2048, LOG4PLUS_LOG_CFG_FATAL, LogSaveSizes, LogSavePath, LogSaveMode, LogSaveDays, SAVELOG_PATTERN);

	char Log4LogCfg[8192] = {0};
	snprintf(Log4LogCfg, 8192, "%s%s%s%s%s%s%s", LOG4PLUS_LOG_CFG_LOGGER, LogCfgConsole, LogCfgAll, LogCfgInfo, LogCfgDebug, LogCfgError, LogCfgFatal);

	if (strlen(Log4LogCfg) <= 0)
	{
		printf("Get Log4plus log config failed!\n");
		return -1;
	}
	
    log4cplus::PropertyConfigurator::doConfigure(Log4LogCfg);
    log4cplus::Logger _logger = log4cplus::Logger::getRoot();
    
    m_bInited = true;
    return 0;
}

void CLog::StopSystem()
{
    m_bInited = false;
}






  
  
使用方法:
 
  	//start log 
	if (-1 == LOG_START("./log", "DAILY",30,20000))
	{
		printf("Log4plus start failed!\n");
		return -1;
	}
	DBGPrint(M_None, BREAK_LEVEL, "Main Process Start!");

	LOG_STOP();





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值