// main.c
#include "log_system.h"
int main()
{
LogSystem logSystem;
while(1)
{
log_init(&logSystem, "debug", LOG_INFO);
log_write(&logSystem, LOG_INFO, "System started");
log_write(&logSystem, LOG_DEBUG, "This is a debug message, should not be logged");
log_setlevel(&logSystem, LOG_DEBUG);
log_write(&logSystem, LOG_DEBUG, "Debug level set, this should be logged");
log_deinit(&logSystem);
sleep(2);
}
return 0;
}
// log_system.c
#include "log_system.h"
#include <string.h>
// 初始化日志系统,支持按日期生成文件名
void log_init(LogSystem *system, const char *baseFileName, LogLevel level) {
time_t now;
time(&now);
struct tm *t = localtime(&now);
// 格式化日期
char dateStr[11]; // YYYY-MM-DD,共10个字符加上字符串结束符'\0'
strftime(dateStr, sizeof(dateStr), "%Y%m%d", t); // 注意这里去掉了分隔符'-'以简化文件名
// 构建完整文件名
char filePath[256];
snprintf(filePath, sizeof(filePath), "%s_%s.log", baseFileName, dateStr);
// 尝试打开文件
system->logFile = fopen(filePath, "a");
if (system->logFile == NULL) {
perror("Failed to open log file");
exit(EXIT_FAILURE);
}
system->currentLevel = level;
}
// 写入日志
void log_write(LogSystem *system, LogLevel level, const char *message)
{
if (level < system->currentLevel)
{
// 日志级别低于当前设置级别,不记录
return;
}
// 获取当前时间
time_t now; //1970 到现在秒数
time(&now);
struct tm *t = localtime(&now); //结构体详细成员时分秒,周,月,年
// 格式化时间
char timeStr[80];
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", t);
// 写入日志
fprintf(system->logFile, "[%s] [%s] %s\n", timeStr, getLogLevelString(level), message);
fflush(system->logFile); // 确保写入磁盘
}
// 获取日志级别字符串
const char* getLogLevelString(LogLevel level)
{
switch (level)
{
case LOG_DEBUG: return "DEBUG";
case LOG_INFO: return "INFO";
case LOG_WARNING: return "WARNING";
case LOG_ERROR: return "ERROR";
case LOG_FATAL: return "FATAL";
default: return "UNKNOWN";
}
}
// 设置日志级别
void log_setlevel(LogSystem *system, LogLevel level)
{
system->currentLevel = level;
}
// 销毁日志系统
void log_deinit(LogSystem *system)
{
if (system->logFile != NULL)
{
fclose(system->logFile);
}
}
// log_system.h
#ifndef LOG_SYSTEM_H
#define LOG_SYSTEM_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
// 定义了一个枚举类型 LogLevel,用于表示日志的不同级别
typedef enum {
// 日志级别:调试信息debug,主要用于开发者在开发过程中调试程序时使用
LOG_DEBUG,
// 日志级别:普通信息info,用于记录程序运行过程中的一些正常信息
LOG_INFO,
// 日志级别:警告信息warning,用于记录一些潜在的问题或需要注意的情况,但这些问题目前不影响程序正常运行
LOG_WARNING,
// 日志级别:错误信息error,用于记录程序运行中出现的错误,这些错误可能会导致部分功能失效,但程序整体还能继续运行
LOG_ERROR,
// 日志级别:致命错误fatal,这是最严重的日志级别,表示程序遇到了无法恢复的错误,需要立即停止运行
LOG_FATAL
} LogLevel; //日志等级
typedef struct {
FILE *logFile;
LogLevel currentLevel;
} LogSystem;
extern void log_init(LogSystem *system, const char *logDir, LogLevel level);
extern void log_write(LogSystem *system, LogLevel level, const char *message);
extern const char* getLogLevelString(LogLevel level);
extern void log_setlevel(LogSystem *system, LogLevel level);
extern void log_deinit(LogSystem *system);
#endif // LOG_SYSTEM_H