1.发现问题
项目写了半个月了,一直没怎么自己去看。自己也清楚有非常多需要优化的问题,为了更快的发现问题,找了几个好朋友帮我找找,自己也再看了一下,确实是有不少问题,所以做了一部分的优化。
2.修改问题
①单例模式的错误
写这个代码的时候,有一些想当然了,好朋友指出了单例模式的构造函数没有设为私有的问题,这里在XInclude/common/def.h定义了一个宏,把所有的单例模式的应用都做了修改。
/**********************************************************
* Author : 谢名聪
* Email : 869408604@qq.com
* Last modified : 2022-04-21 11:44
* Filename : def.h
* Description : 一些通用的宏定义,类的定义放在这里.
* *******************************************************/
#ifndef BASE_DEF_H
#define BASE_DEF_H
//------------------------------------------
//日志类型
#define LOG_ERROR 1
#define LOG_WARN 2
#define LOG_DEBUG 3
#define SYS_ERROR_LOG XLog::me().errorLog
#define SYS_WARN_LOG XLog::me().warnLog
#define SYS_DEBUG_LOG XLog::me().debugLog
//--------------------------------------------
//输出
#define SYS_ERROR_PRINT XPrint::me().errorPrint
#define SYS_WARN_PRINT XPrint::me().warnPrint
#define SYS_DEBUG_PRINT XPrint::me().debugPrint
//单例模式的宏
//将构造函数 拷贝构造函数设置为私有
#define CREATE_SINGLETON(CLASS_TYPE) \
private:\
CLASS_TYPE(){}\
CLASS_TYPE(const CLASS_TYPE & type){}\
public:\
static CLASS_TYPE & me()\
{\
static CLASS_TYPE me;\
return me;\
}
#endif
②run.sh脚本的修改
我再run.sh中加入了mkdir log命令,没有判断log目录是否存在,log路径作为配置文件,也没有用变量表示出来,这里做了一些修改。
log_path=log
ulimit -c 10000
export LD_LIBRARY_PATH=../lib/
#判断是否有log目录
if [ ! -d $log_path ];then
mkdir -p $log_path
fi
./process config.ini
③在输出和日志里加入等级
之前忽略了日志和输出应该需要加入等级控制,可以根据组合打印日志和输出,这里做了以下修改,在makefile中加入宏,当不需要输出和日志的时候,把对应的宏去掉就行。在代码中加入预编译判断。
在Makefile中的修改
cc=g++
cc_flags=\
-std=c++11 \
-I../include \
-MMD
ln_flags=\
-L../lib -lprotobuf \
-L../lib -lmysqlclient \
-lpthread \
-lm \
-ldl \
obj=\
../proto/src/User.pb.o \
XInclude/XConfig/XConfig.o \
XInclude/XMysql/XMysql.o \
XInclude/XThread/XThread.o \
XInclude/XLog/XLog.o \
XInclude/XLog/XLogFun.o \
XProcess/XProcess.o \
Process.o \
main.o \
#开放打印的类型 ERROR_P WARN_P DEBUG_P
print_def= \
-D ERROR_P \
-D WARN_P \
-D DEBUG_P \
#开放日志类型 ERROR_L WARN_L DEBUG_L
log_def= \
-D ERROR_L \
-D WARN_L \
-D DEBUG_L \
target=process
$(target) : $(obj)
$(cc) $(ln_flags) $(obj) -o $(target)
%.o : %.cpp
$(cc) $(print_def) $(log_def) $(cc_flags) -c $< -o $@
%.o: %.cc
$(cc) $(cc_flags) -c $< -o $@
-include $(obj:.o=.d)
clean:
rm -f $(obj) $(obj:.o=.d) $(obj:.o=.d*) $(target) core.* log/*
在XLog.h中的修改
/**********************************************************
* Author : 谢名聪
* Email : 869408604@qq.com
* Last modified : 2022-04-22 10:36
* Filename : XLog.h
* Description :将打印内容写入指定的文件,参数替代符为<>
* 例如LOG_DEBUG("aaa<>",1) 则写入[DEBUG——时间] aaa1.
* *******************************************************/
#include "XLogFun.h"
#include "../XThread/XThread.h"
#include "../common/def.h"
#include <fstream>
#include <queue>
struct LogData
{
uint32_t logType;
std::string logMsg;
};
class XLog:public XThread
{
CREATE_SINGLETON(XLog);
public:
virtual bool exec() override;
public:
//配置文件目录
bool init(std::string path);
public:
template<typename... Args>
void errorLog(std::string str, Args... args) {
#ifdef ERROR_L
insertLog(LOG_ERROR, str, args...);
#endif
}
template<typename... Args>
void warnLog(std::string str, Args... args) {
#ifdef WARN_L
insertLog(LOG_WARN, str, args...);
#endif
}
template<typename... Args>
void debugLog(std::string str, Args... args) {
#ifdef DEBUG_L
insertLog(LOG_DEBUG, str, args...);
#endif
}
template<typename... Args>
void insertLog(uint32_t logType, std::string info, Args... args)
{
using namespace x_log_fun;
LogData data;
data.logType = logType;
XLogFun::me().getLogInfo(info, args...);
data.logMsg = info;
m_queLogs.push(data);
}
void writeLog(LogData info);
private:
std::ofstream m_ofs;
std::queue<LogData> m_queLogs;
};
在XPrint.h中的修改
/**********************************************************
* Author : 谢名聪
* Email : 869408604@qq.com
* Last modified : 2022-04-23 08:07
* Filename : XPrint.h
* Description : 写一个自己的打印类,去替代cout,主要可以
* 增加颜色的控制,用醒目的颜色来标出自己的打印,便于找问题
* *******************************************************/
#ifndef X_PRINT_H
#define X_PRINT_H
#include "XLogFun.h"
#include<iostream>
class XPrint
{
CREATE_SINGLETON(XPrint);
public:
//错误输出 红色
template<typename... Args>
void errorPrint(std::string str, Args... args) {
#ifdef ERROR_P
using namespace x_log_fun;
XLogFun::me().getLogInfo(str, args...);
printf("\033[31m %s\n\033[0m",str.c_str());
#endif
}
//警告输出 黄色
template<typename... Args>
void warnPrint(std::string str, Args... args) {
#ifdef WARN_P
using namespace x_log_fun;
XLogFun::me().getLogInfo(str, args...);
printf("\033[33m %s\n\033[0m",str.c_str());
#endif
}
//调试输出 绿色
template<typename... Args>
void debugPrint(std::string str, Args... args) {
#ifdef DEBUG_P
using namespace x_log_fun;
XLogFun::me().getLogInfo(str, args...);
printf("\033[32m %s\n\033[0m",str.c_str());
#endif
}
};
#endif