| | |
| | | |
| | | #include <stdio.h> |
| | | #include <iostream> |
| | | #include <string> |
| | | #include <stdarg.h> |
| | | #include <thread> |
| | | #include <thread> |
| | | #include "block_queue.h" |
| | | #include "locker.h" // ç¡®ä¿ locker.h 被å
å« |
| | | #include "locker.h" |
| | | #include <fstream> |
| | | #include <sqlite3.h> // æ·»å SQLite æ°æ®åºç头æä»¶ |
| | | |
| | | using namespace std; |
| | | |
| | |
| | | |
| | | // åå¨è§£ææ¥å¿æä»¶çç»æä½ |
| | | struct ParsedLog { |
| | | std::string timestamp; // æ¶é´æ³ |
| | | std::string device_id; // 设å¤ID |
| | | std::string level; // æ¥å¿çº§å« |
| | | std::string content; // æ¥å¿å
容 |
| | | char timestamp[64]; // æ¶é´æ³ |
| | | char device_id[64]; // 设å¤ID |
| | | char level[16]; // æ¥å¿çº§å« |
| | | char content[256]; // æ¥å¿å
容 |
| | | char source[64]; // æ¥æºæ¨¡å |
| | | char user_id[64]; // ç¨æ·ID |
| | | }; |
| | | |
| | | class Log |
| | |
| | | void flush_log_thread(); // ä¿®æ¹ä¸ºééææå彿° |
| | | |
| | | // åå§åæ¥å¿ç³»ç»ï¼åæ°å
æ¬æä»¶åãæ¯å¦å
³éæ¥å¿ãç¼å²åºå¤§å°ãæå¤§è¡æ°åæå¤§éåå¤§å° |
| | | bool Log::init(const char *file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size); |
| | | 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 std::string& raw_log); // æ¥æ¶åå§æ¥å¿ |
| | | // æ¥æ¶åå§æ¥å¿ |
| | | void receiveLog(const char* raw_log); |
| | | |
| | | // å°æ¥å¿åå
¥æ°æ®åº |
| | | void writeLogToDatabase(const ParsedLog& log); |
| | | |
| | | private: |
| | | Log(); // æé 彿° |
| | |
| | | bool check_log_size(); // æ£æ¥æ¥å¿æä»¶å¤§å° |
| | | void rotate_logs(); // è½®æ¢æ¥å¿æä»¶ |
| | | |
| | | ParsedLog parseLog(const std::string& log); // è§£ææ¥å¿ |
| | | bool init(const std::string &file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size); |
| | | void queryLogs(const std::string &device_id); // æ¥è¯¢æ¥å¿ |
| | | 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 std::string &level); |
| | | int levelToInt(const char *level); |
| | | |
| | | private: |
| | | char dir_name[128]; // æ¥å¿æä»¶ç®å½ |
| | |
| | | int m_today; // è®°å½å½åæ¶é´ |
| | | std::ofstream m_fp; // å° FILE * m_fp æ´æ¹ä¸º std::ofstream m_fp |
| | | char *m_buf; // æ¥å¿ç¼å²åº |
| | | block_queue<string> *m_log_queue; // é»å¡éå |
| | | block_queue<char*> *m_log_queue; // é»å¡éå |
| | | bool m_is_async; // æ¯å¦å¼æ¥æ å¿ä½ |
| | | locker m_mutex; // äºæ¥é |
| | | int m_close_log; // å
³éæ¥å¿çæ å¿ |
| | | long max_size = 10 * 1024 * 1024; // 10MB |
| | | //æµè¯æä»¶éé¢ç |
| | | 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();} |