日志文件的书写-示例

// 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值