modify log4 function and add data trace function
This commit is contained in:
@@ -25,6 +25,18 @@
|
||||
#include "../json/cjson.h"
|
||||
|
||||
#include "../log4cplus/log4.h"//lnk添加log4
|
||||
|
||||
///////////////////////////////////////////////////////////////////////lnk20260305数据追踪相关
|
||||
#include <QHash>
|
||||
#include <QMutex>
|
||||
#include <QMutexLocker>
|
||||
#include <QMapIterator>
|
||||
#include <QStringList>
|
||||
|
||||
// ★MOD: 全局追踪表:mp_id -> remaining times
|
||||
static QMutex g_trace_mutex;
|
||||
static QHash<QString, int> g_trace_map;
|
||||
|
||||
///////////////////////////////////////////////////lnk2024-10-21////////////////////////////////////////////////////////
|
||||
extern void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::string& json, char** ptr);
|
||||
extern std::string WEB_INTEGRITY;
|
||||
@@ -230,7 +242,106 @@ extern int isdelta_flag;//lnk2024-8-16 角型接线标志
|
||||
void connectlog_pgsql(char* id,char* datetime,int status);
|
||||
///////////////////////////////////////////////lnk20241021替换web接口//////////////////////////////////
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////lnk20260305数据追踪
|
||||
static QString escape_json_string(const QString& s)
|
||||
{
|
||||
QString out = s;
|
||||
out.replace("\\", "\\\\");
|
||||
out.replace("\"", "\\\"");
|
||||
out.replace("\r", "\\r");
|
||||
out.replace("\n", "\\n");
|
||||
out.replace("\t", "\\t");
|
||||
return out;
|
||||
}
|
||||
|
||||
// 打开追踪:次数 times(比如 5)
|
||||
void process_trace_command(const std::string& id, int times)
|
||||
{
|
||||
if (times <= 0) return;
|
||||
QString qid = QString::fromStdString(id).trimmed();
|
||||
if (qid.isEmpty()) return;
|
||||
|
||||
QMutexLocker lk(&g_trace_mutex);
|
||||
g_trace_map[qid] = times; // 重新打开就覆盖/重置次数
|
||||
}
|
||||
|
||||
// 查询是否要追踪
|
||||
static bool trace_is_enabled(const QString& mp_id)
|
||||
{
|
||||
QMutexLocker lk(&g_trace_mutex);
|
||||
auto it = g_trace_map.constFind(mp_id);
|
||||
return (it != g_trace_map.constEnd() && it.value() > 0);
|
||||
}
|
||||
|
||||
// 命中一次并扣减;扣到 0 自动删
|
||||
static void trace_hit_and_decrement(const QString& mp_id)
|
||||
{
|
||||
QMutexLocker lk(&g_trace_mutex);
|
||||
auto it = g_trace_map.find(mp_id);
|
||||
if (it == g_trace_map.end()) return;
|
||||
|
||||
int left = it.value();
|
||||
left -= 1;
|
||||
if (left <= 0) g_trace_map.erase(it);
|
||||
else it.value() = left;
|
||||
}
|
||||
|
||||
//追踪61850原始数据
|
||||
static QString build_mms_multiline_text(const json_block_data* data)
|
||||
{
|
||||
QStringList lines;
|
||||
|
||||
QMapIterator<QString, double> it(data->mms_str_map);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
lines << QString("%1 = %2").arg(it.key()).arg(it.value(), 0, 'g', 15);
|
||||
}
|
||||
|
||||
return lines.join("\n");
|
||||
}
|
||||
|
||||
static QString build_trace_json(const json_block_data* data)
|
||||
{
|
||||
if (!data) return "{}";
|
||||
|
||||
QString mms_text = build_mms_multiline_text(data);
|
||||
|
||||
QString json;
|
||||
json += "{";
|
||||
json += QString("\"mp_id\":\"%1\",").arg(escape_json_string(data->mp_id));
|
||||
json += QString("\"func_type\":%1,").arg(data->func_type);
|
||||
json += QString("\"data_time\":%1,").arg(QString::number((qlonglong)data->time));
|
||||
json += QString("\"voltage_level\":\"%1\",").arg(QString::number(data->voltage_level, 'f', 6));
|
||||
json += QString("\"dev_type\":\"%1\",").arg(escape_json_string(data->dev_type));
|
||||
json += QString("\"mms_text\":\"%1\"").arg(escape_json_string(mms_text));
|
||||
json += "}";
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
static void send_trace_if_needed(json_block_data* pdata)
|
||||
{
|
||||
const QString mp_id_q = pdata->mp_id;
|
||||
if (trace_is_enabled(mp_id_q)) {
|
||||
|
||||
// 1) 组 json
|
||||
QString jsonText = build_trace_json(pdata);
|
||||
|
||||
// 2) 组 KafkaData
|
||||
Ckafka_data_t KafkaData;
|
||||
KafkaData.monitor_id = pdata->monitorId;
|
||||
KafkaData.mp_id = pdata->mp_id;
|
||||
KafkaData.strTopic = "DATA_TRACE_TOPIC";
|
||||
KafkaData.strText = jsonText;
|
||||
|
||||
kafka_data_list_mutex.lock();
|
||||
kafka_data_list.append(KafkaData);
|
||||
kafka_data_list_mutex.unlock();
|
||||
|
||||
// 3) 次数 -1
|
||||
trace_hit_and_decrement(mp_id_q);
|
||||
}
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////////////////lnk20250710添加频率值存储
|
||||
struct mp_freq_save {
|
||||
double G_FREQ;
|
||||
|
||||
@@ -41,6 +41,8 @@ public:
|
||||
bool data_have_statistic;//是否有统计数据,0没有,1有
|
||||
|
||||
QMap<QString, double> mms_str_map; //数据值(61850数据属性名, 数据值)
|
||||
|
||||
bool data_trace_flag; //数据追踪标记,0不追踪,1追踪
|
||||
};
|
||||
|
||||
class Ckafka_data_t //kafka发送数据结构类
|
||||
|
||||
@@ -1167,9 +1167,13 @@ std::string prepare_update(const std::string& code_str, const terminal& json_dat
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "<processNo>" << json_data.processNo << "</processNo>" << std::endl;
|
||||
|
||||
//lnk20250305
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl;
|
||||
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "<loglevel>" << json_data.log_level << "</loglevel>" << std::endl;
|
||||
|
||||
// monitorData 部分
|
||||
for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) {
|
||||
const monitor& monitor = json_data.line[i];
|
||||
@@ -1202,6 +1206,9 @@ std::string prepare_update(const std::string& code_str, const terminal& json_dat
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "<status>" << monitor.status << "</status>" << std::endl;
|
||||
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "<loglevel>" << monitor.log_level << "</loglevel>" << std::endl;
|
||||
|
||||
indentLevel--;
|
||||
add_indent(xmlStream, indentLevel);
|
||||
xmlStream << "</monitorData>" << std::endl;
|
||||
@@ -1376,7 +1383,7 @@ int parse_log(const std::string& json_str) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::string logtype = logtypestr->valuestring;
|
||||
int logtype = logtypestr->valueint;
|
||||
|
||||
// 获取 frontType 字段
|
||||
cJSON* frontTypestr = cJSON_GetObjectItem(messageBody, "frontType");
|
||||
@@ -1413,13 +1420,16 @@ int parse_log(const std::string& json_str) {
|
||||
//校验数据
|
||||
if((level == "terminal" || level == "measurepoint") &&
|
||||
(grade == "NORMAL" || grade == "DEBUG") &&
|
||||
(logtype == "com" || logtype == "data") &&
|
||||
(!id.empty() && !is_blank(id))){
|
||||
|
||||
//开启开关
|
||||
//开启日志临时开关
|
||||
process_log_command(id, level, grade, logtype);
|
||||
|
||||
}
|
||||
else if((level == "measurepoint") && (grade == "TRACE") && (!id.empty() && !is_blank(id))){ //数据追踪
|
||||
//打开监测点数据追踪开关
|
||||
process_trace_command(id,5); //5表示追踪次数
|
||||
}
|
||||
else{
|
||||
std::cout << "type doesnt match" <<std::endl;
|
||||
//记录warm
|
||||
@@ -1611,6 +1621,25 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
|
||||
else
|
||||
std::strncpy(json_data.timestamp, "N/A", sizeof(json_data.timestamp) - 1);
|
||||
|
||||
|
||||
//添加loglevel字段
|
||||
cJSON* loglevel = cJSON_GetObjectItem(item, "loglevel"); // log_level
|
||||
int tmp_level = -1;
|
||||
// 先读取 loglevel
|
||||
if (loglevel && loglevel->type == cJSON_Number) {
|
||||
tmp_level = loglevel->valueint;
|
||||
}
|
||||
else if (loglevel && loglevel->type == cJSON_String) {
|
||||
tmp_level = atoi(loglevel->valuestring);
|
||||
}
|
||||
// 判断是否合法 (0~3)
|
||||
if (tmp_level >= 0 && tmp_level <= 3) {
|
||||
json_data.log_level = tmp_level;
|
||||
} else {
|
||||
json_data.log_level = 1; // 默认日志级别
|
||||
}
|
||||
printf("terminal log_level: %d\n", json_data.log_level);
|
||||
|
||||
// monitorData 解析,填充到 line 数组中
|
||||
cJSON* monitorData = cJSON_GetObjectItem(item, "monitorData");
|
||||
if (monitorData != nullptr && monitorData->type == cJSON_Array) {
|
||||
@@ -1626,6 +1655,27 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
|
||||
else
|
||||
std::strncpy(monitor_data.monitor_id, "N/A", sizeof(monitor_data.monitor_id) - 1);
|
||||
|
||||
//添加loglevel字段
|
||||
cJSON* loglevel = cJSON_GetObjectItem(monitor_item, "loglevel"); // log_level
|
||||
int tmp_level = -1;
|
||||
// 先尝试读取 loglevel
|
||||
if (loglevel && loglevel->type == cJSON_Number) {
|
||||
tmp_level = loglevel->valueint;
|
||||
}
|
||||
else if (loglevel && loglevel->type == cJSON_String) {
|
||||
tmp_level = atoi(loglevel->valuestring);
|
||||
}
|
||||
// 判断是否合法 (0~3)
|
||||
if (tmp_level >= 0 && tmp_level <= 3) {
|
||||
monitor_data.log_level = tmp_level;
|
||||
}
|
||||
else if (json_data.log_level >= 0 && json_data.log_level <= 3) { // 继承 terminal loglevel
|
||||
monitor_data.log_level = json_data.log_level;
|
||||
}
|
||||
else {
|
||||
monitor_data.log_level = 1; // 默认 warn
|
||||
}
|
||||
|
||||
cJSON* monitor_name = cJSON_GetObjectItem(monitor_item, "name"); // monitor_name
|
||||
if (monitor_name && monitor_name->type == cJSON_String)
|
||||
std::strncpy(monitor_data.monitor_name, monitor_name->valuestring, sizeof(monitor_data.monitor_name) - 1);
|
||||
|
||||
@@ -670,6 +670,8 @@ struct monitor // 监测点台账
|
||||
char timestamp[64];
|
||||
char status[255];
|
||||
|
||||
int log_level;//日志级别,0:ERROR,1:WARN,2:NORMAL,3:DEBUG
|
||||
|
||||
};
|
||||
struct terminal // 终端台账
|
||||
{
|
||||
@@ -692,6 +694,7 @@ struct terminal // 终端台账
|
||||
char timestamp[64];
|
||||
monitor line[10]; // 最多 10 个监测点
|
||||
|
||||
int log_level;//日志级别,0:ERROR,1:WARN,2:NORMAL,3:DEBUG
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in New Issue
Block a user