fix mq config and log control
This commit is contained in:
@@ -54,6 +54,7 @@ extern std::string G_MQCONSUMER_TOPIC_UD;
|
|||||||
extern std::string G_MQCONSUMER_TOPIC_RT;
|
extern std::string G_MQCONSUMER_TOPIC_RT;
|
||||||
|
|
||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
|
extern bool DEBUGOPEN;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -417,6 +418,9 @@ public:
|
|||||||
// 设置 nameserver 地址
|
// 设置 nameserver 地址
|
||||||
SetProducerNameServerAddress(producer_, nameServer.c_str());
|
SetProducerNameServerAddress(producer_, nameServer.c_str());
|
||||||
|
|
||||||
|
//lnk20260417设置数据上送消息体最大值,默认4M,调整为1M,避免过大消息导致发送失败
|
||||||
|
SetProducerMaxMessageSize(producer_, 1024 * 1024); // 1MB
|
||||||
|
|
||||||
SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
||||||
|
|
||||||
// 启动生产者
|
// 启动生产者
|
||||||
@@ -457,6 +461,64 @@ public:
|
|||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
void sendMessage(const char* strbody, const char* topic, const std::string& tags, const std::string& keys) {
|
void sendMessage(const char* strbody, const char* topic, const std::string& tags, const std::string& keys) {
|
||||||
|
|
||||||
|
if (DEBUGOPEN) {
|
||||||
|
std::cout << "sendMessage called with topic: " << (topic ? topic : "NULL")
|
||||||
|
<< ", tags: " << tags
|
||||||
|
<< ", keys: " << keys
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
if (strbody) {
|
||||||
|
// ===== 1️⃣ 真实长度 vs strlen =====
|
||||||
|
std::string body_str(strbody);
|
||||||
|
|
||||||
|
std::cout << "[MQ][LEN_CHECK]"
|
||||||
|
<< " strlen=" << strlen(strbody)
|
||||||
|
<< ", std::string.size=" << body_str.size()
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
// ===== 2️⃣ 检测是否包含 \0 =====
|
||||||
|
bool has_null = false;
|
||||||
|
for (size_t i = 0; i < body_str.size(); i++) {
|
||||||
|
if (body_str[i] == '\0') {
|
||||||
|
has_null = true;
|
||||||
|
std::cout << "[MQ][FOUND_NULL] index=" << i << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << "[MQ][HAS_NULL] " << (has_null ? "YES" : "NO") << std::endl;
|
||||||
|
|
||||||
|
// ===== 3️⃣ 打印头部(可读)=====
|
||||||
|
size_t len = strlen(strbody);
|
||||||
|
size_t n = std::min((size_t)200, len);
|
||||||
|
|
||||||
|
std::cout << "[MQ][BODY_HEAD] "
|
||||||
|
<< std::string(strbody, n)
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
std::cout << "[MQ][BODY_TAIL] "
|
||||||
|
<< std::string(strbody + (len - n), n)
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
// ===== 4️⃣ 十六进制打印前100字节 =====
|
||||||
|
std::cout << "[MQ][HEX_HEAD] ";
|
||||||
|
for (size_t i = 0; i < std::min((size_t)100, body_str.size()); i++) {
|
||||||
|
printf("%02X ", (unsigned char)body_str[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
// ===== 5️⃣ 十六进制打印尾部100字节 =====
|
||||||
|
std::cout << "[MQ][HEX_TAIL] ";
|
||||||
|
size_t start = (body_str.size() > 100) ? body_str.size() - 100 : 0;
|
||||||
|
for (size_t i = start; i < body_str.size(); i++) {
|
||||||
|
printf("%02X ", (unsigned char)body_str[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
std::cout << "[MQ][ERROR] strbody is NULL" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CSendResult result;
|
CSendResult result;
|
||||||
CMessage* msg = NULL;
|
CMessage* msg = NULL;
|
||||||
|
|
||||||
@@ -481,6 +543,47 @@ public:
|
|||||||
RoundRobinSelector, // 队列选择器回调函数
|
RoundRobinSelector, // 队列选择器回调函数
|
||||||
&queueNum // 传递给选择器的额外参数(队列数量)
|
&queueNum // 传递给选择器的额外参数(队列数量)
|
||||||
);
|
);
|
||||||
|
/////////////////////////////////替换接口,性能较低但不影响
|
||||||
|
/*CSendResult result;
|
||||||
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
int sendResult = SendMessageOrderly(
|
||||||
|
producer_,
|
||||||
|
msg,
|
||||||
|
RoundRobinSelector,
|
||||||
|
&queueNum,
|
||||||
|
0, // autoRetryTimes
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
|
||||||
|
std::cout << "[MQ][ORDERLY_RESULT]"
|
||||||
|
<< " ret=" << sendResult
|
||||||
|
<< ", sendStatus=" << (int)result.sendStatus
|
||||||
|
<< ", msgId=" << result.msgId
|
||||||
|
<< ", offset=" << result.offset
|
||||||
|
<< ", topic=" << (topic ? topic : "")
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;*/
|
||||||
|
/////////////////////////////////替换接口,性能较低但不影响
|
||||||
|
// 发送消息:临时改成同步发送,绕过 orderly / selector,便于定位问题
|
||||||
|
/*CSendResult result;
|
||||||
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
int sendResult = SendMessageSync(
|
||||||
|
producer_,
|
||||||
|
msg,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
|
||||||
|
std::cout << "[MQ][SYNC_RESULT]"
|
||||||
|
<< " ret=" << sendResult
|
||||||
|
<< ", sendStatus=" << (int)result.sendStatus
|
||||||
|
<< ", msgId=" << result.msgId
|
||||||
|
<< ", offset=" << result.offset
|
||||||
|
<< ", topic=" << (topic ? topic : "")
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
|
<< std::endl;*/
|
||||||
|
// 发送消息:临时改成同步发送,绕过 orderly / selector,便于定位问题
|
||||||
|
|
||||||
if (sendResult == 0) { // 假设返回 0 表示成功
|
if (sendResult == 0) { // 假设返回 0 表示成功
|
||||||
std::cout << "[MQ][SEND_OK]"
|
std::cout << "[MQ][SEND_OK]"
|
||||||
@@ -490,13 +593,17 @@ public:
|
|||||||
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
std::cout << "[MQ][SEND_FAIL]"
|
std::cout << "[MQ][SEND_FAIL]"
|
||||||
<< " ret=" << sendResult
|
<< " ret=" << sendResult
|
||||||
<< ", topic=" << (topic ? topic : "")
|
<< ", topic=" << (topic ? topic : "")
|
||||||
<< ", tags=" << tags
|
<< ", tags=" << tags
|
||||||
<< ", keys=" << keys
|
<< ", keys=" << keys
|
||||||
|
<< ", body_len=" << (strbody ? strlen(strbody) : 0)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
|
std::cout << "[MQ][BODY_HEAD] " << std::string(strbody, std::min((size_t)200, strlen(strbody))) << std::endl;
|
||||||
|
std::cout << "[MQ][BODY_TAIL] " << std::string(strbody + std::max((size_t)0, strlen(strbody) - std::min((size_t)200, strlen(strbody)))) << std::endl;
|
||||||
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 销毁消息
|
// 销毁消息
|
||||||
|
|||||||
@@ -358,6 +358,14 @@ std::string WEB_EVENT = "";
|
|||||||
std::string WEB_FILEUPLOAD = "";
|
std::string WEB_FILEUPLOAD = "";
|
||||||
std::string WEB_FILEDOWNLOAD = "";
|
std::string WEB_FILEDOWNLOAD = "";
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
int G_LOG_RATE_RESET_SEC = 3600; // 1小时重置
|
||||||
|
int G_LOG_RATE_LIMIT_SEC = 60; // 进入限流后:60秒1条
|
||||||
|
int G_LOG_RATE_KEEP_ALL_MS = 60000; // 间隔 >= 60000ms,全部保留
|
||||||
|
int G_LOG_RATE_KEEP_BURST_MS = 1000; // 间隔 >= 1000ms,按二级策略
|
||||||
|
int G_LOG_RATE_KEEP_BURST_COUNT = 60; // 二级保留前60条
|
||||||
|
int G_LOG_RATE_KEEP_HIGHFREQ_COUNT = 10; // 高频保留前10条
|
||||||
|
|
||||||
//lnk20250115添加台账锁
|
//lnk20250115添加台账锁
|
||||||
extern pthread_mutex_t mtx;
|
extern pthread_mutex_t mtx;
|
||||||
|
|
||||||
@@ -781,6 +789,29 @@ void init_config() {
|
|||||||
std::cout << "Read G_TEST_NUM:" << G_TEST_NUM << std::endl;
|
std::cout << "Read G_TEST_NUM:" << G_TEST_NUM << std::endl;
|
||||||
std::cout << "Read G_TEST_TYPE:" << G_TEST_TYPE << std::endl;
|
std::cout << "Read G_TEST_TYPE:" << G_TEST_TYPE << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
G_LOG_RATE_RESET_SEC = settings.value("LogRate/ResetSec", 3600).toInt();
|
||||||
|
G_LOG_RATE_LIMIT_SEC = settings.value("LogRate/LimitSec", 60).toInt();
|
||||||
|
G_LOG_RATE_KEEP_ALL_MS = settings.value("LogRate/KeepAllMs", 60000).toInt();
|
||||||
|
G_LOG_RATE_KEEP_BURST_MS = settings.value("LogRate/KeepBurstMs", 1000).toInt();
|
||||||
|
G_LOG_RATE_KEEP_BURST_COUNT = settings.value("LogRate/KeepBurstCount", 60).toInt();
|
||||||
|
G_LOG_RATE_KEEP_HIGHFREQ_COUNT = settings.value("LogRate/KeepHighFreqCount", 10).toInt();
|
||||||
|
|
||||||
|
std::cout << "Read G_LOG_RATE_RESET_SEC:" << G_LOG_RATE_RESET_SEC << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_LIMIT_SEC:" << G_LOG_RATE_LIMIT_SEC << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_ALL_MS:" << G_LOG_RATE_KEEP_ALL_MS << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_BURST_MS:" << G_LOG_RATE_KEEP_BURST_MS << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_BURST_COUNT:" << G_LOG_RATE_KEEP_BURST_COUNT << std::endl;
|
||||||
|
std::cout << "Read G_LOG_RATE_KEEP_HIGHFREQ_COUNT:" << G_LOG_RATE_KEEP_HIGHFREQ_COUNT << std::endl;
|
||||||
|
|
||||||
|
if (G_LOG_RATE_RESET_SEC <= 0) G_LOG_RATE_RESET_SEC = 3600;
|
||||||
|
if (G_LOG_RATE_LIMIT_SEC <= 0) G_LOG_RATE_LIMIT_SEC = 60;
|
||||||
|
if (G_LOG_RATE_KEEP_ALL_MS <= 0) G_LOG_RATE_KEEP_ALL_MS = 60000;
|
||||||
|
if (G_LOG_RATE_KEEP_BURST_MS <= 0) G_LOG_RATE_KEEP_BURST_MS = 1000;
|
||||||
|
if (G_LOG_RATE_KEEP_BURST_COUNT < 0) G_LOG_RATE_KEEP_BURST_COUNT = 60;
|
||||||
|
if (G_LOG_RATE_KEEP_HIGHFREQ_COUNT < 0) G_LOG_RATE_KEEP_HIGHFREQ_COUNT = 10;
|
||||||
|
|
||||||
//20241212lnk添加多前置
|
//20241212lnk添加多前置
|
||||||
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
|
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
|
||||||
MULTIPLE_NODE_FLAG = 1;
|
MULTIPLE_NODE_FLAG = 1;
|
||||||
@@ -6542,6 +6573,9 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
// 循环发送 300 条消息
|
// 循环发送 300 条消息
|
||||||
if(type == 0){
|
if(type == 0){
|
||||||
std::cout << " use ledger send msg " << std::endl;
|
std::cout << " use ledger send msg " << std::endl;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mtx);
|
||||||
|
|
||||||
for (int i = 0; (total_messages > 0 && g_node_id == 100) && i < g_node->n_clients; ++i) {//台账模拟不限制进程号
|
for (int i = 0; (total_messages > 0 && g_node_id == 100) && i < g_node->n_clients; ++i) {//台账模拟不限制进程号
|
||||||
|
|
||||||
ied = (ied_t*)g_node->clients[i];
|
ied = (ied_t*)g_node->clients[i];
|
||||||
@@ -6611,6 +6645,13 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "Finished sending " << g_node->n_clients << " messages." << std::endl;
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&mtx);
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cout << " use monitor + number send msg " << std::endl;
|
std::cout << " use monitor + number send msg " << std::endl;
|
||||||
@@ -6663,9 +6704,10 @@ void rocketmq_test_300(int mpnum,int front_index,int type) {
|
|||||||
apr_sleep(apr_time_from_msec(60000/total_messages)); // 添加毫秒延时
|
apr_sleep(apr_time_from_msec(60000/total_messages)); // 添加毫秒延时
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "Finished sending " << total_messages << " messages." << std::endl;
|
std::cout << "Finished sending " << total_messages << " messages." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ extern std::string intToString(int number);
|
|||||||
|
|
||||||
//日志主题
|
//日志主题
|
||||||
extern std::string G_LOG_TOPIC;
|
extern std::string G_LOG_TOPIC;
|
||||||
|
|
||||||
|
// 日志限流配置
|
||||||
|
extern int G_LOG_RATE_RESET_SEC;
|
||||||
|
extern int G_LOG_RATE_LIMIT_SEC;
|
||||||
|
extern int G_LOG_RATE_KEEP_ALL_MS;
|
||||||
|
extern int G_LOG_RATE_KEEP_BURST_MS;
|
||||||
|
extern int G_LOG_RATE_KEEP_BURST_COUNT;
|
||||||
|
extern int G_LOG_RATE_KEEP_HIGHFREQ_COUNT;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
//log4命名空间
|
//log4命名空间
|
||||||
using namespace log4cplus;
|
using namespace log4cplus;
|
||||||
@@ -337,7 +346,19 @@ protected:
|
|||||||
|
|
||||||
// ③ 限频:同一条日志
|
// ③ 限频:同一条日志
|
||||||
const std::string rkey = make_key(logger_name, level, code, msg);
|
const std::string rkey = make_key(logger_name, level, code, msg);
|
||||||
if (!should_emit(rkey)) return;
|
|
||||||
|
uint64_t suppressed_before_emit = 0;
|
||||||
|
if (!should_emit(rkey, suppressed_before_emit)) return;
|
||||||
|
|
||||||
|
// 如果本次输出前压掉过日志,则在 log 文本后追加统计
|
||||||
|
std::string final_msg = msg;
|
||||||
|
if (suppressed_before_emit > 0) {
|
||||||
|
std::ostringstream suppressed_oss;
|
||||||
|
suppressed_oss << msg << " 【中间重复抑制 "
|
||||||
|
<< suppressed_before_emit
|
||||||
|
<< " 条】";
|
||||||
|
final_msg = suppressed_oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "{\"processNo\":\"" << intToString(g_front_seg_index)
|
oss << "{\"processNo\":\"" << intToString(g_front_seg_index)
|
||||||
@@ -348,7 +369,7 @@ protected:
|
|||||||
<< "\",\"logtype\":\"" << safe_logtype
|
<< "\",\"logtype\":\"" << safe_logtype
|
||||||
<< "\",\"frontType\":\"" << get_front_type_from_subdir()
|
<< "\",\"frontType\":\"" << get_front_type_from_subdir()
|
||||||
<< "\",\"code\":" << code
|
<< "\",\"code\":" << code
|
||||||
<< ",\"log\":\"" << escape_json(msg) << "\"}";
|
<< ",\"log\":\"" << escape_json(final_msg) << "\"}";
|
||||||
|
|
||||||
Ckafka_data_t connect_info;
|
Ckafka_data_t connect_info;
|
||||||
connect_info.strTopic = QString::fromStdString(G_LOG_TOPIC);
|
connect_info.strTopic = QString::fromStdString(G_LOG_TOPIC);
|
||||||
@@ -386,12 +407,20 @@ public:
|
|||||||
//////////////////////////////////////////////////////////////////20260303添加日志上送控制 - 频率限制实现
|
//////////////////////////////////////////////////////////////////20260303添加日志上送控制 - 频率限制实现
|
||||||
private:
|
private:
|
||||||
struct RateState {
|
struct RateState {
|
||||||
uint64_t hit_count;
|
uint64_t pass_count; // 当前周期内已放行条数
|
||||||
|
uint64_t suppressed_count; // 当前被抑制条数
|
||||||
std::chrono::steady_clock::time_point last_emit;
|
std::chrono::steady_clock::time_point last_emit;
|
||||||
|
std::chrono::steady_clock::time_point last_seen;
|
||||||
std::chrono::steady_clock::time_point last_reset;
|
std::chrono::steady_clock::time_point last_reset;
|
||||||
bool has_emit;
|
bool has_emit;
|
||||||
|
|
||||||
RateState() : hit_count(0), last_emit(), last_reset(), has_emit(false) {}
|
RateState()
|
||||||
|
: pass_count(0),
|
||||||
|
suppressed_count(0),
|
||||||
|
last_emit(),
|
||||||
|
last_seen(),
|
||||||
|
last_reset(),
|
||||||
|
has_emit(false) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::unordered_map<std::string, RateState> s_rate_map;
|
static std::unordered_map<std::string, RateState> s_rate_map;
|
||||||
@@ -403,52 +432,94 @@ private:
|
|||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool should_emit(const std::string& key) {
|
static bool should_emit(const std::string& key, uint64_t& suppressed_before_emit) {
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
|
|
||||||
const auto now = steady_clock::now();
|
const auto now = steady_clock::now();
|
||||||
|
suppressed_before_emit = 0;
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lk(s_rate_mutex);
|
std::lock_guard<std::mutex> lk(s_rate_mutex);
|
||||||
RateState& st = s_rate_map[key];
|
RateState& st = s_rate_map[key];
|
||||||
|
|
||||||
const int RESET_SEC = 3600;
|
const int RESET_SEC = G_LOG_RATE_RESET_SEC ; // 1小时重置
|
||||||
|
const int LIMIT_SEC = G_LOG_RATE_LIMIT_SEC ; // 进入限流后:1分钟1条
|
||||||
|
|
||||||
// 🚀 强制时间窗口重置(关键)
|
// 初始化 / 强制每小时重置
|
||||||
if (st.has_emit) {
|
if (st.last_reset.time_since_epoch().count() == 0) {
|
||||||
|
st.last_reset = now;
|
||||||
|
} else {
|
||||||
auto since_reset = duration_cast<seconds>(now - st.last_reset).count();
|
auto since_reset = duration_cast<seconds>(now - st.last_reset).count();
|
||||||
if (since_reset >= RESET_SEC) {
|
if (since_reset >= RESET_SEC) {
|
||||||
st.hit_count = 0;
|
st = RateState();
|
||||||
st.has_emit = false;
|
|
||||||
st.last_reset = now;
|
st.last_reset = now;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算当前频率档位(按“本次与上次看到该key的间隔”判断)
|
||||||
|
// >=60秒/条:全部保留
|
||||||
|
// [1秒, 60秒):保留前60条,然后1分钟1条
|
||||||
|
// <1秒:保留前10条,然后1分钟1条
|
||||||
|
int allow_burst = 0;
|
||||||
|
|
||||||
|
if (st.last_seen.time_since_epoch().count() == 0) {
|
||||||
|
// 第一次看到,先按“全部保留”处理
|
||||||
|
allow_burst = -1;
|
||||||
} else {
|
} else {
|
||||||
// 第一次初始化
|
auto gap_ms = duration_cast<milliseconds>(now - st.last_seen).count();
|
||||||
st.last_reset = now;
|
|
||||||
|
if (gap_ms >= G_LOG_RATE_KEEP_ALL_MS) {
|
||||||
|
allow_burst = -1; // 全部保留
|
||||||
|
} else if (gap_ms >= G_LOG_RATE_KEEP_BURST_MS) {
|
||||||
|
allow_burst = G_LOG_RATE_KEEP_BURST_COUNT; // 前60条
|
||||||
|
} else {
|
||||||
|
allow_burst = G_LOG_RATE_KEEP_HIGHFREQ_COUNT; // 前10条
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
st.hit_count++;
|
st.last_seen = now;
|
||||||
|
|
||||||
// 🚀 前20条:完全放行
|
// 档位1:全部保留
|
||||||
if (st.hit_count <= 20) {
|
if (allow_burst == -1) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
st.last_emit = now;
|
st.last_emit = now;
|
||||||
st.has_emit = true;
|
st.has_emit = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🚀 超过20条:1分钟限1条
|
// 档位2/3:先放前N条
|
||||||
const int period_sec = 60;
|
if (st.pass_count < (uint64_t)allow_burst) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
|
st.last_emit = now;
|
||||||
|
st.has_emit = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 超过前N条后:进入 1分钟1条
|
||||||
if (!st.has_emit) {
|
if (!st.has_emit) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
st.last_emit = now;
|
st.last_emit = now;
|
||||||
st.has_emit = true;
|
st.has_emit = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto elapsed = duration_cast<seconds>(now - st.last_emit).count();
|
auto elapsed = duration_cast<seconds>(now - st.last_emit).count();
|
||||||
if (elapsed >= period_sec) {
|
if (elapsed >= LIMIT_SEC) {
|
||||||
|
suppressed_before_emit = st.suppressed_count;
|
||||||
|
st.suppressed_count = 0;
|
||||||
|
st.pass_count++;
|
||||||
st.last_emit = now;
|
st.last_emit = now;
|
||||||
|
st.has_emit = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 本条被抑制
|
||||||
|
st.suppressed_count++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
170
mykafka.ini
Normal file
170
mykafka.ini
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
[Kafka]
|
||||||
|
BrokerList=
|
||||||
|
EventTopic=
|
||||||
|
KafkaFlag=
|
||||||
|
KafkaListSize=
|
||||||
|
|
||||||
|
RTDataTopic=Real_Time_Data_Topic
|
||||||
|
HisTopic=LN_Topic
|
||||||
|
PSTTopic=LN_Topic
|
||||||
|
PLTTopic=LN_Topic
|
||||||
|
AlmTopic=AlmTopic
|
||||||
|
SngTopic=SngTopic
|
||||||
|
|
||||||
|
[Oracle]
|
||||||
|
OtlType=
|
||||||
|
OtlConnect=
|
||||||
|
OtlFlag=
|
||||||
|
OtlConnectLimit=
|
||||||
|
SqlListSize=
|
||||||
|
|
||||||
|
[Comtrade]
|
||||||
|
NEWESTFlag=
|
||||||
|
|
||||||
|
[SFTP]
|
||||||
|
SFtpFlag=
|
||||||
|
|
||||||
|
[SagSource]
|
||||||
|
UpdateFlag=
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
UnitOfTime=
|
||||||
|
|
||||||
|
[Recall]
|
||||||
|
JournalTime=
|
||||||
|
recall_lenth=
|
||||||
|
recall_start=
|
||||||
|
recall_dailytime=
|
||||||
|
select_day=
|
||||||
|
|
||||||
|
[screen]
|
||||||
|
ScreenFlag=
|
||||||
|
WebHost=
|
||||||
|
WebPort=
|
||||||
|
ScreenUrl=
|
||||||
|
|
||||||
|
[AccountUpdate]
|
||||||
|
Interval=
|
||||||
|
LastUpdateTime=
|
||||||
|
|
||||||
|
[MultiNode]
|
||||||
|
Interval=
|
||||||
|
|
||||||
|
[CommunicationLog]
|
||||||
|
StatusRecordDuration=
|
||||||
|
AbnormalRecordDuration=
|
||||||
|
|
||||||
|
[Postgres]
|
||||||
|
Database=
|
||||||
|
Username=
|
||||||
|
Password=
|
||||||
|
Schema=
|
||||||
|
Dnsname=
|
||||||
|
TablePrefix=
|
||||||
|
|
||||||
|
[Web]
|
||||||
|
ClientId=
|
||||||
|
ClientSecret=
|
||||||
|
TokenUrl=
|
||||||
|
DeviceUrl=
|
||||||
|
GrantType=
|
||||||
|
|
||||||
|
[Flag]
|
||||||
|
FileFlag=4
|
||||||
|
FrontInst=884d132ac3a01225fcacc8c10da07d09
|
||||||
|
FrontIP=192.168.1.167
|
||||||
|
SendFlag=3
|
||||||
|
RecallOnlyFlag=
|
||||||
|
|
||||||
|
[Ledger]
|
||||||
|
TerminalStatus="[0]"
|
||||||
|
MonitorStatus="[1,2]"
|
||||||
|
IcdFlag=0
|
||||||
|
IedCount=300
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
SocketEnable=0
|
||||||
|
SocketPort=13000
|
||||||
|
|
||||||
|
[Http]
|
||||||
|
HttpEnable=0
|
||||||
|
HttpIp=0.0.0.0
|
||||||
|
HttpPort=12000
|
||||||
|
WebDevice=http://192.168.1.68:10202/nodeDevice/nodeDeviceList
|
||||||
|
WebIcd=http://192.168.1.68:10202/icd/icdPathList
|
||||||
|
WebIntegrity=http://192.168.1.68:10202/LineIntegrityData/saveOrUpdateData
|
||||||
|
WebComflag=http://192.168.1.68:10202/dev/updateDevComFlag
|
||||||
|
WebEvent=http://192.168.1.68:10203/event/addEventDetail
|
||||||
|
WebFileupload=http://192.168.1.68:10207/file/upload
|
||||||
|
WebFiledownload=http://192.168.1.68:10207/file/download
|
||||||
|
|
||||||
|
[Oss]
|
||||||
|
OssEndpoint=
|
||||||
|
AccessKeyID=
|
||||||
|
AccessKeySecret=
|
||||||
|
BucketName=
|
||||||
|
|
||||||
|
[FrontNode]
|
||||||
|
Node=
|
||||||
|
|
||||||
|
[MySql]
|
||||||
|
ConStr=
|
||||||
|
|
||||||
|
[InfluxDb]
|
||||||
|
SelectUrl=
|
||||||
|
WriteUrl=
|
||||||
|
|
||||||
|
[RocketMq]
|
||||||
|
producer=Group_producer
|
||||||
|
Ipport=192.168.1.68:9876
|
||||||
|
Topic=TEST_Topic
|
||||||
|
Tag=Test_Tag
|
||||||
|
Key=Test_Keys
|
||||||
|
Queuenum=4
|
||||||
|
|
||||||
|
Testflag=1
|
||||||
|
Testnum=100
|
||||||
|
Testtype=1
|
||||||
|
TestPort=11000
|
||||||
|
TestList=
|
||||||
|
|
||||||
|
consumer=Group_consumer
|
||||||
|
ConsumerIpport=192.168.1.68:9876
|
||||||
|
ConsumerTopicRT=ask_real_data_topic
|
||||||
|
ConsumerTagRT=Test_Tag
|
||||||
|
ConsumerKeyRT=Test_Keys
|
||||||
|
ConsumerAccessKey=rmqroot
|
||||||
|
ConsumerSecretKey=001@#njcnmq
|
||||||
|
ConsumerChannel=
|
||||||
|
ConsumerTopicUD=control_Topic
|
||||||
|
ConsumerTagUD=Test_Tag
|
||||||
|
ConsumerKeyUD=Test_Keys
|
||||||
|
ConsumerTopicRC=recall_Topic
|
||||||
|
ConsumerTagRC=Test_Tag
|
||||||
|
ConsumerKeyRC=Test_Keys
|
||||||
|
ConsumerTopicSET=process_Topic
|
||||||
|
ConsumerTagSET=Test_Tag
|
||||||
|
ConsumerKeySET=Test_Keys
|
||||||
|
ConsumerTopicLOG=ask_log_Topic
|
||||||
|
ConsumerTagLOG=Test_Tag
|
||||||
|
ConsumerKeyLOG=Test_Keys
|
||||||
|
LOGTopic=log_Topic
|
||||||
|
LOGTag=Test_Tag
|
||||||
|
LOGKey=Test_Keys
|
||||||
|
CONNECTTopic=Device_Run_Flag_Topic
|
||||||
|
CONNECTTag=Test_Tag
|
||||||
|
CONNECTKey=Test_Keys
|
||||||
|
Heart_Beat_Topic=Heart_Beat_Topic
|
||||||
|
Heart_Beat_Tag=Test_Tag
|
||||||
|
Heart_Beat_Key=Test_Key
|
||||||
|
Topic_Reply_Topic=Topic_Reply_Topic
|
||||||
|
Topic_Reply_Tag=Test_Tag
|
||||||
|
Topic_Reply_Key=Test_Key
|
||||||
|
|
||||||
|
[LogRate]
|
||||||
|
ResetSec=3600
|
||||||
|
LimitSec=60
|
||||||
|
KeepAllMs=60000
|
||||||
|
KeepBurstMs=1000
|
||||||
|
KeepBurstCount=60
|
||||||
|
KeepHighFreqCount=10
|
||||||
Reference in New Issue
Block a user