#ifndef LOG_H
|
#define LOG_H
|
|
#include <stdio.h>
|
#include <iostream>
|
#include <stdarg.h>
|
#include <thread>
|
#include "block_queue.h"
|
#include "locker.h"
|
#include <fstream>
|
#include <sqlite3.h> // 添加 SQLite 数据库的头文件
|
|
using namespace std;
|
|
// 日志级别枚举
|
enum LogLevel {
|
DEBUG = 0,
|
INFO,
|
WARN,
|
ERROR
|
};
|
|
// 存储解析日志文件的结构体
|
struct ParsedLog {
|
char timestamp[64]; // 时间戳
|
char device_id[64]; // 设备ID
|
char level[16]; // 日志级别
|
char content[256]; // 日志内容
|
char source[64]; // 来源模块
|
char user_id[64]; // 用户ID
|
};
|
|
class Log
|
{
|
public:
|
// 获取单例实例
|
static Log *get_instance()
|
{
|
static Log instance;
|
return &instance;
|
}
|
|
// 刷新日志线程
|
void flush_log_thread(); // 修改为非静态成员函数
|
|
// 初始化日志系统,参数包括文件名、是否关闭日志、缓冲区大小、最大行数和最大队列大小
|
bool init(const char *file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size);
|
|
// 写入日志
|
void write_log(int level, const char *format, ...);
|
|
// 刷新日志文件
|
void flush(void);
|
|
// 接收原始日志
|
void receiveLog(const char* raw_log);
|
|
// 将日志写入数据库
|
void writeLogToDatabase(const ParsedLog& log);
|
|
private:
|
Log(); // 构造函数
|
virtual ~Log(); // 析构函数
|
|
void async_write_log(); // 异步写入日志
|
bool check_log_size(); // 检查日志文件大小
|
void rotate_logs(); // 轮换日志文件
|
|
ParsedLog parseLog(const char* log); // 解析日志
|
bool init(const char *file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size);
|
void queryLogs(const char *device_id); // 查询日志
|
|
const char* log_level_to_string(int level); // 将日志级别转换为字符串
|
int levelToInt(const char *level);
|
|
private:
|
char dir_name[128]; // 日志文件目录
|
char log_name[128]; // 日志文件名
|
int m_split_lines; // 日志最大行数
|
int m_log_buf_size; // 日志缓冲区大小
|
long long m_count; // 日志行数记录
|
int m_today; // 记录当前时间
|
std::ofstream m_fp; // 将 FILE * m_fp 更改为 std::ofstream m_fp
|
char *m_buf; // 日志缓冲区
|
block_queue<char*> *m_log_queue; // 阻塞队列
|
bool m_is_async; // 是否异步标志位
|
locker m_mutex; // 互斥锁
|
int m_close_log; // 关闭日志的标志
|
long max_size = 10 * 1024 * 1024; // 单个日志文件的大小 10MB
|
|
// 数据库相关
|
sqlite3 *db; // SQLite 数据库指针
|
void openDatabase(const char *db_name); // 打开数据库
|
void closeDatabase(); // 关闭数据库
|
};
|
|
#define LOG_DEBUG(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(DEBUG, format, ##__VA_ARGS__); Log::get_instance()->flush();}
|
#define LOG_INFO(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(INFO, format, ##__VA_ARGS__); Log::get_instance()->flush();}
|
#define LOG_WARN(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(WARN, format, ##__VA_ARGS__); Log::get_instance()->flush();}
|
#define LOG_ERROR(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(ERROR, format, ##__VA_ARGS__); Log::get_instance()->flush();}
|
|
#endif
|