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

2024-01-22 02:38

本文主要是介绍视频监控安防平台-基于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 fatalERROR_LEVEL			= 1 << 1,	//output errorBREAK_LEVEL			= 1 << 2,	//output break pointMESSG_LEVEL			= 1 << 3,	//output messageDEBUG_LEVEL			= 1 << 4,	//output debugTRACE_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};//allsnprintf(Catelog, 256, "%s/all/", logcatalog);if (access(Catelog, F_OK) != 0){mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);}//fatalsnprintf(Catelog, 256, "%s/fatal/", logcatalog);if (access(Catelog, F_OK) != 0){mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);}//errorsnprintf(Catelog, 256, "%s/error/", logcatalog);if (access(Catelog, F_OK) != 0){mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);}//breaksnprintf(Catelog, 256, "%s/info/", logcatalog);if (access(Catelog, F_OK) != 0){mkdir(Catelog, S_IRWXU|S_IRWXG|S_IRWXO);}//debugsnprintf(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 msgchar 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();





这篇关于视频监控安防平台-基于log4cplus的log日志封装(linux版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631594

相关文章

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col