finish log realdata send funtion
This commit is contained in:
@@ -434,11 +434,13 @@ public:
|
||||
&queueNum // 传递给选择器的额外参数(队列数量)
|
||||
);
|
||||
|
||||
//调试用
|
||||
/*
|
||||
if (sendResult == 0) { // 假设返回 0 表示成功
|
||||
std::cout << "Message sent successfully.topic:" << topic <<std::endl;
|
||||
} else {
|
||||
std::cout << "Failed to send message." << std::endl;
|
||||
}
|
||||
}*/
|
||||
|
||||
// 销毁消息
|
||||
DestroyMessage(msg);
|
||||
|
||||
@@ -4353,7 +4353,7 @@ int parse_ledger_update_xml(trigger_update_xml_t* trigger_update_xml)
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cout << "No matching XML files found." << std::endl;
|
||||
//std::cout << "No matching XML files found." << std::endl;//<2F><><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>Ҫ<EFBFBD>Ĵ<EFBFBD>ӡ
|
||||
return APR_EGENERAL;
|
||||
}
|
||||
|
||||
@@ -7429,7 +7429,7 @@ void SendWebAPI_web(const string strUrl, const char* code, char** ptr)
|
||||
{
|
||||
char url[100];
|
||||
sprintf(url, "%s?%s", strUrl.c_str(), code);
|
||||
printf(">>>json %s\n", url);
|
||||
//printf(">>>json %s\n", url);//<2F><><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>Ҫ<EFBFBD>Ĵ<EFBFBD>ӡ
|
||||
// <20><><EFBFBD><EFBFBD>URL
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
@@ -11454,7 +11454,7 @@ void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::str
|
||||
if (curl) {
|
||||
char url[256];
|
||||
snprintf(url, sizeof(url), "%s?%s", strUrl.c_str(), code);
|
||||
printf(">>>json %s\n", url);
|
||||
//printf(">>>json %s\n", url);//<2F><><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>Ҫ<EFBFBD>Ĵ<EFBFBD>ӡ
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_http);
|
||||
@@ -14357,7 +14357,7 @@ int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_i
|
||||
rptinfo_t **rptinfo = NULL;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error111 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error111 !!!!!!!!!!!!!!\n");
|
||||
|
||||
|
||||
|
||||
@@ -14376,14 +14376,14 @@ int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_i
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error112 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error112 !!!!!!!!!!!!!!\n");
|
||||
|
||||
//////// //<2F><>¼ԭ<C2BC>еı<D0B5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||
loginfo = ied_usr->LD_info[cpuno - 1].loginfo?ied_usr->LD_info[cpuno - 1].loginfo:NULL;
|
||||
rptinfo = ied_usr->LD_info[cpuno - 1].rptinfo?ied_usr->LD_info[cpuno - 1].rptinfo:NULL;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error113 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error113 !!!!!!!!!!!!!!\n");
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>Ѵ<EFBFBD><D1B4>ڵ<EFBFBD>ied<65><64><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>֮ǰ<D6AE><C7B0>ʼ<EFBFBD><CABC><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>˹<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>̨<EFBFBD><CCA8>ʱû<CAB1><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (ied_usr->LD_info[cpuno - 1].ht_fcd != NULL) {
|
||||
@@ -14394,7 +14394,7 @@ int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_i
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error116 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error116 !!!!!!!!!!!!!!\n");
|
||||
|
||||
//<2F><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>ɾ<EFBFBD><C9BE>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
|
||||
@@ -14424,23 +14424,23 @@ int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_i
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
memset(ied_usr->LD_info[cpuno - 1].LD_name, 0, 256);
|
||||
|
||||
printf("check error333 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error333 !!!!!!!!!!!!!!\n");
|
||||
|
||||
apr_cpystrn(ied_usr->LD_info[cpuno - 1].LD_name, str, 256); //ԭ<>пռ串<D5BC><E4B8B2>
|
||||
|
||||
printf("check error222 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error222 !!!!!!!!!!!!!!\n");
|
||||
}
|
||||
|
||||
ldname = ied_usr->LD_info[cpuno - 1].LD_name;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error114 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error114 !!!!!!!!!!!!!!\n");
|
||||
|
||||
ied_usr->LD_info[cpuno - 1] = line_info;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA>棬<EFBFBD><E6A3AC>Ϊ<EFBFBD><CEAA>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD>ԭ<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
|
||||
ied_usr->LD_info[cpuno - 1].ied = ied; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA>棬<EFBFBD><E6A3AC>Ϊ<EFBFBD><CEAA>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD>ԭ<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>
|
||||
printf("check error115 !!!!!!!!!!!!!!\n");
|
||||
//printf("check error115 !!!!!!!!!!!!!!\n");
|
||||
|
||||
|
||||
|
||||
@@ -15166,127 +15166,232 @@ void rocketmq_test_300(int mpnum,int front_index) {
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////lnkʵʱ<CAB5><CAB1>־<EFBFBD><D6BE><EFBFBD><EFBFBD>20250205
|
||||
// ȫ<><C8AB><EFBFBD>б<EFBFBD><D0B1>Ϳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// ------------------ ȫ<><C8AB><EFBFBD><EFBFBD>־<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------
|
||||
std::list<std::string> errorList;
|
||||
std::list<std::string> warnList;
|
||||
std::list<std::string> normalList;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
pthread_mutex_t errorListMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_t warnListMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_t errorListMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_t warnListMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_t normalListMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
bool errorOutputEnabled = false;
|
||||
bool warnOutputEnabled = false;
|
||||
bool normalOutputEnabled = false;
|
||||
|
||||
// <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
class RedirectStreamBuf : public std::streambuf {
|
||||
public:
|
||||
RedirectStreamBuf(std::list<std::string>& targetList, pthread_mutex_t& targetMutex)
|
||||
: targetList(targetList), targetMutex(targetMutex) {}
|
||||
|
||||
protected:
|
||||
virtual int_type overflow(int_type ch) override {
|
||||
if (ch != EOF) {
|
||||
char c = static_cast<char>(ch);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> targetList
|
||||
pthread_mutex_lock(&targetMutex);
|
||||
targetList.push_back(std::string(1, c));
|
||||
pthread_mutex_unlock(&targetMutex);
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
private:
|
||||
std::list<std::string>& targetList;
|
||||
pthread_mutex_t& targetMutex;
|
||||
// ------------------ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------
|
||||
bool errorOutputEnabled = false; // <20>Ƿ<EFBFBD><C7B7><EFBFBD> error <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4> errorList
|
||||
bool warnOutputEnabled = false; // <20>Ƿ<EFBFBD><C7B7><EFBFBD> warn <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4> warnList
|
||||
bool normalOutputEnabled = false; // <20>Ƿ<EFBFBD><C7B7><EFBFBD> normal <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4> normalList
|
||||
|
||||
// ------------------ <20><><EFBFBD>ڻָ<DABB>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------
|
||||
static std::streambuf* g_originalCoutBuf = NULL;
|
||||
static std::streambuf* g_originalClogBuf = NULL;
|
||||
static std::streambuf* g_originalCerrBuf = NULL;
|
||||
|
||||
// ------------------ <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ö<EFBFBD>٣<EFBFBD>C++98<39><38> ------------------
|
||||
enum LogLevel {
|
||||
LOG_ERROR,
|
||||
LOG_WARN,
|
||||
LOG_NORMAL
|
||||
};
|
||||
|
||||
// <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void redirectErrorOutput(bool enabled) {
|
||||
errorOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
static RedirectStreamBuf errorBuf(errorList, errorListMutex);
|
||||
std::cerr.rdbuf(&errorBuf);
|
||||
} else {
|
||||
std::cerr.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// TeeStreamBuf: <20><>д<EFBFBD><D0B4>ԭʼbuf(<28><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD>list<73><74>
|
||||
// ------------------------------------------------------------------
|
||||
class TeeStreamBuf : public std::streambuf
|
||||
{
|
||||
public:
|
||||
// Ĭ<>Ϲ<EFBFBD><CFB9>죺<EFBFBD>Ȱ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ΪNULL
|
||||
TeeStreamBuf()
|
||||
: m_originalBuf(NULL), m_level(LOG_NORMAL)
|
||||
{
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>ι<EFBFBD><CEB9>죺ֱ<ECA3BA>ӳ<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
TeeStreamBuf(std::streambuf* originalBuf, LogLevel level)
|
||||
: m_originalBuf(originalBuf), m_level(level)
|
||||
{
|
||||
}
|
||||
|
||||
// <20>Զ<EFBFBD><D4B6><EFBFBD> init(...) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void init(std::streambuf* originalBuf, LogLevel level)
|
||||
{
|
||||
m_originalBuf = originalBuf;
|
||||
m_level = level;
|
||||
m_buffer.clear();
|
||||
}
|
||||
|
||||
protected:
|
||||
// <20><> flush <20><> std::endl ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sync()
|
||||
virtual int sync()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ͬ<EFBFBD><CDAC>
|
||||
if (m_originalBuf) {
|
||||
m_originalBuf->pubsync();
|
||||
}
|
||||
// <20>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD> flush
|
||||
flushBuffer();
|
||||
return 0; // <20>ɹ<EFBFBD>
|
||||
}
|
||||
|
||||
// <20><>д<EFBFBD><D0B4>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ʱ<EFBFBD><CAB1>overflow() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
virtual int_type overflow(int_type ch)
|
||||
{
|
||||
if (ch == traits_type::eof()) {
|
||||
return ch;
|
||||
}
|
||||
// 1) д<><D0B4>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (m_originalBuf) {
|
||||
if (m_originalBuf->sputc(static_cast<char>(ch)) == traits_type::eof()) {
|
||||
return traits_type::eof();
|
||||
}
|
||||
}
|
||||
// 2) <20>浽<EFBFBD><E6B5BD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
m_buffer.push_back((char)ch);
|
||||
// 3) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD> flushBuffer()
|
||||
if (ch == '\n') {
|
||||
flushBuffer();
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
private:
|
||||
// <20><> m_buffer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>Ӧ list<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void flushBuffer()
|
||||
{
|
||||
if (m_buffer.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>ݵȼ<DDB5> + <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> <20><> д<>ļ<EFBFBD><C4BC><EFBFBD>list
|
||||
switch (m_level) {
|
||||
|
||||
case LOG_ERROR:
|
||||
if (errorOutputEnabled) {
|
||||
pthread_mutex_lock(&errorListMutex);
|
||||
errorList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&errorListMutex);
|
||||
}
|
||||
if (warnOutputEnabled) {
|
||||
pthread_mutex_lock(&warnListMutex);
|
||||
warnList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&warnListMutex);
|
||||
}
|
||||
if (normalOutputEnabled) {
|
||||
pthread_mutex_lock(&normalListMutex);
|
||||
normalList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&normalListMutex);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_WARN:
|
||||
if (warnOutputEnabled) {
|
||||
pthread_mutex_lock(&warnListMutex);
|
||||
warnList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&warnListMutex);
|
||||
}
|
||||
if (normalOutputEnabled) {
|
||||
pthread_mutex_lock(&normalListMutex);
|
||||
normalList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&normalListMutex);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_NORMAL:
|
||||
if (normalOutputEnabled) {
|
||||
pthread_mutex_lock(&normalListMutex);
|
||||
normalList.push_back(m_buffer);
|
||||
pthread_mutex_unlock(&normalListMutex);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
m_buffer.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
// <20><>ֹ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ɵĸ<C9B5>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> (C++98<39><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
TeeStreamBuf& operator=(const TeeStreamBuf&); // <20><>ʵ<EFBFBD><CAB5>
|
||||
|
||||
private:
|
||||
std::streambuf* m_originalBuf;
|
||||
LogLevel m_level;
|
||||
std::string m_buffer;
|
||||
};
|
||||
|
||||
// ------------------ ȫ<><C8AB>Tee<65><65><EFBFBD><EFBFBD><F3A3A8B1><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>ֵ<EFBFBD><D6B5> ------------------
|
||||
static TeeStreamBuf g_errorTeeBuf;
|
||||
static TeeStreamBuf g_warnTeeBuf;
|
||||
static TeeStreamBuf g_normalTeeBuf;
|
||||
|
||||
// ------------------ <20>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------
|
||||
// ֻ<>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> init(...) <20><>ʼ<EFBFBD><CABC> TeeStreamBuf<75><66>
|
||||
// ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> new <20><> <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>õĶ<C3B5><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
void redirectErrorOutput(bool enabled)
|
||||
{
|
||||
errorOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
if (g_originalCerrBuf == NULL) {
|
||||
g_originalCerrBuf = std::cerr.rdbuf();
|
||||
g_errorTeeBuf.init(g_originalCerrBuf, LOG_ERROR);
|
||||
}
|
||||
std::cerr.rdbuf(&g_errorTeeBuf);
|
||||
} else {
|
||||
if (g_originalCerrBuf) {
|
||||
std::cerr.rdbuf(g_originalCerrBuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>澯<EFBFBD><E6BEAF><EFBFBD><EFBFBD>
|
||||
void redirectWarnOutput(bool enabled) {
|
||||
warnOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
static RedirectStreamBuf warnBuf(warnList, warnListMutex);
|
||||
std::clog.rdbuf(&warnBuf);
|
||||
std::cerr.rdbuf(&warnBuf);
|
||||
} else {
|
||||
std::clog.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯<EFBFBD><E6BEAF>
|
||||
std::cerr.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
void redirectWarnOutput(bool enabled)
|
||||
{
|
||||
warnOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
if (g_originalClogBuf == NULL) {
|
||||
g_originalClogBuf = std::clog.rdbuf();
|
||||
g_warnTeeBuf.init(g_originalClogBuf, LOG_WARN);
|
||||
}
|
||||
std::clog.rdbuf(&g_warnTeeBuf);
|
||||
} else {
|
||||
if (g_originalClogBuf) {
|
||||
std::clog.rdbuf(g_originalClogBuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
|
||||
void redirectNormalOutput(bool enabled) {
|
||||
normalOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
static RedirectStreamBuf normalBuf(normalList, normalListMutex);
|
||||
std::cout.rdbuf(&normalBuf);
|
||||
std::clog.rdbuf(&normalBuf);
|
||||
std::cerr.rdbuf(&normalBuf);
|
||||
} else {
|
||||
std::cout.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::clog.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>澯<EFBFBD><E6BEAF>
|
||||
std::cerr.rdbuf(nullptr); // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
void redirectNormalOutput(bool enabled)
|
||||
{
|
||||
normalOutputEnabled = enabled;
|
||||
if (enabled) {
|
||||
if (g_originalCoutBuf == NULL) {
|
||||
g_originalCoutBuf = std::cout.rdbuf();
|
||||
g_normalTeeBuf.init(g_originalCoutBuf, LOG_NORMAL);
|
||||
}
|
||||
std::cout.rdbuf(&g_normalTeeBuf);
|
||||
} else {
|
||||
if (g_originalCoutBuf) {
|
||||
std::cout.rdbuf(g_originalCoutBuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// <20>Զ<EFBFBD><EFBFBD><EFBFBD> printf <20><EFBFBD><EFBFBD><EFBFBD>
|
||||
int customPrintf(const char* format, ...) {
|
||||
// ------------------ <20>Զ<EFBFBD><D4B6><EFBFBD> printf <20><><EFBFBD><EFBFBD> ------------------
|
||||
// <20><><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> normal <20><><EFBFBD><EFBFBD> => <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>normalList(<28><><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD>)
|
||||
int customPrintf(const char* format, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
char buffer[1024];
|
||||
|
||||
// <20>ȸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD> buffer
|
||||
int written = vsnprintf(buffer, sizeof(buffer), format, args);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ԭʼ va_list
|
||||
va_end(args);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (written < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĿ<EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>
|
||||
if (errorOutputEnabled) {
|
||||
pthread_mutex_lock(&errorListMutex);
|
||||
errorList.push_back(buffer);
|
||||
pthread_mutex_unlock(&errorListMutex);
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::cout<75><74><EFBFBD>Ӷ<EFBFBD>TeeStreamBuf<EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cout << buffer << std::endl;
|
||||
|
||||
if (warnOutputEnabled) {
|
||||
pthread_mutex_lock(&warnListMutex);
|
||||
warnList.push_back(buffer);
|
||||
pthread_mutex_unlock(&warnListMutex);
|
||||
}
|
||||
|
||||
if (normalOutputEnabled) {
|
||||
pthread_mutex_lock(&normalListMutex);
|
||||
normalList.push_back(buffer);
|
||||
pthread_mutex_unlock(&normalListMutex);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF>ض<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ԭ<EFBFBD><D4AD> printf <20><><EFBFBD><EFBFBD>
|
||||
if (!errorOutputEnabled && !warnOutputEnabled && !normalOutputEnabled) {
|
||||
// ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
|
||||
std::cout << buffer << std::endl; // ʹ<><CAB9> std::cout <20><><EFBFBD><EFBFBD> printf <20><><EFBFBD>ij<EFBFBD>ͻ
|
||||
}
|
||||
|
||||
return written; // <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>ӡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
return written;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user