.海量日志的定义是10ms内(<10ms)打印2条相同日志(包含第二条均需要被抑制),即仅保留第一条; 或100ms内(<100ms)打印10条相似日志(去除数字后完全相同的两条日志认为是“相似”,包含第10条均需要被抑制),即仅保留前9条。 日志抑制的理解:被抑制的日志,不记录到日志文件中。 请用C或C++编写
时间: 2024-01-22 10:18:49 浏览: 97
互联网公司技术架构资料.百度.海量日志分析架构
以下是一个简单的C++实现,使用了哈希表和双端队列来存储相似日志和相同日志的时间戳。
```c++
#include <iostream>
<string>
#include <unordered_map>
#include <deque>
#include <chrono>
using namespace std;
// 定义日志抑制的时间阈值
const int SAME_LOG_THRESHOLD = 10; // 单位:ms
const int SIMILAR_LOG_THRESHOLD = 100; // 单位:ms
// 哈希表存储相似日志的时间戳
unordered_map<string, deque<long long>> similar_logs;
// 哈希表存储相同日志的时间戳
unordered_map<string, long long> same_logs;
// 判断两个日志是否相似
bool isSimilar(const string& log1, const string& log2) {
// 去除数字后比较
string s1, s2;
for (char c : log1) {
if (!isdigit(c)) s1 += c;
}
for (char c : log2) {
if (!isdigit(c)) s2 += c;
}
return s1 == s2;
}
// 处理日志
void processLog(const string& log) {
auto now = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count();
// 处理相似日志
if (similar_logs.count(log)) {
// 如果相似日志队列为空或者时间差大于阈值,则将当前日志的时间戳插入队列
if (similar_logs[log].empty() || now - similar_logs[log].back() > SIMILAR_LOG_THRESHOLD) {
similar_logs[log].push_back(now);
}
// 如果队列长度超过10,则抑制当前日志
if (similar_logs[log].size() > 9) {
return;
}
} else {
// 如果当前日志不相似,则清空相似日志队列
for (auto it = similar_logs.begin(); it != similar_logs.end(); ) {
if (isSimilar(log, it->first)) {
it = similar_logs.erase(it);
} else {
++it;
}
}
// 插入当前日志的时间戳
similar_logs[log].push_back(now);
}
// 处理相同日志
if (same_logs.count(log)) {
// 如果时间差小于阈值,则抑制当前日志
if (now - same_logs[log] < SAME_LOG_THRESHOLD) {
return;
}
}
// 更新相同日志的时间戳
same_logs[log] = now;
// 输出当前日志
cout << log << endl;
}
int main() {
string log;
while (getline(cin, log)) {
processLog(log);
}
return 0;
}
```
阅读全文