日志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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

td不允许自己扩展_V神原文详解:通过及时性检测器(TD)解决区块链的51%攻击问题...

注&#xff1a;原文作者是以太坊联合创始人Vitalik Buterin&#xff0c;在这篇文章中&#xff0c;他提出了一种称为及时性检测器(TD)的构造&#xff0c;以试图解决区块链51%攻击的问题。(图&#xff1a;Vitalik Buterin)以下为译文&#xff1a;摘要我提出了一种基于Lamport 99%…

Hadoop安装之JDK在Centos虚拟机中安装

安装jdk.bin和jdk.tar.gz打的办法 安装jdk.bin 安装好的VM Centos7的虚拟机&#xff0c; 1、查看是否是64位操作系统&#xff1a; cat /proc/cpuinfo | grep flags | grep lm | wc -l 如果结果>0 则是64位操作系统 2、JDK 中 jdk-6u41-linux-x64.bin 和 jdk-6u41-linux-x64…

Exp3 免杀原理与实践

---恢复内容开始--- 一&#xff0c;实验内容 利用多种工具实现实现恶意代码免杀在另一台电脑上&#xff0c;杀软开启的情况下&#xff0c;实现运行后门程序并回连成功二&#xff0c;实验步骤 &#xff08;1&#xff09;使用msf编码器生成的后门程序 这里可以直接用上次实验生成…

如何进入指定文件目录_Python如何遍历操作指定文件目录下的全部Excel文件?

Python Tablib是麻省理工学院授权的与格式无关的表格数据集库。支持导入、导出和操作表格数据集&#xff0c;轻松的将数据导出为各种不同的格式&#xff0c;包括excel&#xff0c;json&#xff0c;html&#xff0c;yaml&#xff0c;csv&#xff0c;tsv等格式。接下来&#xff0…

《雪吁》

凛冽隆冬风骨寒&#xff0c;层云避日雾无边&#xff1b; 渐絮残花萧萧夜&#xff0c;窗前瘦花犹遮帘。 转载于:https://www.cnblogs.com/morron/p/8749430.html

条形图坐标轴_解密咨询报告中常见的双层条形图的制作方法

为了增加PPT的设计灵感&#xff0c;我除了经常逛一些设计社区之外&#xff0c;也会收集的各个公司咨询报告来学习。昨天我看了4份数据报告&#xff0c;发现这4份数据报告中都出现了一个共同的图表类型。第1个图表自于IXDC发布的《2018年中国用户体验行业调查报告》&#xff0c;…

小写转 大写

//转换大写 private string Change(double Digital) { //将小写金额转换成大写金额 String[] MyScale { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟"…

赋值给集合_ArrayList集合源码

ArrayList简介ArrayList 是 Java 集合框架中比较常用的数据结构了。ArrayList是可以动态增长和缩减的索引序列&#xff0c;内部封装了一个动态再分配的Object[]数组这里我们可以看到ArrayList继承抽象类AbstractList&#xff0c;实现了 List 接口&#xff0c;同时还实现了 Rand…

Android VideoView无法播放网络视频

今天学习Android播放视频和音频&#xff0c;其中在练习播放视频的时候无法播放网络视频&#xff0c;网络视频是别人发布在网上的&#xff0c;但是把视频放在本地是可以的&#xff0c;最后推测是没有开放网络的访问权限的问题&#xff0c;果然开放了之后就能正常访问视频了 btnM…

大一计算机论文_大一计算机论文发表.doc

第 PAGE 页码 页码 页 / 总共 NUMPAGES 总页数 总页数 页大一计算机论文发表导读&#xff1a;我根据大家的需要整理了一份关于《大一计算机论文发表》的内容&#xff0c;具体内容&#xff1a;如今&#xff0c;我国的现代产业结构已经发生了重大的变化&#xff0c;信息产业地位正…

hdoj-3342-Legal or Not(拓扑排序)

题目链接 1 /*2 Name:hdoj-3342-Legal or Not3 Copyright:4 Author:5 Date: 2018/4/11 15:59:186 Description:7 判断是否存在环 8 */9 #include <iostream> 10 #include <queue> 11 #include <vector> 12 #include <cstring…

剪切文件_lammps模拟带缺陷镍板剪切变形(in文件及注释)

本期给大家带来lammps模拟带缺陷镍板剪切变形的in文件及其详细注释。初始模型如图一所示&#xff1a;图1 生成的初始模型 in文件及注释如下&#xff1a;#利用eam势函数模拟带缺陷镍板的剪切#模型构成——上下镍板夹可动镍块&#xff0c;镍块中有圆柱形缺陷&#xff0c;移动上镍…

js总结:对于字符串的切割截取和合并

1.函数&#xff1a;split() 功能&#xff1a;使用一个指定的分隔符把一个字符串分割存储到数组 例子&#xff1a; str”jpg|bmp|gif|ico|png”; arrstr.split(”|”); //arr是一个包含字符值”jpg”、”bmp”、”gif”、”ico”和”png”的数组 2.函数&#xff1a;join() 功能&…

为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...

构建一个很棒的机器学习项目是一回事&#xff0c;但归根结底&#xff0c;你希望其他人能够看到你的辛勤工作。当然&#xff0c;你可以将整个项目放在GitHub上&#xff0c;但是怎么让你的祖父母也看到呢&#xff1f;我们想要的是将深度学习模型部署为世界上任何人都可以访问的We…

jieba库分词

代码在github网站&#xff1a;https://github.com/oljb/ljb中的py文件里&#xff0c;词频和词频分布图也在github网站上 简介用词特点&#xff1a;和专业有关的词语有编程&#xff0c;软工&#xff0c;测试&#xff0c;技术等&#xff0c;关于个人的词语有希望&#xff0c;兴趣…

datetime mysql 当天_MySQL 获得当前日期时间(以及时间的转换)

MySQL 获得当前日期时间(以及时间的转换)1.1 获得当前日期时间(date time)函数&#xff1a;now()除了 now() 函数能获得当前的日期时间外&#xff0c;MySQL 中还有下面的函数&#xff1a;current_timestamp() current_timestamplocaltime() localtimelocaltimestamp() l…

判断mysql的关键字_mysql中查询常用的关键字

最简单的查询&#xff1a;这里需要注意的是where子句中条件过滤使用到的关键字,比如用到逻辑运算符like中的’%‘(匹配一个或多个字符)和’_‘(仅匹配一个)等。distinct关键字这个关键字,主要用来取出列中唯一的值。需要注意distinct关键字必须放在查询字段的开头&#xff0c;一…

GROUP BY 语句

GROUP BY 语句用于结合聚合函数&#xff0c;根据一个或多个列对结果集进行分组 GROUP BY 语法 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 例句&#xff1a; 每个学生的总分数 select S,su…

centos 源码安装mysql5.6_CentOS 7下源码安装MySQL 5.6

目录准备工作运行环境确认你的安装版本下载MySQL安装MySQL准备安装环境编译和安装配置MySQL单实例配置单实例配置方法添加防火墙启动MySQL重启MySQL多实例配置什么是多实例多实例配置方法创建启动文件初始化数据库配置防火墙启动MySQL登陆MySQL重启MySQL准备工作运行环境本文的…

跳一跳

转载于:https://www.cnblogs.com/shanhua-fu/p/8807348.html