69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
|
#include "Log.h"
|
|||
|
#include <stdarg.h>
|
|||
|
#include <time.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
static FILE* LogFile = NULL; // <20><>־<EFBFBD>ļ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
static char DefaultLogFile[] = "libdm_log.txt"; // Ĭ<><C4AC><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD>
|
|||
|
|
|||
|
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
static void GetTimeStr(char* buffer, size_t size) {
|
|||
|
time_t now = time(NULL);
|
|||
|
struct tm* t = localtime(&now);
|
|||
|
strftime(buffer, size, "%Y-%m-%d %H:%M:%S", t);
|
|||
|
}
|
|||
|
|
|||
|
// <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
static const char* GetLogLevelStr(LogLevel level) {
|
|||
|
switch (level) {
|
|||
|
case Info: return "INFO";
|
|||
|
case Warn: return "WARNING";
|
|||
|
case Error: return "ERROR";
|
|||
|
case Debug: return "DEBUG";
|
|||
|
default: return "UNKNOWN";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD>
|
|||
|
void InitLog(const char* logFilePath) {
|
|||
|
if (LogFile) {
|
|||
|
CloseLog(); // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
const char* filePath = logFilePath ? logFilePath : DefaultLogFile;
|
|||
|
LogFile = fopen(filePath, "a"); // <20><><EFBFBD><D7B7>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD>
|
|||
|
if (!LogFile) {
|
|||
|
fprintf(stderr, "Failed to open log file: %s\n", filePath);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// д<><D0B4>־<EFBFBD>ĺ<EFBFBD><C4BA>ĺ<EFBFBD><C4BA><EFBFBD>
|
|||
|
void WriteLog(LogLevel level, const char* format, ...) {
|
|||
|
if (!LogFile) {
|
|||
|
InitLog(NULL); // <20><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD><C4AC><EFBFBD>ļ<EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
if (LogFile) {
|
|||
|
char timeStr[20];
|
|||
|
GetTimeStr(timeStr, sizeof(timeStr));
|
|||
|
|
|||
|
fprintf(LogFile, "[%s] [%s] ", timeStr, GetLogLevelStr(level));
|
|||
|
|
|||
|
va_list args;
|
|||
|
va_start(args, format);
|
|||
|
vfprintf(LogFile, format, args); // <20><>ʽ<EFBFBD><CABD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>־<EFBFBD><D6BE>Ϣ
|
|||
|
va_end(args);
|
|||
|
|
|||
|
fprintf(LogFile, "\n");
|
|||
|
fflush(LogFile); // ȷ<><C8B7><EFBFBD><EFBFBD>־ʵʱд<CAB1><D0B4>
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20>ر<EFBFBD><D8B1><EFBFBD>־<EFBFBD>ļ<EFBFBD>
|
|||
|
void CloseLog() {
|
|||
|
if (LogFile) {
|
|||
|
fclose(LogFile);
|
|||
|
LogFile = NULL;
|
|||
|
}
|
|||
|
}
|