log4cpp简单程序使用
logoperator.h
#ifndef LOGOPERATOR_H
#define LOGOPERATOR_H
#include <iostream>
#include <sys/time.h>
#include <stdint.h>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include "config.h"
#define LOGMAINDIR "/home/i/log"
#define DEBUGLOGFILE_ALL(x) LOGMAINDIR "/debug/all/" x
#define INFOLOGFILE_ALL(x) LOGMAINDIR "/info/all/" x
#define WARNINGLOGFILE_ALL(x) LOGMAINDIR "/warning/all/" x
#define ERRORLOGFILE_ALL(x) LOGMAINDIR "/error/all/" x
#define DEBUGLOGFILE_ONLY(x) LOGMAINDIR "/debug/only/" x
#define INFOLOGFILE_ONLY(x) LOGMAINDIR "/info/only/" x
#define WARNINGLOGFILE_ONLY(x) LOGMAINDIR "/warning/only/" x
#define ERRORLOGFILE_ONLY(x) LOGMAINDIR "/error/only/" x
class LogOperator
{
public:
LogOperator();
~LogOperator();
void debug(char* format, ...); // 调试信息输出
void info(char* format, ...); // 用于记录一些日常数据
void warning(char* format, ...); // 程序正常执行,但是出现异常状态,但是整体程序依旧可以继续向下执行
void error(char* format, ...); // 程序运行出错,直接中途返回
private:
char logName[32];
};
extern LogOperator log;
#define DEBUG(FORMAT, ...) log.debug("%s - %d: " FORMAT, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define INFO(FORMAT, ...) log.info("%s - %d: " FORMAT, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define WARNING(FORMAT, ...) log.warning("%s - %d: " FORMAT, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define ERROR(FORMAT, ...) log.error("%s - %d: " FORMAT, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#endif // LOGOPERATOR_H
logoperator.cpp
#include "logoperator.h"
#include "config.h"
LogOperator log;
/**
* @brief LogOperator::LogOperator
* 一共分为4个日子等级,debug, info, warning, error
* 每个日志等级分为两种,一种是包含比他等级高的日志,一种是仅仅包含他本身等级的日志
*/
LogOperator::LogOperator()
{
//************************************************ all ***************************************************
// debug
log4cpp::PatternLayout* debugLayout_all = new log4cpp::PatternLayout();
debugLayout_all->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* debugAppender_all = new log4cpp::RollingFileAppender("debugAppender_all", DEBUGLOGFILE_ALL("debug.log"), 10*1024*1024, 3, true);
debugAppender_all->setLayout(debugLayout_all);
log4cpp::Category& debugLog_all = log4cpp::Category::getInstance("debug_all");
debugLog_all.setAdditivity(false);
debugLog_all.setPriority(log4cpp::Priority::DEBUG);
debugLog_all.setAppender(debugAppender_all);
// debug.info
log4cpp::PatternLayout* infoLayout_all = new log4cpp::PatternLayout();
infoLayout_all->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* infoAppender_all = new log4cpp::RollingFileAppender("infoAppender_all", INFOLOGFILE_ALL("info.log"), 10*1024*1024, 3, true);
infoAppender_all->setLayout(infoLayout_all);
log4cpp::Category& infoLog_all = log4cpp::Category::getInstance("debug_all.info_all");
infoLog_all.setAdditivity(true);
infoLog_all.setPriority(log4cpp::Priority::INFO);
infoLog_all.setAppender(infoAppender_all);
// debug.info.warning
log4cpp::PatternLayout* warningLayout_all = new log4cpp::PatternLayout();
warningLayout_all->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* warningAppender_all = new log4cpp::RollingFileAppender("warningAppender_all", WARNINGLOGFILE_ALL("warning.log"), 10*1024*1024, 3, true);
warningAppender_all->setLayout(warningLayout_all);
log4cpp::Category& warningLog_all = log4cpp::Category::getInstance("debug_all.info_all.warning_all");
warningLog_all.setAdditivity(true);
warningLog_all.setPriority(log4cpp::Priority::WARN);
warningLog_all.setAppender(warningAppender_all);
// debug.info.warning.error
log4cpp::PatternLayout* errorLayout_all = new log4cpp::PatternLayout();
errorLayout_all->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* errorAppender_all = new log4cpp::RollingFileAppender("errorAppender_all", ERRORLOGFILE_ALL("error.log"), 10*1024*1024, 3, true);
errorAppender_all->setLayout(errorLayout_all);
log4cpp::Category& errorLog_all = log4cpp::Category::getInstance("debug_all.info_all.warning_all.error_all");
errorLog_all.setAdditivity(true);
errorLog_all.setPriority(log4cpp::Priority::WARN);
errorLog_all.setAppender(errorAppender_all);
//************************************************ only ***************************************************// debug
log4cpp::PatternLayout* debugLayout_only = new log4cpp::PatternLayout();
debugLayout_only->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* debugAppender_only = new log4cpp::RollingFileAppender("debugAppender_only", DEBUGLOGFILE_ONLY("debug.log"), 10*1024*1024, 3, true);
debugAppender_only->setLayout(debugLayout_only);
log4cpp::Category& debugLog_only = log4cpp::Category::getInstance("debug_only");
debugLog_only.setAdditivity(false);
debugLog_only.setPriority(log4cpp::Priority::DEBUG);
debugLog_only.setAppender(debugAppender_only);
// info
log4cpp::PatternLayout* infoLayout_only = new log4cpp::PatternLayout();
infoLayout_only->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* infoAppender_only = new log4cpp::RollingFileAppender("infoAppender_only", INFOLOGFILE_ONLY("info.log"), 10*1024*1024, 3, true);
infoAppender_only->setLayout(infoLayout_only);
log4cpp::Category& infoLog_only = log4cpp::Category::getInstance("info_only");
infoLog_only.setAdditivity(false);
infoLog_only.setPriority(log4cpp::Priority::INFO);
infoLog_only.setAppender(infoAppender_only);
// warning
log4cpp::PatternLayout* warningLayout_only = new log4cpp::PatternLayout();
warningLayout_only->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* warningAppender_only = new log4cpp::RollingFileAppender("warningAppender_only", WARNINGLOGFILE_ONLY("warning.log"), 10*1024*1024, 3, true);
warningAppender_only->setLayout(warningLayout_only);
log4cpp::Category& warningLog_only = log4cpp::Category::getInstance("warning_only");
warningLog_only.setAdditivity(false);
warningLog_only.setPriority(log4cpp::Priority::WARN);
warningLog_only.setAppender(warningAppender_only);
// error
log4cpp::PatternLayout* errorLayout_only = new log4cpp::PatternLayout();
errorLayout_only->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::RollingFileAppender* errorAppender_only = new log4cpp::RollingFileAppender("errorAppender_only", ERRORLOGFILE_ONLY("error.log"), 10*1024*1024, 3, true);
errorAppender_only->setLayout(errorLayout_only);
log4cpp::Category& errorLog_only = log4cpp::Category::getInstance("error_only");
errorLog_only.setAdditivity(false);
errorLog_only.setPriority(log4cpp::Priority::ERROR);
errorLog_only.setAppender(errorAppender_only);
}
void LogOperator::debug(char* format, ...)
{
va_list list;
va_start(list, format);
log4cpp::Category& debugLog_only = log4cpp::Category::getInstance("debug_only");
debugLog_only.logva(log4cpp::Priority::DEBUG, format, list);
log4cpp::Category& debugLog_all = log4cpp::Category::getInstance("debug_all");
debugLog_all.logva(log4cpp::Priority::DEBUG, format, list);
va_end(list);
}
void LogOperator::info(char* format, ...)
{
va_list list;
va_start(list, format);
log4cpp::Category& info_only = log4cpp::Category::getInstance("info_only");
info_only.log(log4cpp::Priority::INFO, format, list);
log4cpp::Category& info_all = log4cpp::Category::getInstance("debug_all.info_all");
info_all.logva(log4cpp::Priority::INFO, format, list);
va_end(list);
}
void LogOperator::warning(char* format, ...)
{
va_list list;
va_start(list, format);
log4cpp::Category& warning_only = log4cpp::Category::getInstance("warning_only");
warning_only.logva(log4cpp::Priority::WARN, format, list);
log4cpp::Category& warning_all = log4cpp::Category::getInstance("debug_all.info_all.warning_all");
warning_all.logva(log4cpp::Priority::WARN, format, list);
va_end(list);
}
void LogOperator::error(char* format, ...)
{
va_list list;
va_start(list, format);
log4cpp::Category& error_only = log4cpp::Category::getInstance("error_only");
error_only.logva(log4cpp::Priority::ERROR, format, list);
log4cpp::Category& error_all = log4cpp::Category::getInstance("debug_all.info_all.warning_all.error_all");
error_all.logva(log4cpp::Priority::ERROR, format, list);
va_end(list);
}
LogOperator::~LogOperator()
{
log4cpp::Category::shutdown();
}
main
#include "logoperator.h"
int main()
{
DEBUG("%s", test);
INFO("%s", test);
WARNING("%s", test);
ERROR("%s", test);
}
注意事项
在生成log文件的时候需要保证对应的目录存在,这里可以参考linux下c程序自动创建多级目录这篇文章进行程序补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话