• 日志log4cxx 封装、实例讲解、配置文件log4cxx.properties


    日志log4cxx 封装、实例讲解、配置文件log4cxx.properties

    1. 日志作用

    程序运行过程中,需要记录程序中的运行状况,方便排查问题,记录数据。可以根据日志的记录快速定位错误发生的地方,然后修改代码。还可以设置日志级别,只显示严重级别的日志,避免产生大量的日志。

    2. Log4cxx的使用步骤

    (1)    从apache官网下载log4cxx的源代码进行编译生成log4cxx.dll和log4cxx.lib文件,或者直接从网上下载人家已经编译好的文件,将这两个文件和头文件夹log4cxx复制到工程中。进行头文件和库文件的设置包含。

    (2)    Logcxx.properties 配置文件设置

    这个文件的作用是来设置日志文件输出的模块,日志文件输出的等级level,日志输出的做大文件大小,模块的等级限制。Logcxx.properties文件内容如下:

    # 设置root logger为TRACE级别,使用了fa两个Appender

    log4j.rootLogger=TRACE, fa

    #对Appender fa进行设置:

    # 这是一个文件类型的Appender,

    # 其输出文件(File)为./output.log,

    # 输出方式(Append)为覆盖方式,

    # 输出格式(layout)为PatternLayout

    log4j.appender.fa=org.apache.log4j.FileAppender

    log4j.appender.fa.File=./output.log

    log4j.appender.fa.Append=true

    log4j.appender.fa.layout=org.apache.log4j.PatternLayout

    log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

    关于配置文件的详细介绍参考:

    https://www.cnblogs.com/lowerCaseK/p/Log_properties.html

    (3)log头文件定义

    #ifndef ___LOG_DEFINE___
    #define ___LOG_DEFINE___

    #include <log4cxx/logger.h>
    #include <log4cxx/logstring.h>
    #include <log4cxx/propertyconfigurator.h>
    #include<string>
    #include <stdio.h>
    #include <stdlib.h>

    using namespace log4cxx;
    using namespace log4cxx::helpers;
    #include <stdarg.h>
    using namespace std;
    #define SAFE_DELETE_ARRAY(v_para)
    do
    {
    if (NULL != v_para) {
    delete[] v_para;
    v_para = NULL;
    }
    } while (0)
    //TRACE < DEBUG < INFO < WARN < ERROR < FATAL
    typedef enum _LOG_LEVEL
    {
    LOG_TRACE_ = 0,
    LOG_DEBUG_,
    LOG_INFO_,
    LOG_WARN_,
    LOG_ERROR_,
    LOG_FATAL_
    }LOG_LEVEL;

    #ifndef IN
    #define IN
    #endif

    #ifndef OUT
    #define OUT
    #endif
    /*
    写日志函数
    IN const char* module,//在log4cxx.properties文件中设置了很多个append,这个参数用来设置模块,例如本实例中的fa
    IN const LOG_LEVEL level,日志级别 ERROR、INFO等
    IN const char* file,打印日志函数调用的文件
    IN const char* function, 打印日志的函数
    IN const int line, 打印日志的行号
    IN const char* format,//打印日志的格式 如: "%s%d%f"
    ... //可变参数输入
    */

    void log4cxx_package(IN const char* module,IN const LOG_LEVEL level, IN const char* file, IN const char* function,
    IN const int line, IN const char* format, ...);//
    //宏定义封装,__FILE__, __FUNCTION__, __LINE__ 分别是打印日志的文件名、函数名,行号
    #define LOG(module,level, format,...) log4cxx_package(module,level, __FILE__, __FUNCTION__, __LINE__, format,__VA_ARGS__)
    //按照不同的级别定义宏
    #define FIRE_ERROR(format,...) LOG("fa",LOG_ERROR_, format,__VA_ARGS__)
    #define FIRE_INFO(format,...) LOG("fa",LOG_INFO_, format,__VA_ARGS__)
    #define FIRE_TRACE(format,...) LOG("fa",LOG_TRACE_, format,__VA_ARGS__)
    #define FIRE_DEBUG(format,...) LOG("fa",LOG_DEBUG_, format,__VA_ARGS__)
    #define FIRE_WARN(format,...) LOG("fa",LOG_WARN_, format,__VA_ARGS__)
    #define FIRE_FATAL(format,...) LOG("fa",LOG_FATAL_, format,__VA_ARGS__) //
    //初始化日志库,传入logcxx.properties文件的名称
    void log4cxx_init(IN const char* conffile);
    //根据append或者模块名称来获取模块的日志指针。如果是root模块,直接用Logger::getRootLogger();获取
    LoggerPtr get_logger_ptr(IN const char* user);

    #endif

     (4)日志封装源文件实现

    #include "log.h"
    
    
    
    static std::string ensure_log_complete(IN const char* format,IN va_list args)
    {
        if (NULL == format)
        {
            return "";
        }
    
        int iNum = 0;
        unsigned int uiSize = 1024;
        string strLog("");
    
        char *pcBuff = new(std::nothrow) char[uiSize];
        if (NULL == pcBuff)
        {
            return strLog;
        }
        
        while(true)
        {
            memset(pcBuff, 0,uiSize);
    
            iNum = vsnprintf(pcBuff, uiSize, format, args);
            if ((iNum > -1) && (iNum < (int)uiSize))
            {
                strLog = pcBuff;
                SAFE_DELETE_ARRAY(pcBuff);
    
                return strLog;
            }
    
            //如果字符串值比默认分配大,则分配更大空间
            uiSize = (iNum > -1)?(int)(iNum + 1):(uiSize * 2);
            SAFE_DELETE_ARRAY(pcBuff);
    
            pcBuff = new(std::nothrow) char[uiSize];
            if (NULL == pcBuff)
            {
                return strLog;
            }
        }
    
        SAFE_DELETE_ARRAY(pcBuff);
    
        return strLog;
    }

    /*
    写日志函数
    IN const char* module,//在log4cxx.properties文件中设置了很多个append,这个参数用来设置模块,例如本实例中的fa
    IN const LOG_LEVEL level,日志级别 ERROR、INFO等
    IN const char* file,打印日志函数调用的文件
    IN const char* function, 打印日志的函数
    IN const int line, 打印日志的行号
    IN const char* format,//打印日志的格式 如: "%s%d%f"
    ... //可变参数输入
    */

    void log4cxx_package(IN const char* module,IN const LOG_LEVEL level, IN const char* file, IN const char* function, 

                         IN const int line, IN const char* format, ...)
    {
        if (level > LOG_FATAL_ || level < LOG_TRACE_)
        {
            return;
        }
    
        if (NULL == file || NULL == function || NULL == format)
        {
            return;
        }
        LoggerPtr pLogger=NULL;
        if (module!=NULL)
        {
            pLogger=get_logger_ptr(module);
        }
        if(pLogger==NULL)
        {
             pLogger= Logger::getRootLogger();
        }
        
        char acTmp[30] = { 0 };
        sprintf(acTmp,"%d",line);
    
        va_list args;
        std::string strLog;
        strLog = "[" + std::string(file) + ":" + std::string(function) + "(" + std::string(acTmp) + ")] ";
    
        va_start(args, format);
        strLog += ensure_log_complete(format, args);
        va_end(args);
    
        
        switch (level)
        {
        case LOG_TRACE_:
            LOG4CXX_TRACE(pLogger, strLog.c_str());
            break;
        case LOG_DEBUG_:
            LOG4CXX_DEBUG(pLogger, strLog.c_str());
            break;
        case LOG_INFO_:
            LOG4CXX_INFO(pLogger, strLog.c_str());
            break;
        case LOG_WARN_:
            LOG4CXX_WARN(pLogger, strLog.c_str());
            break;
        case LOG_ERROR_:
            
            LOG4CXX_ERROR(pLogger, strLog.c_str());
            break;
        case LOG_FATAL_:
            LOG4CXX_FATAL(pLogger, strLog.c_str());
            break;
        default:
            break;
        }
    
        return;
    }
    
    void log4cxx_init(IN const char* conffile)//初始化日志库
    {
        // 读取配置文件
        using namespace log4cxx;
        PropertyConfigurator::configure(File(conffile));
        return ;
    }
    
    LoggerPtr get_logger_ptr(IN const char* user)//获取日志模块指针
    {
        // 建立logger
        return Logger::getLogger(user);
    }

    (5)程序使用示例

    log4cxx_init("log4cxx.properties");//初始化日志库
    //调用宏定义实现不同级别的日志输出
    FIRE_ERROR("fjqfqfquhfwuhuquw%d%s",12345,"erqeqr"); FIRE_INFO("fjqfqfquhfwuhuquw%d%s",12345,"erqeqr"); FIRE_WARN("fjqfqfquhfwuhuquw%d%s",12345,"erqeqr"); FIRE_FATAL("fjqfqfquhfwuhuquw%d%s",12345,"erqeqr");

    (6)程序启动后,会生成一个文件名为output.log的日志文件,在日志文件中会打印日志日下

    2018-04-07 17:27:21,805 [0x00001f68] ERROR fa - [StockViewDlg.cpp:CStockViewDlg::OnInitDialog(108)] fjqfqfquhfwuhuquw12345erqeqr
    2018-04-07 17:27:21,805 [0x00001f68] INFO fa - [StockViewDlg.cpp:CStockViewDlg::OnInitDialog(109)] fjqfqfquhfwuhuquw12345erqeqr
    2018-04-07 17:27:21,805 [0x00001f68] WARN fa - [StockViewDlg.cpp:CStockViewDlg::OnInitDialog(110)] fjqfqfquhfwuhuquw12345erqeqr
    2018-04-07 17:27:21,805 [0x00001f68] FATAL fa - [StockViewDlg.cpp:CStockViewDlg::OnInitDialog(111)] fjqfqfquhfwuhuquw12345erqeqr

    自己编了一个股票监控软件,有如下功能,有兴趣的朋友可以下载;

    (1)   个股监测。监测个股实时变化,可以监测个股大单交易、急速拉升和下降、主力入场和出场、股票最高点和最低点提醒。检测到最高点、最低点、主力进场点、主力退场点、急速拉升点、急速下跌点,给出语音或者声音提醒,不用再时刻看着大盘了,给你更多自由的时间;

    (2)   大盘监测。监测大盘的走势,采用上证、深证、创业三大指数的综合指数作为大盘走势。并实时监测大盘的最高点和最低点、中间的转折点。

    (3)   股票推荐。还能根据历史数据长期或短期走势进行分析,对股市3千多个股票进行分析对比,选出涨势良好的股票,按照增长速度从大到小排序,推荐给你涨势良好的股票;

    下载地址:

    1.0.3版本(修复大盘指数崩溃缺陷)下载地址:

    链接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取码:003h

    更新链接:

    https://www.cnblogs.com/bclshuai/p/10621613.html

  • 相关阅读:
    Kubernetes
    Kubernetes
    Kubernetes
    Kubernetes
    Kubernetes
    代价函数——二次代价函数、交叉熵(cross-entropy)、对数似然(log-likelihood cost)(04-1)
    MNIST手写数字分类simple版(03-2)
    tensorflow非线性回归(03-1)
    python三目运算符
    tensorflow版helloworld---拟合线性函数的k和b(02-4)
  • 原文地址:https://www.cnblogs.com/bclshuai/p/8734109.html
Copyright © 2020-2023  润新知