日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志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)//獲取日志模塊指針 {// 建立loggerreturn 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

?

轉載于:https://www.cnblogs.com/bclshuai/p/8734109.html

總結

以上是生活随笔為你收集整理的日志log4cxx 封装、实例讲解、配置文件log4cxx.properties的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。