diff --git a/LFtid1056/cloudfront/code/cfg_parser.cpp b/LFtid1056/cloudfront/code/cfg_parser.cpp index 377e454..6fdb8a0 100644 --- a/LFtid1056/cloudfront/code/cfg_parser.cpp +++ b/LFtid1056/cloudfront/code/cfg_parser.cpp @@ -2976,36 +2976,48 @@ std::vector GenerateDeviceInfoFromLedger(const std::vector& file_list_raw) { +bool assign_qvvr_file_list(const std::string& id, + ushort nCpuNo, + const std::vector& file_list_raw) { + // ★新增:台账加锁(若上层已有锁,可移除本行) + std::lock_guard lk(ledgermtx); + std::vector file_names; // 1. 提取文件名部分 - for (const auto& full_path : file_list_raw) { + for (const auto& full_path_raw : file_list_raw) { + std::string full_path = sanitize(full_path_raw); // ★修改:清洗入参路径 size_t pos = full_path.find_last_of("/\\"); - if (pos != std::string::npos && pos + 1 < full_path.size()) { - file_names.push_back(full_path.substr(pos + 1)); - } else { - file_names.push_back(full_path); - } + std::string name = (pos != std::string::npos && pos + 1 < full_path.size()) + ? full_path.substr(pos + 1) + : full_path; + name = sanitize(name); // ★修改:清洗提取的文件名 + file_names.push_back(name); } + // ★可选:去重(如果 file_list_raw 里可能有重复) + std::sort(file_names.begin(), file_names.end()); + file_names.erase(std::unique(file_names.begin(), file_names.end()), file_names.end()); + // 2. 遍历终端 for (auto& dev : terminal_devlist) { - if (dev.terminal_id == id) { //根据终端id匹配终端 + if (dev.terminal_id == id) { // 根据终端id匹配终端 for (auto& monitor : dev.line) { try { - ushort monitor_seq = static_cast(std::stoi(monitor.logical_device_seq)); - if (monitor_seq == nCpuNo) { //根据监测点编号匹配监测点 + // ★修改:清洗 logical_device_seq 再进行转换 + std::string seq_str = sanitize(monitor.logical_device_seq); + ushort monitor_seq = static_cast(std::stoi(seq_str)); + if (monitor_seq == nCpuNo) { // 根据监测点编号匹配监测点 // 构造 qvvr_file qvvr_file qfile; - qfile.file_name.assign(file_names.begin(), file_names.end()); //终端文件列表 - qfile.is_download = false; - qfile.is_pair = false; + qfile.file_name.assign(file_names.begin(), file_names.end()); // 终端文件列表(已清洗) + qfile.is_download = false; + qfile.is_pair = false; qfile.file_time_count = 0; - qfile.used_status =true; + qfile.used_status = true; // 添加到唯一的 qvvrevent - monitor.qvvrevent.qvvrfile.push_back(std::move(qfile)); //记录暂态文件组 + monitor.qvvrevent.qvvrfile.push_back(std::move(qfile)); // 记录暂态文件组 return true; } } catch (...) { @@ -3017,7 +3029,6 @@ bool assign_qvvr_file_list(const std::string& id, ushort nCpuNo, const std::vect return false; } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////下载成功通知 //提取下载路径的文件名 std::string extract_filename1(const std::string& path) { @@ -3078,27 +3089,47 @@ bool SendAllQvvrFiles(qvvr_file& qfile, std::string& out_wavepath) { } //文件下载结束接口 -bool update_qvvr_file_download(const std::string& filename_with_mac, const std::string& terminal_id) { - std::cout << "[update_qvvr_file_download] filename_with_mac=" << filename_with_mac - << " terminal_id=" << terminal_id << std::endl; +bool update_qvvr_file_download(const std::string& filename_with_mac_in, const std::string& terminal_id) { + + // ★ 先把原始入参清洗 + std::string filename_with_mac = sanitize(filename_with_mac_in); + + std::cout << "[update_qvvr_file_download] raw=" << filename_with_mac_in + << " | sanitized=" << filename_with_mac + << " | terminal_id=" << terminal_id << std::endl; //台账加锁 std::lock_guard lock(ledgermtx); // 去除 mac 路径前缀,仅保留文件名 - std::string filename = extract_filename1(filename_with_mac); + std::string filename = sanitize(extract_filename1(filename_with_mac)); - // 提取逻辑序号(如 PQM1 → 1) - size_t under_pos = filename.find('_'); - if (under_pos == std::string::npos) return false; + // 提取逻辑序号(如 PQ_PQLD1 → 1) + size_t under_pos1 = filename.find('_'); + if (under_pos1 == std::string::npos) { + std::cout << "[DEBUG] 未找到 '_',filename=" << filename + << ",under_pos=npos,返回 false\n"; + return false; + } + size_t under_pos2 = filename.find('_', under_pos1 + 1); + std::string type_part = (under_pos2 == std::string::npos) + ? filename.substr(0, under_pos1) // 兜底:只有一个下划线 + : filename.substr(0, under_pos2); // 取到第二个下划线(得到 PQ_PQLD1) + std::cout << "[DEBUG] type_part=" << type_part + << " (under_pos1=" << under_pos1 + << ", under_pos2=" << under_pos2 << ")\n"; - std::string type_part = filename.substr(0, under_pos); // PQMonitor_PQM1 size_t num_start = type_part.find_last_not_of("0123456789"); - if (num_start == std::string::npos || num_start + 1 >= type_part.size()) return false; - + if (num_start == std::string::npos || num_start + 1 >= type_part.size()) { + std::cout << "[DEBUG] 数字起始位置异常:num_start=" << num_start + << ",type_part.size()=" << type_part.size() + << ",type_part=\"" << type_part << "\",返回 false\n"; + return false; + } std::string seq_str = type_part.substr(num_start + 1); - ushort logical_seq = static_cast(std::stoi(seq_str)); // 逻辑序号 + unsigned short logical_seq = static_cast(std::stoul(seq_str)); + std::cout << "[DEBUG] 解析到 logical_seq=" << logical_seq << "\n"; //找终端 for (auto& dev : terminal_devlist) { @@ -3118,12 +3149,21 @@ bool update_qvvr_file_download(const std::string& filename_with_mac, const std:: // ★新增:不匹配时对比打印 std::cout << "[cmp-monitor-seq][NOT-MATCH]" << " monitor_id=" << monitor.monitor_id - << " seq_in_ledger=\"" << seq_str << "\"" + // ★ 这里之前打印的是 seq_str,容易误导。改为 ledger 的原始串: + << " seq_in_ledger_raw=\"" << monitor.logical_device_seq << "\"" << " parsed=" << monitor_seq << " target_seq=" << logical_seq << std::endl; continue; } + else{ + std::cout << "[cmp-monitor-seq][MATCH!!!]" + << " monitor_id=" << monitor.monitor_id + << " seq_in_ledger_raw=\"" << monitor.logical_device_seq << "\"" + << " parsed=" << monitor_seq + << " target_seq=" << logical_seq + << std::endl; + } } catch (const std::exception& e) { // ★新增:解析失败详细原因 std::cout << "[cmp-monitor-seq][PARSE-FAIL]" @@ -3162,7 +3202,7 @@ bool update_qvvr_file_download(const std::string& filename_with_mac, const std:: std::set s_name(qfile.file_name.begin(), qfile.file_name.end()); std::set s_down; for (const auto& path : qfile.file_download) { - s_down.insert(extract_filename1(path)); // 提取每个路径中的文件名 + s_down.insert(sanitize(extract_filename1(path))); // 提取每个路径中的文件名 } //打印s_name和s_down内容 @@ -4628,11 +4668,6 @@ void on_device_response_minimal(int response_code, } else { - // 准备日志用的 key - std::ostringstream mon_key_c, mon_key_d; - mon_key_c << "monitor." << matched_monitor->terminal_id << "." << matched_monitor->logical_device_seq << ".COM"; - mon_key_d << "monitor." << matched_monitor->terminal_id << "." << matched_monitor->logical_device_seq << ".DATA"; - // 2) 仅更新该监测点 recall_list 的首条,且要求处于 RUNNING if (!matched_monitor->recall_list.empty()) { RecallMonitor& front = matched_monitor->recall_list.front(); //取出首条 @@ -4651,7 +4686,7 @@ void on_device_response_minimal(int response_code, << " rc=" << response_code << std::endl; //错误响应码 //记录日志 - DIY_ERRORLOG_CODE(mon_key_d.str().c_str(),static_cast(LogCode::LOG_CODE_RECALL),"【ERROR】监测点:%s 补招数据失败 - 失败时间点:%lld 至 %lld",mon_key_d.str().c_str(),front.StartTime,front.EndTime); + DIY_ERRORLOG_CODE(matched_monitor->monitor_id.c_str(),2,static_cast(LogCode::LOG_CODE_RECALL),"【ERROR】监测点:%s 补招数据失败 - 失败时间点:%lld 至 %lld",matched_monitor->monitor_id.c_str(),front.StartTime,front.EndTime); } updated = true; } else { //首条不是 RUNNING 状态,不应该收到这条响应 @@ -4902,6 +4937,157 @@ void on_device_response_minimal(int response_code, } } +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////记录暂态事件到本地 +// 将一条暂态数据更新/写入到指定终端ID与逻辑序号的监测点 +// 返回 true 表示已写入(更新或追加),false 表示未找到对应终端/监测点。 + +bool append_qvvr_event(const std::string& terminal_id, + int logical_seq, // 监测点序号(如 1) + int nType, // 事件类型 + double fPersisstime_sec, // 持续时间(秒) + double fMagnitude_pu, // 幅值(pu) + uint64_t triggerTimeMs, // 触发时间(毫秒) + int phase) // 相别 +{ + std::cout << "[append_qvvr_event] enter" + << " tid=" << std::this_thread::get_id() + << " terminal_id=" << terminal_id + << " logical_seq=" << logical_seq + << " type=" << nType + << " per_s=" << fPersisstime_sec + << " mag_pu=" << fMagnitude_pu + << " time_ms=" << static_cast(triggerTimeMs) + << " phase=" << phase + << std::endl; + + std::lock_guard lk(ledgermtx); + std::cout << "[append_qvvr_event] lock acquired. terminal_devlist.size=" + << terminal_devlist.size() << std::endl; + + // 1) 找终端 + auto dev_it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), + [&](const terminal_dev& d){ return d.terminal_id == terminal_id; }); + + if (dev_it == terminal_devlist.end()) { + std::cout << "[append_qvvr_event][MISS] terminal not found: " + << terminal_id << std::endl; + return false; + } + std::cout << "[append_qvvr_event][HIT] terminal_id=" << terminal_id + << " monitors(line).size=" << dev_it->line.size() + << std::endl; + + // 2) 找监测点(按逻辑序号匹配:字符串等于 或 数值等于) + ledger_monitor* pMon = nullptr; + for (size_t i = 0; i < dev_it->line.size(); ++i) { + auto& m = dev_it->line[i]; + bool eq_str = (m.logical_device_seq == std::to_string(logical_seq)); + bool eq_num = false; + try { + if (!m.logical_device_seq.empty()) + eq_num = (std::stoi(m.logical_device_seq) == logical_seq); + } catch (...) { + // 仅调试提示,不改变原逻辑 + std::cout << "[append_qvvr_event][monitor #" << i + << "] stoi fail, logical_device_seq=\"" + << m.logical_device_seq << "\"" << std::endl; + } + + std::cout << "[append_qvvr_event][probe monitor #" << i + << "] monitor_id=" << m.monitor_id + << " logical_device_seq=\"" << m.logical_device_seq << "\"" + << " eq_str=" << eq_str << " eq_num=" << eq_num << std::endl; + + if (eq_str || eq_num) { pMon = &m; break; } + } + + if (!pMon) { + std::cout << "[append_qvvr_event][MISS] monitor not found by seq=" + << logical_seq << " in terminal_id=" << terminal_id << std::endl; + return false; + } + std::cout << "[append_qvvr_event][HIT] monitor_id=" << pMon->monitor_id + << " logical_device_seq=" << pMon->logical_device_seq + << " qvvrdata.size=" << pMon->qvvrevent.qvvrdata.size() + << std::endl; + + qvvr_event& qe = pMon->qvvrevent; + + // 3) 先尝试“就地更新”(同类型 + 同时间戳 视为同一事件) + for (size_t i = 0; i < qe.qvvrdata.size(); ++i) { + auto& q = qe.qvvrdata[i]; + if (q.QVVR_type == nType && q.QVVR_time == triggerTimeMs) { + std::cout << "[append_qvvr_event][UPDATE match idx=" << i << "]" + << " old{used=" << q.used_status + << ", per=" << q.QVVR_PerTime + << ", mag=" << q.QVVR_Amg + << ", phase=" << q.phase + << "} -> new{used=true" + << ", per=" << fPersisstime_sec + << ", mag=" << fMagnitude_pu + << ", phase=" << phase + << "}" << std::endl; + + q.used_status = true; + q.QVVR_PerTime = fPersisstime_sec; + q.QVVR_Amg = fMagnitude_pu; + q.phase = phase; + + std::cout << "[append_qvvr_event] done(update)." + << std::endl; + return true; + } + } + + // 4) 复用空槽(used_status=false) + for (size_t i = 0; i < qe.qvvrdata.size(); ++i) { + auto& q = qe.qvvrdata[i]; + if (!q.used_status) { + std::cout << "[append_qvvr_event][REUSE idx=" << i << "]" + << " set{type=" << nType + << ", time_ms=" << static_cast(triggerTimeMs) + << ", per=" << fPersisstime_sec + << ", mag=" << fMagnitude_pu + << ", phase=" << phase + << "}" << std::endl; + + q.used_status = true; + q.QVVR_type = nType; + q.QVVR_time = triggerTimeMs; + q.QVVR_PerTime = fPersisstime_sec; + q.QVVR_Amg = fMagnitude_pu; + q.phase = phase; + + std::cout << "[append_qvvr_event] done(reuse)." + << std::endl; + return true; + } + } + + // 5) 直接追加 + qvvr_data q{}; + q.used_status = true; + q.QVVR_type = nType; + q.QVVR_time = triggerTimeMs; // ms + q.QVVR_PerTime = fPersisstime_sec; // s + q.QVVR_Amg = fMagnitude_pu; + q.phase = phase; + qe.qvvrdata.push_back(q); + + std::cout << "[append_qvvr_event][PUSH_BACK]" + << " new_size=" << qe.qvvrdata.size() + << " last_idx=" << (qe.qvvrdata.empty() ? -1 : (int)qe.qvvrdata.size()-1) + << " {type=" << nType + << ", time_ms=" << static_cast(triggerTimeMs) + << ", per=" << fPersisstime_sec + << ", mag=" << fMagnitude_pu + << ", phase=" << phase + << "}" << std::endl; + + std::cout << "[append_qvvr_event] done(push_back)." + << std::endl; + return true; +} diff --git a/LFtid1056/cloudfront/code/interface.cpp b/LFtid1056/cloudfront/code/interface.cpp index 06a3e9a..eae6bf3 100644 --- a/LFtid1056/cloudfront/code/interface.cpp +++ b/LFtid1056/cloudfront/code/interface.cpp @@ -1176,14 +1176,22 @@ static void scanAndResendOfflineFiles(const std::string& dirPath) } } +// 0->"A", 1->"B", 2->"C", 3->"AB", 4->"BC", 5->"CA", 6/其它->"ABC" +inline std::string phase_to_text(int phase) { + switch (phase) { + case 0: return "A"; + case 1: return "B"; + case 2: return "C"; + case 3: return "AB"; + case 4: return "BC"; + case 5: return "CA"; + default: return "ABC"; // 包含 6 和其他任何值 + } +} + int transfer_json_qvvr_data(const std::string& dev_id, ushort monitor_id, double mag, double dur, long long start_tm, int dis_kind,int phase, const std::string& wavepath) { - - // 监测点日志的 key, lnk20250526 - std::string full_key_m_c = "monitor." + dev_id + "." + std::to_string(monitor_id) + ".COM"; - std::string full_key_m_d = "monitor." + dev_id + "." + std::to_string(monitor_id) + ".DATA"; - // 监测点日志的 key, lnk20250526 if (dev_id.empty()) { std::cout << "qvvr send error ,dev_id is null" << std::endl; @@ -1219,8 +1227,8 @@ int transfer_json_qvvr_data(const std::string& dev_id, ushort monitor_id, std::string start_time_str = start_time_stream.str(); root["startTime"] = start_time_str; - root["wavePath"] = wavepath; - root["phase"] = phase; + root["wavePath"] = wavepath; + root["phase"] = phase_to_text(phase); std::string json_string = root.dump(4); @@ -1237,7 +1245,7 @@ int transfer_json_qvvr_data(const std::string& dev_id, ushort monitor_id, // 有效响应,略过 } catch (...) { // 响应异常,保存 json - DIY_ERRORLOG(full_key_m_d.c_str(), "【ERROR】暂态接口响应异常,无法上送装置%s监测点%s的暂态事件",dev_id, monitor_id); + DIY_ERRORLOG(mpid.c_str(), "【ERROR】暂态接口响应异常,无法上送装置%s监测点%s的暂态事件",dev_id, monitor_id); std::cout << "qvvr send fail ,store in local" << std::endl; std::string qvvrDir = FRONT_PATH + "/dat/qvvr/"; @@ -1247,7 +1255,7 @@ int transfer_json_qvvr_data(const std::string& dev_id, ushort monitor_id, } } else { // 无响应,保存 json - DIY_ERRORLOG(full_key_m_d.c_str(), "【ERROR】暂态接口无响应,无法上送装置%s监测点%s的暂态事件",dev_id, monitor_id); + DIY_ERRORLOG(mpid.c_str(), "【ERROR】暂态接口无响应,无法上送装置%s监测点%s的暂态事件",dev_id, monitor_id); std::cout << "qvvr send fail ,store in local" << std::endl; std::string qvvrDir = FRONT_PATH + "/dat/qvvr/"; diff --git a/LFtid1056/cloudfront/code/interface.h b/LFtid1056/cloudfront/code/interface.h index 6ac301a..357e40f 100644 --- a/LFtid1056/cloudfront/code/interface.h +++ b/LFtid1056/cloudfront/code/interface.h @@ -591,6 +591,13 @@ std::string generate_json( //构造装置主动上送数据的报文 ); //暂态事件接口 +bool append_qvvr_event(const std::string& terminal_id, + int logical_seq, // 监测点序号(如 1) + int nType, // 事件类型 + double fPersisstime_sec, // 持续时间(秒) + double fMagnitude_pu, // 幅值(pu) + uint64_t triggerTimeMs, // 触发时间(毫秒) + int phase); int transfer_json_qvvr_data(const std::string& dev_id, ushort monitor_id, double mag, double dur, long long start_tm, int dis_kind,int phase, const std::string& wavepath); @@ -682,6 +689,18 @@ inline std::string trim_cstr(const char* s, size_t n) { return out; } +inline std::string sanitize(std::string s) { + // 截断第一个 NUL 及其后内容 + size_t z = s.find('\0'); + if (z != std::string::npos) s.erase(z); + // 去掉尾部不可打印字符(含 \r \n 等) + while (!s.empty()) { + unsigned char c = static_cast(s.back()); + if (c >= 32 && c != 127) break; + s.pop_back(); + } + return s; +} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// extern int g_front_seg_index; extern std::string FRONT_IP; diff --git a/LFtid1056/cloudfront/code/log4.cpp b/LFtid1056/cloudfront/code/log4.cpp index 9184ee0..3c26009 100644 --- a/LFtid1056/cloudfront/code/log4.cpp +++ b/LFtid1056/cloudfront/code/log4.cpp @@ -152,8 +152,6 @@ protected: << "\",\"businessId\":\"" << extract_logger_id(logger_name) << "\",\"level\":\"" << level_str << "\",\"grade\":\"" << get_level_str(level) - << "\",\"logtype\":\"" << (logtype == LOGTYPE_COM ? "com" : "data") - << "\",\"frontType\":\"" << "cloudfront" // ★新增:输出 code 字段(整型) << "\",\"code\":\"" << code << "\",\"log\":\"" << escape_json(msg) << "\"}"; @@ -311,12 +309,10 @@ void init_loggers_bydevid(const std::string& dev_id) std::string ip_str = term.addr_str.empty() ? "unknown" : term.addr_str; std::string device_dir = base_dir + "/" + ip_str; - std::string device_key_c = std::string("terminal.") + dev_id + ".COM"; - std::string device_key_d = std::string("terminal.") + dev_id + ".DATA"; + std::string device_key = std::string("terminal.") + dev_id; // 添加判断:终端日志 logger 是否已存在 - if (logger_map.find(device_key_c) == logger_map.end() && - logger_map.find(device_key_d) == logger_map.end()) { + if (logger_map.find(device_key) == logger_map.end()) { // 所有终端日志(com 和 data)写到同一个 device 日志文件中 std::string file_path_t = device_dir + "/" + dev_id + ".log"; @@ -325,27 +321,23 @@ void init_loggers_bydevid(const std::string& dev_id) SharedAppenderPtr device_appender(new RollingFileAppender(file_path_t, 1 * 1024 * 1024, 2)); device_appender->setLayout(std::unique_ptr(new PatternLayout("%D{%Y-%m-%d %H:%M:%S} [%p] [%c] %m%n"))); - Logger device_logger_c = init_logger(device_key_c, device_dir, dev_id, device_appender); - Logger device_logger_d = init_logger(device_key_d, device_dir, dev_id, device_appender); - logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM); - logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA); + Logger device_logger = init_logger(device_key, device_dir, dev_id, device_appender); + logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA); - DIY_WARNLOG(device_key_d.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str()); + DIY_WARNLOG(dev_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str()); } // 初始化监测点日志,monitor..COM / .DATA for (size_t j = 0; j < term.line.size(); ++j) { const ledger_monitor& monitor = term.line[j]; if (!monitor.monitor_id.empty()) { - std::ostringstream mon_key_c, mon_key_d, mon_path, mon_name; - mon_key_c << "monitor." << term.terminal_id << "." << monitor.logical_device_seq << ".COM"; - mon_key_d << "monitor." << term.terminal_id << "." << monitor.logical_device_seq << ".DATA"; + std::ostringstream mon_key, mon_path, mon_name; + mon_key << "monitor." << monitor.monitor_id; mon_path << device_dir << "/monitor" << j; mon_name << monitor.monitor_id; // 判断监测点 logger 是否已存在 - if (logger_map.find(mon_key_c.str()) == logger_map.end() && - logger_map.find(mon_key_d.str()) == logger_map.end()) { + if (logger_map.find(mon_key.str()) == logger_map.end()) { // 所有监测点日志(com 和 data)写到同一个 monitor 日志文件中 std::string file_path_m = mon_path.str() + "/" + mon_name.str() + ".log"; @@ -354,12 +346,10 @@ void init_loggers_bydevid(const std::string& dev_id) SharedAppenderPtr monitor_appender(new RollingFileAppender(file_path_m, 1 * 1024 * 1024, 2)); monitor_appender->setLayout(std::unique_ptr(new PatternLayout("%D{%Y-%m-%d %H:%M:%S} [%p] [%c] %m%n"))); - Logger mon_logger_c = init_logger(mon_key_c.str(), mon_path.str(), mon_name.str(), monitor_appender); - Logger mon_logger_d = init_logger(mon_key_d.str(), mon_path.str(), mon_name.str(), monitor_appender); - logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM); - logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA); + Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(), monitor_appender); + logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA); - DIY_WARNLOG(mon_key_d.str().c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str()); + DIY_WARNLOG(monitor.monitor_id.c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str()); } } } @@ -386,8 +376,7 @@ void init_loggers() std::string ip_str = term.addr_str.empty() ? "unknown" : term.addr_str; std::string device_dir = base_dir + "/" + ip_str; - std::string device_key_c = std::string("terminal.") + term.terminal_id + ".COM"; - std::string device_key_d = std::string("terminal.") + term.terminal_id + ".DATA"; + std::string device_key = std::string("terminal.") + term.terminal_id; // 所有终端日志(com 和 data)写到同一个 device 日志文件中 std::string file_path_t = device_dir + "/" + term.terminal_id + ".log"; @@ -396,22 +385,19 @@ void init_loggers() SharedAppenderPtr device_appender(new RollingFileAppender(file_path_t, 1 * 1024 * 1024, 2)); device_appender->setLayout(std::unique_ptr(new PatternLayout("%D{%Y-%m-%d %H:%M:%S} [%p] [%c] %m%n"))); - Logger device_logger_c = init_logger(device_key_c, device_dir, term.terminal_id, device_appender); - Logger device_logger_d = init_logger(device_key_d, device_dir, term.terminal_id, device_appender); + Logger device_logger = init_logger(device_key, device_dir, term.terminal_id, device_appender); - logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM); - logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA); + logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA); - DIY_WARNLOG(device_key_d.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str()); + DIY_WARNLOG(term.terminal_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str()); // 初始化监测点日志 for (size_t i = 0; i < term.line.size(); ++i) { const ledger_monitor& monitor = term.line[i]; if (!monitor.monitor_id.empty()) { - std::ostringstream mon_key_c, mon_key_d, mon_path, mon_name; - mon_key_c << "monitor." << term.terminal_id << "." << monitor.logical_device_seq << ".COM"; - mon_key_d << "monitor." << term.terminal_id << "." << monitor.logical_device_seq << ".DATA"; + std::ostringstream mon_key, mon_path, mon_name; + mon_key << "monitor." << monitor.monitor_id; mon_path << device_dir << "/monitor" << i; // 用monitor+序号作为目录 mon_name << monitor.monitor_id; @@ -422,13 +408,11 @@ void init_loggers() SharedAppenderPtr monitor_appender(new RollingFileAppender(file_path_m, 1 * 1024 * 1024, 2)); monitor_appender->setLayout(std::unique_ptr(new PatternLayout("%D{%Y-%m-%d %H:%M:%S} [%p] [%c] %m%n"))); - Logger mon_logger_c = init_logger(mon_key_c.str(), mon_path.str(), mon_name.str(), monitor_appender); - Logger mon_logger_d = init_logger(mon_key_d.str(), mon_path.str(), mon_name.str(), monitor_appender); + Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(), monitor_appender); - logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM); - logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA); + logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA); - DIY_WARNLOG(mon_key_d.str().c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", + DIY_WARNLOG(mon_key.str().c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str()); } } @@ -443,17 +427,11 @@ void remove_loggers_by_terminal_id(const std::string& terminal_id) { if (term.terminal_id != terminal_id) continue; // 删除终端日志 logger - std::string com_key = "terminal." + terminal_id + ".COM"; - std::string data_key = "terminal." + terminal_id + ".DATA"; + std::string terminal_key = "terminal." + terminal_id; - if (logger_map.count(com_key)) { - logger_map[com_key].logger.removeAllAppenders(); - logger_map.erase(com_key); - } - - if (logger_map.count(data_key)) { - logger_map[data_key].logger.removeAllAppenders(); - logger_map.erase(data_key); + if (logger_map.count(terminal_key)) { + logger_map[terminal_key].logger.removeAllAppenders(); + logger_map.erase(terminal_key); } // 删除监测点日志 logger @@ -461,18 +439,13 @@ void remove_loggers_by_terminal_id(const std::string& terminal_id) { const ledger_monitor& monitor = term.line[i]; if (!monitor.monitor_id.empty()) { std::string mon_prefix = "monitor." + monitor.monitor_id; - std::string mon_com_key = mon_prefix + ".COM"; - std::string mon_data_key = mon_prefix + ".DATA"; + std::string mon_key = mon_prefix; - if (logger_map.count(mon_com_key)) { - logger_map[mon_com_key].logger.removeAllAppenders(); - logger_map.erase(mon_com_key); + if (logger_map.count(mon_key)) { + logger_map[mon_key].logger.removeAllAppenders(); + logger_map.erase(mon_key); } - if (logger_map.count(mon_data_key)) { - logger_map[mon_data_key].logger.removeAllAppenders(); - logger_map.erase(mon_data_key); - } } } diff --git a/LFtid1056/cloudfront/code/log4.h b/LFtid1056/cloudfront/code/log4.h index 5e05682..d9d620c 100644 --- a/LFtid1056/cloudfront/code/log4.h +++ b/LFtid1056/cloudfront/code/log4.h @@ -105,44 +105,6 @@ void format_log_msg(char* buf, size_t buf_size, const char* fmt, ...); // ====================== ★新增结束 ====================== - -// ====================== 日志宏区域 ====================== -// 原始不带 code 的实现(兼容/复用) -#define DIY_LOG(LEVEL_FUNC, KEY, ...) \ - do { \ - char buf[256]; \ - format_log_msg(buf, sizeof(buf), __VA_ARGS__); \ - LEVEL_FUNC(KEY, buf); \ - } while (0) - -// ★新增:带 code 的实现(C/C++ 通用,使用 TLS 保存/恢复) -#define DIY_LOG_CODE(LEVEL_FUNC, KEY, CODE_INT, ...) \ - do { \ - int __old_code__ = g_log_code_tls; /* 备份旧值 */ \ - g_log_code_tls = (int)(CODE_INT); /* 设置本次日志 code */ \ - char buf[256]; \ - format_log_msg(buf, sizeof(buf), __VA_ARGS__); \ - LEVEL_FUNC(KEY, buf); /* 输出日志 */ \ - g_log_code_tls = __old_code__; /* 恢复旧值 */ \ - } while (0) - -// ★修改:默认宏改为 code=0(兼容原有用法) -#define DIY_ERRORLOG(KEY, ...) DIY_LOG_CODE(log_error, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0 -#define DIY_WARNLOG(KEY, ...) DIY_LOG_CODE(log_warn, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0 -#define DIY_INFOLOG(KEY, ...) DIY_LOG_CODE(log_info, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0 -#define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0 - -// ★新增:显式传入 code 的便捷宏 -// 用法示例:DIY_WARNLOG_CODE(full_key_m_c, warn_recallstart, "【WARN】监测点:%s ...", ...); -#define DIY_ERRORLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_error, KEY, CODE_INT, __VA_ARGS__) // ★新增 -#define DIY_WARNLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, CODE_INT, __VA_ARGS__) // ★新增 -#define DIY_INFOLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, CODE_INT, __VA_ARGS__) // ★新增 -#define DIY_DEBUGLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_debug, KEY, CODE_INT, __VA_ARGS__) // ★新增 - - -// ====================== 日志宏区域 ====================== - - typedef enum LogCode { LOG_CODE_OTHER = 99, /* 其他类型 */ LOG_CODE_LEDGER = 100, /* 台账类型 */ @@ -162,6 +124,73 @@ typedef enum LogCode { LOG_CODE_SPACE_ALARM = 700 /* 空间告警 */ } LogCode; +// ====================== 日志宏区域 ====================== +// 原始不带 code 的实现(兼容/复用) +#define DIY_LOG(LEVEL_FUNC, KEY, ...) \ + do { \ + char buf[256]; \ + format_log_msg(buf, sizeof(buf), __VA_ARGS__); \ + LEVEL_FUNC(KEY, buf); \ + } while (0) + +// ★新增:带 code 的实现(C/C++ 通用,使用 TLS 保存/恢复) +#define DIY_LOG_CODE(LEVEL_FUNC, KEY, LEVEL_INT, CODE_INT, ...) \ + do { \ + /* 备份并设置本次日志 code */ \ + int __old_code__ = g_log_code_tls; \ + g_log_code_tls = static_cast(CODE_INT); \ + \ + /* 组装消息 */ \ + char __msg_buf__[256]; \ + format_log_msg(__msg_buf__, sizeof(__msg_buf__), __VA_ARGS__); \ + \ + /* 将 KEY 规范化为字符串(兼容 const char* / std::string 等) */ \ + std::ostringstream __oss_key__; \ + __oss_key__ << (KEY); \ + std::string __key_raw__ = __oss_key__.str(); \ + \ + /* 根据 LEVEL_INT 构造最终 key */ \ + char __key_buf__[256]; \ + switch (static_cast(LEVEL_INT)) { \ + case 0: \ + std::snprintf(__key_buf__, sizeof(__key_buf__), "process"); \ + break; \ + case 1: \ + std::snprintf(__key_buf__, sizeof(__key_buf__), \ + "terminal.%s", __key_raw__.c_str()); \ + break; \ + case 2: \ + std::snprintf(__key_buf__, sizeof(__key_buf__), \ + "monitor.%s", __key_raw__.c_str()); \ + break; \ + default: \ + std::snprintf(__key_buf__, sizeof(__key_buf__), "%s", \ + __key_raw__.c_str()); \ + break; \ + } \ + \ + /* 输出日志 */ \ + LEVEL_FUNC(__key_buf__, __msg_buf__); \ + \ + /* 恢复旧值 */ \ + g_log_code_tls = __old_code__; \ + } while (0) + +// ★修改:默认宏改为 code=0(兼容原有用法) +#define DIY_ERRORLOG(KEY, ...) DIY_LOG_CODE(log_error, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0 +#define DIY_WARNLOG(KEY, ...) DIY_LOG_CODE(log_warn, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0 +#define DIY_INFOLOG(KEY, ...) DIY_LOG_CODE(log_info, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0 +#define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, LOG_CODE_OTHER,__VA_ARGS__) // ★修改:默认 code=0 + +// ★新增:显式传入 code 的便捷宏 +// 用法示例:DIY_WARNLOG_CODE(full_key_m_c, warn_recallstart, "【WARN】监测点:%s ...", ...); +#define DIY_ERRORLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_error, KEY,LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增 +#define DIY_WARNLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增 +#define DIY_INFOLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增 +#define DIY_DEBUGLOG_CODE(KEY, LEVEL_INT,CODE_INT, ...) DIY_LOG_CODE(log_debug, KEY, LEVEL_INT, CODE_INT, __VA_ARGS__) // ★新增 + + +// ====================== 日志宏区域 ====================== #ifdef __cplusplus } diff --git a/LFtid1056/cloudfront/code/log4cplus/log4.h b/LFtid1056/cloudfront/code/log4cplus/log4.h deleted file mode 100644 index ecab730..0000000 --- a/LFtid1056/cloudfront/code/log4cplus/log4.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef LOG4_H -#define LOG4_H - -#ifdef __cplusplus - -#include -#include - -//防止#include 里的冲突 -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif -//防止#include 里的冲突 - -#include "logger.h" -#include -#include "loggingmacros.h" - -#include "appender.h" - -#define LOGTYPE_COM 1 -#define LOGTYPE_DATA 2 - -struct TypedLogger { - log4cplus::Logger logger; - int logtype; - TypedLogger(); - TypedLogger(const log4cplus::Logger& l, int t); -}; - -struct DebugSwitch { - bool debug_open; - std::set targets; - int min_level; - std::map type_enable; - - DebugSwitch(); - void open(); - void close(); - void set_target(const std::string& name); - void set_level(int level); - void enable_type(int type); - void disable_type(int type); - bool match(const std::string& logger_name, int level, int logtype); -}; - -extern std::map logger_map; -extern DebugSwitch g_debug_switch; - -extern void send_reply_to_queue(const std::string& guid, const std::string& step, const std::string& result); - - -//std::string get_front_type_from_subdir(); - - -// 不带 Appender 的版本 -log4cplus::Logger init_logger(const std::string& full_name, - const std::string& file_dir, - const std::string& base_file); - -// 带 Appender 的版本 -log4cplus::Logger init_logger(const std::string& full_name, - const std::string& file_dir, - const std::string& base_file, - log4cplus::SharedAppenderPtr fileAppender); - -void process_log_command(const std::string& id, const std::string& level, const std::string& grade, const std::string& logtype_str); - - -void update_log_entries_countdown(); - -extern "C" { -#endif -void remove_loggers_by_terminal_id(const std::string& terminal_id_cstr); -void init_logger_process(); -void init_loggers(); -void init_loggers_bydevid(const std::string& dev_id); - -void log_debug(const char* key, const char* msg); -void log_info(const char* key, const char* msg); -void log_warn(const char* key, const char* msg); -void log_error(const char* key, const char* msg); - -void send_reply_to_queue_c(const char* guid, const char* step, const char* result); -void format_log_msg(char* buf, size_t buf_size, const char* fmt, ...); - -//宏定义 -#define DIY_LOG(LEVEL_FUNC, KEY, ...) \ - do { \ - char buf[256]; \ - format_log_msg(buf, sizeof(buf), __VA_ARGS__); \ - LEVEL_FUNC(KEY, buf); \ - } while (0) - -#define DIY_ERRORLOG(KEY, ...) DIY_LOG(log_error, KEY, __VA_ARGS__) -#define DIY_WARNLOG(KEY, ...) DIY_LOG(log_warn, KEY, __VA_ARGS__) -#define DIY_INFOLOG(KEY, ...) DIY_LOG(log_info, KEY, __VA_ARGS__) -#define DIY_DEBUGLOG(KEY, ...) DIY_LOG(log_debug, KEY, __VA_ARGS__) - - -#ifdef __cplusplus -} -#endif - - - -#endif // LOG4_H diff --git a/LFtid1056/config/front.cfg b/LFtid1056/config/front.cfg index 7636207..efcb06a 100644 --- a/LFtid1056/config/front.cfg +++ b/LFtid1056/config/front.cfg @@ -15,7 +15,7 @@ RT_TAG=rt RT_KEY=rt [Flag] -FrontInst= +FrontInst=914b94563ca7f272c90ee8580ed6adc6 FrontIP=192.168.1.138 [Ledger] @@ -33,7 +33,7 @@ WebFiledownload= [RocketMq] producer=Group_producer -Ipport=192.168.1.24:9876 +Ipport=192.168.1.103:9876 AccessKey=rmqroot SecretKey=001@#njcnmq @@ -44,10 +44,10 @@ Testflag=1 Testnum=0 Testtype=0 TestPort=11000 -TestList=8ad28e2e36dfbd19906f9e2a4894b375 +TestList= consumer=Group_consumer -ConsumerIpport=192.168.1.24:9876 +ConsumerIpport=192.168.1.103:9876 ConsumerTopicRT=ask_real_data_topic ConsumerTagRT=Test_Tag ConsumerKeyRT=Test_Keys diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index 4326d5e..39bfb51 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -163,6 +163,8 @@ void process_received_message(string mac, string id,const char* data, size_t len << ", ʱ: " << record.triggerTimeMs << "ms" << std::endl; //lnk20250805 ¼ȼ¼¼ļϴٸļ + append_qvvr_event(id,event.head.name, + record.nType,record.fPersisstime,record.fMagntitude,record.triggerTimeMs,record.phase); transfer_json_qvvr_data(id,event.head.name, record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase, "");