Commit 6a5a53b7 by Zeng Rixuan

no message

parent 9b2e452a
111
\ No newline at end of file
## QT工程如何调用easylogging++
### 简介
​ easylogging++是一款轻量化的日志工具,用于记录程序执行日志,它具有编译速度快、可配置度高、扩展性强的特点。通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速、准确地定位问题。
​ 在Visual Studio中运行甚至只需要添加头文件 include "easylogging++.h" 就能快速使用easylogging。在QT项目中调用easylogging++需要引入easylogging++.h、easylogging++.cpp、my_easylogging.cpp(自定义日志文件)等文件。
gitlab链接:
[Zeng Rixuan / easylogging · GitLab (linkortech.com)](http://git.linkortech.com:10020/Zengrixuan/easylogging)
### 文件、目录介绍
介绍一下文件和目录的结构有助于理解项目搭建
目录树状图和文件介绍如下
```
.
├──main.cpp 主程序
├──feature 存放特征库的文件夹(xdevice中包括easylogging、lua等)
├── easyloggingpp 存放easylogging库的文件夹
├── inc 存放easylogging官方头文件easylogging++.h
├── src 存放easylogging官方源文件easylogging++.cc
├── my_easylogging.cpp 自定义日志源文件
├── my_easylogging.h 自定义日志头文件
├── normal_typedef.h 定义项目中数据格式的头文件
├──log 存放log配置文件和日志的文件夹
├── log.conf log配置文件
```
### 路径更改
在搭建项目之前,先进行代码的相关路径更改
#### 配置文件.conf文件中的相关路径
```
* GLOBAL:
FORMAT = "%datetime:[%level]%msg"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 209715200
FILENAME = "./log/info_%datetime{%Y%M%d}.log"
* INFO:
FORMAT = "%datetime %msg"
ENABLED = true
FILENAME = "./log/info_%datetime{%Y%M%d%H}.log"
* DEBUG:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
FILENAME = "./log/debug_%datetime{%Y%M%d}.log"
* ERROR:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
FILENAME = "./log/error_%datetime{%Y%M%d%H}.log"
TO_STANDARD_OUTPUT = true
/*
1.可以看到每个log等级都会输出一个.log文件,具体信息在FILENAME中设置,需要定位到自己本地的log文件夹位置,生成对应的例如info+时间.log、debug+时间.log文件。
%datetime{%Y%M%d%H}意思是获取当前时间,精确到小时
2.如果各级都没有配置FILENAME,会找不到输出位置,默认输出在编译文件夹中,命名为:myeasylog.log
3.如果除了GLOBAL配置了FILENAME,其他级别都没配置,则所有日志内容会打印在GLOBAL配置的日志中
4.在对于log等级配置中添加:TO_STANDARD_OUTPUT = true,对应等级的log就会在终端打印,下面的ERROR例子在终端打印便是如此。
*/
```
#### my_easylogging.cpp中的相关路径
```
//读取配置文件:根目录下log文件夹中的log.conf 将路径更改为自己的conf文件路径
const string log_conf_file = R"(./log/log.conf)";
//const string log_conf_file 读取log.conf,根据log.conf中设置的路径生成log
```
### 搭建过程
1.在 QT文件栏新建QT Console Application项目,会在所选路径生成以项目命名的文件夹
2.进入生成的项目文件夹,根据树状图新建文件夹并放入文件
3.返回QT页面,在项目名处右击,添加现有文件,将文件夹中的头文件和源文件都添加进去
![1651057699366](README.assets/1651057699366.png)
添加之后效果如图所示:
![1651057749031](README.assets/1651057749031.png)
此时logtest.pro文件中自动生成头文件和源文件的路径:
```
SOURCES += main.cpp \
$$PWD/feature/easyloggingpp/my_easylogging.cpp \
$$PWD/feature/easyloggingpp/src/easylogging++.cc
HEADERS += \
$$PWD/feature/easyloggingpp/my_easylogging.h \
$$PWD/feature/easyloggingpp/inc/easylogging++.h \
$$PWD/feature/easyloggingpp/inc/normal_typedef.h
```
4.在logtest.pro最后一行加入代码,含义是头文件所在路径,否则编译时会识别不到头文件
```
INCLUDEPATH += $$PWD/feature/easyloggingpp/inc
INCLUDEPATH += $$PWD/feature/easyloggingpp
```
5.将下述main.cpp代码拷入,启动编译即可
```
注:编译前先如下操作:
QT左边状态栏——项目——build——shadow build 取消勾选
否则会生成编译文件夹,此时log会认准编译文件所在目录,将log文件放在这里,而不是我们指定的路径
```
### info效果展示
log(info)的效果通过 my_easylogging.cpp 中的 log_test( ) 函数展示
```
LOG(INFO) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(INFO) << " UINT8 cc[] = {0X31, 0X31, 0X31};";
LOG(INFO) << " char buf[3] = {5, 6, 7};";
LOG(INFO) << "#################封装之前###########";
LOG(INFO) << "打印cc :" << cc;
LOG(INFO) << "打印buf[3]:"
<< "buf = " << buf << " buf[0] = " << buf[0] << " buf[1] = " << buf[1] << "
(INT8)buf[2] = " << (UINT8)(buf[2]);
LOG(INFO) << "####################封装之后##########";
LogInfoDump("打印cc", cc, 3);
LogInfoDump("打印buf[3]", buf, 3);
```
此时终端输出为如下所示,info级别的不会将内容输出在终端上:
![1651732170563](README.assets/1651732170563.png)
此时各个级别log文件已经生成,进入log文件夹:
![1651738480171](README.assets/1651738480171.png)
由于测试的时info等级,只有info.log中有内容,打开可以看到代码运行内容:
![1651738691006](README.assets/1651738691006.png)
### error效果展示
同样的代码,将INFO等级改为ERROR进行测试,如下所示:
```
LOG(ERROR) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(ERROR) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(ERROR) << " UINT8 cc[] = {0X31, 0X31, 0X31};";
LOG(ERROR) << " char buf[3] = {5, 6, 7};";
LOG(ERROR) << "#################封装之前###########";
LOG(ERROR) << "打印cc :" << cc;
LOG(ERROR) << "打印buf[3]:"
<< "buf = " << buf << " buf[0] = " << buf[0] << " buf[1] = " << buf[1] << " (INT8)buf[2] = " << (UINT8)(buf[2]);
LOG(ERROR) << "####################封装之后##########";
LogErrorDump("打印cc", cc, 3);
LogErrorDump("打印buf[3]", buf, 3);
```
调试后,终端上会打印出error的信息,会打印出错误的内容,包括是哪个函数的第几行,如下所示:
![1651741728966](README.assets/1651741728966.png)
打开log文件夹中的error.log文件,日志内容与终端打印的error内容一致,如下所示:
![1651742341594](README.assets/1651742341594.png)
### 部分代码说明
在搭建项目之前,先进行代码说明以及路径配置,方便在项目中直接拷贝和配置
#### main.cpp
```c++
int main()
{
easylogginginit(1,1); //自定义日志初始化函数,在my_easylogging.cpp中定义
log_test(); //自定义日志自测函数,my_easylogging.cpp里面可以看细节的用法
printf("Hello world\n\r");
try // try/catch异常处理
{ //当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理
throw 20;
}
catch (int e) //捕获异常后进行日志记录
{
std::cout << "An exception occurred. Exception Nr. " << e << '\n'; //打印异常e
}
return 0;
}
```
#### my_easylogging.cpp部分代码
```c++
//log初始化配置,main()中调用,最先配置
void easylogginginit(int enable_log ,int enable_terminal)
{
//必须设置标记 LoggingFlag::StrictLogFileSizeCheck 否则,配置文件中MAX_LOG_FILE_SIZE = 1048576不生效
el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);
//读取配置文件:根目录下log文件加中的log.conf
const string log_conf_file = R"(./log/log.conf)";
// 加载配置文件,构造一个配置器对象
el::Configurations conf(log_conf_file.data());
// 用配置文件配置所有的日志记录器
el::Loggers::reconfigureAllLoggers(conf);
#if ELPP_FEATURE_CRASH_LOG
el::Helpers::setCrashHandler(myCrashHandler); //配置程序闪退的时候,再log中记录一下
#endif
/// 注册回调函数
el::Helpers::installPreRollOutCallback(rolloutHandler);
}
//log测试函数,main()中调用
void log_test()
{
char aa = 4;
// char *cc = "12345";
UINT8 cc[] = {0X31, 0X31, 0X31};
char buf[3] = {5, 6, 7};
LOG(INFO) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(INFO) << " UINT8 cc[] = {0X31, 0X31, 0X31};";
LOG(INFO) << " char buf[3] = {5, 6, 7};";
LOG(INFO) << "#################封装之前###########";
LOG(INFO) << "打印cc :" << cc;
LOG(INFO) << "打印buf[3]:"
<< "buf = " << buf << " buf[0] = " << buf[0] << " buf[1] = " << buf[1] << " (INT8)buf[2] = " << (UINT8)(buf[2]);
LOG(INFO) << "####################封装之后##########";
//LogInfoDump是自己对log输出的封装,而不直接使用Easylogging给出的宏
LogInfoDump("打印cc", cc, 3);
LogInfoDump("打印buf[3]", buf, 3);
}
//根据log的等级输出,logDump()中调用
void logStrOut(int size, std::string str, LEVEL_LOG logLevel)
{
switch (logLevel)
{
case MY_ERR:
// LOG(ERROR) << "[Arr Count:" << size << "]" << str;
LOG(ERROR) << str;
break;
case MY_Debug:
// LOG(DEBUG) << "[Arr Count:" << size << "]" << str;
LOG(DEBUG) << str;
break;
case MY_Info:
// LOG(INFO) << "[Arr Count:" << size << "]" << str;
LOG(INFO) << str;
break;
case MY_Trace:
// LOG(TRACE) << "[Arr Count:" << size << "]" << str;
LOG(TRACE) << str;
break;
case MY_Warn:
// LOG(WARNING) << "[Arr Count:" << size << "]" << str;
LOG(WARNING) << str;
break;
default:
break;
}
}
```
### 附录
#### Level级别介绍
In order to start configuring your logging library, you must understand severity levels. Easylogging++ deliberately does not use hierarchical logging in order to fully control what's enabled and what's not. That being said, there is still option to use hierarchical logging using `LoggingFlag::HierarchicalLogging`. Easylogging++ has following levels (ordered for hierarchical levels)
| Level | Description |
| ------- | ------------------------------------------------------------ |
| Global | Generic level that represents all levels. Useful when setting global configuration for all levels. <br />代表所有级别的通用级别。在为所有级别设置全局配置时很有用。 |
| Trace | Information that can be useful to back-trace certain events - mostly useful than debug logs.<br />可用于回溯某些事件的信息-大多数信息比调试日志有用。 |
| Debug | Informational events most useful for developers to debug application. Only applicable if NDEBUG is not defined (for non-VC++) or _DEBUG is defined (for VC++).<br />信息事件对开发人员调试应用程序最有用。仅在未定义NDEBUG(对于非VC ++)或_DEBUG(对于VC ++)时适用。 |
| Fatal | Very severe error event that will presumably lead the application to abort.<br />非常严重的错误事件,可能会导致应用程序中止。 |
| Error | Error information but will continue application to keep running.<br />错误信息,但将继续使应用程序继续运行。 |
| Warning | Information representing errors in application but application will keep running.<br />表示应用程序错误的信息,但应用程序将继续运行。 |
| Info | Mainly useful to represent current progress of application.<br />主要用于表示当前的应用进度。 |
| Verbose | Information that can be highly useful and vary with verbose logging level. Verbose logging is not applicable to hierarchical logging.<br />信息非常有用,并且随着详细的日志记录级别而变化。详细日志记录不适用于分层日志记录。 |
| Unknown | Only applicable to hierarchical logging and is used to turn off logging completely.<br />仅适用于分层日志记录,用于完全关闭日志记录。 |
#### qt终端打印log时中文乱码问题
测试发现是调用my_easylogging.cpp里面的函数输出乱码,猜测是my_easylogging.cpp的编码方式有误。
[Qt中输出中文出现乱码(win10系统下)_小菜鸡的蜕变之路的博客-CSDN博客_qt打印中文乱码](https://blog.csdn.net/qq_26079093/article/details/106101331)
此时,执行生成的log日志文件,在查看时编码方式也应该改为GBK。
**但需要注意的是,最好将编码方式都统一成utl-8,并且在代码中避免出现中文字符**
#### 对于多线程的保护
为避免多线程进行时,多线程同时抢占easylogging,要配置线程保护机制,否则容易崩盘。
```
添加代码为:
DEFINES += \
ELPP_FEATURE_ALL \
ELPP_FEATURE_CRASH_LOG \
ELPP_THREAD_SAFE \
ELPP_OS_UNIX \
```
1.cmake项目中,在camkelists的add_definitions中添加全局定义
2.qt项目中,在.pro文件中添加全局定义
#### con.fig代码
建议统一使用下述con.fig代码,更改修改路径就能使用,效果是将各个等级的log均打印在一个info_log文件中。
```
* GLOBAL:
FORMAT = "%datetime:[%level]%msg"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 209715200
FILENAME = "./xprotocol/protocfg/log/info_%datetime{%Y%M%d}.log"
* INFO:
FORMAT = "%datetime %msg"
ENABLED = true
* DEBUG:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
* WARNING:
ENABLED = true
* TRACE:
ENABLED = false
* VERBOSE:
FORMAT = "%datetime{%d/%M/%y} | %level-%vlevel | %msg"
ENABLED = true
* ERROR:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
TO_STANDARD_OUTPUT = true
* FATAL:
ENABLED = true
TO_STANDARD_OUTPUT = true
```
QT += core
QT -= gui
CONFIG += c++11
TARGET = easylog
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
feature/easyloggingpp/my_easylogging.cpp \
feature/easyloggingpp/src/easylogging++.cc
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
HEADERS += \
feature/easyloggingpp/my_easylogging.h \
feature/easyloggingpp/inc/easylogging++.h \
feature/easyloggingpp/inc/normal_typedef.h
INCLUDEPATH += $$PWD/feature/easyloggingpp/inc
INCLUDEPATH += $$PWD/feature/easyloggingpp
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.3.1, 2022-05-10T11:03:05. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{554397b3-fa51-4ad9-9e23-338ed598a30f}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">false</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.9.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.9.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.59.win32_mingw53_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/zengrixuan/Documents/桌面文档/easylog</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/zengrixuan/Desktop/build-easylog-Desktop_Qt_5_9_0_MinGW_32bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/zengrixuan/Desktop/build-easylog-Desktop_Qt_5_9_0_MinGW_32bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">easylog</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">easylog2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/zengrixuan/Documents/桌面文档/easylog/easylog.pro</value>
<value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">easylog.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">C:/Users/zengrixuan/Documents/桌面文档/easylog</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>
This source diff could not be displayed because it is too large. You can view the blob instead.
#ifndef _NORMAL_TYPEDEF_H_
#define _NORMAL_TYPEDEF_H_
#include <iostream>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <math.h>
#include <sys/time.h>
/// SOCKET
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/time.h>
#include <pthread.h>
#if defined(_WIN32)
#include<WinSock2.h> //WindowsSocket
#include <ws2tcpip.h>
#include <windows.h>
#include <qdebug.h>
//typedef struct tagTHREADNAME_INFO
//{
// DWORD dwType; // must be 0x1000
// LPCSTR szName; // pointer to name (in user addr space)
// DWORD dwThreadID; // thread ID (-1=caller thread)
// DWORD dwFlags; // reserved for future use, must be zero
//} THREADNAME_INFO;
//void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
//{
// THREADNAME_INFO info;
// info.dwType = 0x1000;
// info.szName = szThreadName;
// info.dwThreadID = dwThreadID;
// info.dwFlags = 0;
// __try
// {
// RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
// }
// __catch(EXCEPTION_CONTINUE_EXECUTION){}
//}
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/prctl.h>
#endif
/// define c++11 std
#if 11
#include <vector>
#include <set>
#include <map>
#include <list>
#include <queue>
#endif
/**
* @name define normal type;
*
** @} */
#if defined(_WIN32)
#else
typedef bool BOOLEAN;
typedef void VOID;
typedef int SOCKET;
#endif
typedef unsigned char UINT8;
typedef signed char INT8;
typedef unsigned char OCTET;
typedef char CHAR;
typedef unsigned short UINT16;
typedef signed short INT16;
typedef unsigned int UINT32;
typedef signed int INT32;
typedef unsigned long ULONG;
typedef signed long LONG;
typedef unsigned long long UINT64;
typedef long long INT64;
typedef float FLOAT;
typedef double DOUBLE;
typedef int SOCKET_FP;
/// for socket
#if defined(_WIN32)
#else
#define INVALID_SOCKET -1
typedef int SOCKET;
#endif
typedef int af_family;
typedef int in_port;
#define BACKLOG_LEN 10
#define SOCKET_SERVER_PORT 6666
#define SOCKET_CLIENT_PORT 9999
#define LOCAL_HOST "127.0.0.1" ///< 默认ip本地回环地址
///< 网络角色枚举
typedef enum
{
SOCKET_ROLE_SERVER = 0,
SOCKET_ROLE_CLIENT = 1
} SOCKET_ROLE_E;
///< 网络通讯协议的枚举
typedef enum
{
SOCKET_PROTO_TCP = 0,
SOCKET_PROTO_UDP = 1,
SOCKET_PROTO_UDP_MC = 2 ///< udp 组播通讯
} SOCKET_PROTO_E;
#if defined(_WIN32)
#else
#define TRUE true
#define FALSE false
#endif
///<记录返回状态
typedef enum
{
Lret_success = 0, ///< 成功
Lret_fail = 1, ///< 失败
Lret_timeout = 2, ///< 超时错误
Lret_accept_fail = 3,///< accept失败
Lret_connet_fail = 4, ///< 连接失败
Lret_recv_fail = 5,///< 接收失败
Lret_format_fail = 6,///< 格式打包失败
Lret_param_check_error = 7,///< 报文参数检查失败
Lret_max,
} Lret;
const char ret_str[][30] =
{
" success ",
" fail ",
" timeout ",
" accept_fail ",
" connet_fail ",
" recv_fail ",
" format_fail ",
" param_check_error "
} ;
void printf_init_log(char *log_info);
void printf_debug_log(char *log_info);
void En_G_LOG_DEBUG_INFO(int is_en);
void En_G_DEBUG_TERMINAL_LOG(int is_en);
#endif
#include "my_easylogging.h"
using namespace std;
// easylogging 相关内容
INITIALIZE_EASYLOGGINGPP
#if ELPP_FEATURE_CRASH_LOG
/**
* @brief myCrashHandler
* 程序奔溃前的回调函数,发出最后的呐喊,写下最后的log
* @param sig
*/
void myCrashHandler(int sig)
{
LOG(ERROR) << "Woops! Crashed!";
// FOLLOWING LINE IS ABSOLUTELY NEEDED AT THE END IN ORDER TO ABORT APPLICATION
el::Helpers::crashAbort(sig);
}
#endif
/**
* @brief rolloutHandler
* 日志备份,当文件超过一定大小后,就生成一个bak文件
* @param filename
* @param size
*/
void rolloutHandler(const char *filename, std::size_t size)
{
/// 备份日志
static unsigned int idx;
time_t nowtime;
struct tm *p;
time(&nowtime);
p = localtime(&nowtime);
#if defined(_WIN32)
cout << "###########LOG SIZE FULL#############" << endl;
std::stringstream ss;
string cc;
ss << "ren " << filename << " ./log/log_backup_" << ++idx << "_" << p->tm_year << p->tm_mon << p->tm_mday << ".log";
cc = ss.str();
replace(cc.begin(), cc.end(), '/', '\\');
system(cc.c_str());
#else
/*下面这段 需要优化*/
// system("mkdir bin");
std::stringstream ss;
std::time_t t = std::time(0); // t is an integer type
ss << "mv "
<< filename << " ./log/log_backup_" << ++idx << "_" << p->tm_year << p->tm_mon << p->tm_mday << ".log";
system(ss.str().c_str());
#endif
}
/**
* @brief easylogginginit
* easylogging初始化函数,加载配置文件,注册回调函数都在这里。
*/
void easylogginginit(int enable_log ,int enable_terminal)
{
/*
必须设置标记 LoggingFlag::StrictLogFileSizeCheck
否则,配置文件中MAX_LOG_FILE_SIZE = 1048576不生效
*/
el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);
const string log_conf_file = R"(./log/log.conf)";
// const string log_conf_file = R"(/root/gitlab/xdevice-platform/doc/log.conf)";
// 加载配置文件,构造一个配置器对象
el::Configurations conf(log_conf_file.data());
// 用配置文件配置所有的日志记录器
el::Loggers::reconfigureAllLoggers(conf);
#if ELPP_FEATURE_CRASH_LOG
el::Helpers::setCrashHandler(myCrashHandler); //配置程序闪退的时候,再log中记录一下
#endif
/// 注册回调函数
el::Helpers::installPreRollOutCallback(rolloutHandler);
}
/**
* @brief
* @param size 日志长度
* @param str 日志内容
* @param logLevel 当前日志等级
*/
void logStrOut(int size, std::string str, LEVEL_LOG logLevel)
{
switch (logLevel)
{
case MY_ERR:
// LOG(ERROR) << "[Arr Count:" << size << "]" << str;
LOG(ERROR) << str;
break;
case MY_Debug:
// LOG(DEBUG) << "[Arr Count:" << size << "]" << str;
LOG(DEBUG) << str;
break;
case MY_Info:
// LOG(INFO) << "[Arr Count:" << size << "]" << str;
LOG(INFO) << str;
break;
case MY_Trace:
// LOG(TRACE) << "[Arr Count:" << size << "]" << str;
LOG(TRACE) << str;
break;
case MY_Warn:
// LOG(WARNING) << "[Arr Count:" << size << "]" << str;
LOG(WARNING) << str;
break;
default:
break;
}
}
/**
* @brief
* 对char *型特例化
* @tparam
* @param info My Param doc
* @param buff My Param doc
* @param size My Param doc
* @param logLevel My Param doc
*/
template <>
void logDump(char *info, char *buff, int size, LEVEL_LOG logLevel)
{
std::string str(info);
str += "(ASCII): ";
if (buff == NULL || size <= 0)
str += "buff is null!";
else
{
std::stringstream ss;
for (int _dumpArrSize = 0; _dumpArrSize < size; ++_dumpArrSize)
ss << static_cast<int>(buff[_dumpArrSize]) << " ";
str += ss.str();
}
logStrOut(size, str, logLevel);
}
/**
* @brief
* 对UINT8 *型特例化 安装16进制打印
* @tparam
* @param info My Param doc
* @param buff My Param doc
* @param size My Param doc
* @param logLevel My Param doc
*/
template <>
void logDump(char *info, UINT8 *buff, int size, LEVEL_LOG logLevel)
{
std::string str(info);
str += "(HEX): ";
if (buff == NULL || size <= 0)
str += "buff is null!";
else
{
std::stringstream ss, s1;
for (int _dumpArrSize = 0; _dumpArrSize < size; ++_dumpArrSize)
// s1 =(buff[_dumpArrSize];
ss << std::hex << static_cast<uint>(buff[_dumpArrSize]) << " ";
str += ss.str();
}
logStrOut(size, str, logLevel);
}
// template <typename T>
// void fun(T a)
// {
// cout << "The main template fun(): " << a << endl;
// }
// template <> // 对int型特例化
// void fun(int a)
// {
// cout << "Specialized template for int type: " << a << endl;
// }
/**
* @brief
* 测试函数
*/
void log_test()
{
// char aa = 4;
// char *cc = "12345";
UINT8 cc[] = {0X31, 0X31, 0X31};
char buf[3] = {5, 6, 7};
//INFO测试
LOG(INFO) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(INFO) << " UINT8 cc[] = {0X31, 0X31, 0X31};";
LOG(INFO) << " char buf[3] = {5, 6, 7};";
LOG(INFO) << "#################封装之前###########";
LOG(INFO) << "打印cc :" << cc;
LOG(INFO) << "打印buf[3]:"
<< "buf = " << buf << " buf[0] = " << buf[0] << " buf[1] = " << buf[1] << " (INT8)buf[2] = " << (UINT8)(buf[2]);
LOG(INFO) << "####################封装之后##########";
LogInfoDump("打印cc", cc, 3);
LogInfoDump("打印buf[3]", buf, 3);
//ERROR测试
LOG(ERROR) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(ERROR) << " UINT8 cc[] = {0X31, 0X31, 0X31};";
LOG(ERROR) << " char buf[3] = {5, 6, 7};";
LogErrorDump("打印cc", cc, 3);
LogErrorDump("打印buf[3]", buf, 3);
}
#ifndef _MY_EASYLOGGING_H_
#define _MY_EASYLOGGING_H_
#include "easylogging++.h"
#include "normal_typedef.h"
#include <iostream>
enum LEVEL_LOG
{
MY_ERR = 0,
MY_Warn,
MY_Debug,
MY_Trace,
MY_Info
};
void myCrashHandler(int sig);
void rolloutHandler(const char *filename, std::size_t size);
void easylogginginit(int enable_log ,int enable_terminal);
void logStrOut(int size, std::string str, LEVEL_LOG logLevel);
#define LogInfoDump(info, buff, size) logDump(info, buff, size, LEVEL_LOG::MY_Info)
#define LogTraceDump(info, buff, size) logDump(info, buff, size, LEVEL_LOG::MY_Trace)
#define LogWarnDump(info, buff, size) logDump(info, buff, size, LEVEL_LOG::MY_Warn)
#define LogErrorDump(info, buff, size) logDump(info, buff, size, LEVEL_LOG::MY_ERR)
#define LogDebugDump(info, buff, size) logDump(info, buff, size, LEVEL_LOG::MY_Debug)
/**
* @brief
* 能方便输出:char buf[len] , int buf[lend]等数组,
* 而无需区分数组元素是字符类型还是整数类型。
* 能方便输出数据包。
* @tparam _TYPE
* @param info 日志头
* @param buff 日志内容
* @param size buff的size
* @param logLevel 日志等级
*/
template <typename T1>
void logDump(char *info, T1 *buff, int size, LEVEL_LOG logLevel)
{
std::string str(info);
str += ": ";
if (buff == NULL || size <= 0)
str += "buff is null!";
else
{
std::stringstream ss;
for (int _dumpArrSize = 0; _dumpArrSize < size; ++_dumpArrSize)
ss << (buff[_dumpArrSize]) << ",";
str += ss.str();
}
logStrOut(size, str, logLevel);
}
template <>
void logDump(char *info, char *buff, int size, LEVEL_LOG logLevel);
template <>
void logDump(char *info, UINT8 *buff, int size, LEVEL_LOG logLevel);
void log_test();
// template <typename T>
// void fun(T a)
// {
// std::cout << "The main template fun(): " << a << std::endl;
// }
// template <> // 对int型特例化
// void fun(int a);
#endif
// template <>
// void logDump(char *info, unsigned char *buff, int size, LEVEL_LOG logLevel);
// template <>
// void logDump(char *info, const char *buff, int size, LEVEL_LOG logLevel);
// template <>
// void logDump(char *info, const unsigned char *buff, int size, LEVEL_LOG logLevel);
This source diff could not be displayed because it is too large. You can view the blob instead.
* GLOBAL:
FORMAT = "%datetime:[%level]%msg"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 209715200
FILENAME = "./log/info_%datetime{%Y%M%d}.log"
* INFO:
FORMAT = "%datetime %msg"
ENABLED = true
* DEBUG:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
* WARNING:
ENABLED = true
* TRACE:
ENABLED = false
* VERBOSE:
FORMAT = "%datetime{%d/%M/%y} | %level-%vlevel | %msg"
ENABLED = true
* ERROR:
FORMAT = "%datetime:[%level] %func[%line] %msg"
ENABLED = true
TO_STANDARD_OUTPUT = true
* FATAL:
ENABLED = true
TO_STANDARD_OUTPUT = true
#include <stdio.h>
#include <iostream>
#include "./feature/easyloggingpp/my_easylogging.h"
// #define HDDD
int main()
{
easylogginginit(1,1); //日志初始化
log_test(); //日志自测函数 里面可以看细节的用法
printf("Hello world\n\r");
#if 0
while (1)
{
LOG(INFO) << "》》》》》》》》》》打印测试11111《《《《《《《《";
// sleep(1);//秒
usleep(1 * 1000); //微秒
// printf("HDDD not def\n\r");
// std::cout << "An exception occurred. Exception Nr. " << std::endl;
LOG(INFO) << "》》》》》》》》》》打印测试《《《《《《《《";
LOG(INFO) << "》》》》》》》》》》打印测试2222《《《《《《《《";
}
#endif
try
{
throw 20;
}
catch (int e)
{
std::cout << "An exception occurred. Exception Nr. " << e << '\n';
}
#ifdef HDDD
printf("HDDD def\n\r");
#else
printf("HDDD not def\n\r");
// std::cout << HDDD << std::endl;
#endif // #
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment