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程序自动创建多级目录这篇文章进行程序补充。

posted @   呵哈呵  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示