C语言单例模式-实现高性能日志管理器

C语言单例模式-实现高性能日志管理器

代码中,使用了单例模式来创建日志管理器对象,保证了整个程序中只有一个日志管理器对象。
日志管理器中包含了日志文件指针、日志级别、互斥锁等成员,通过这些成员来实现日志的写入和级别控制。
在主函数中,设置了日志级别为DEBUG,并写入了5条不同级别的日志,最后关闭日志文件、销毁互斥锁、释放内存。

#include 
#include 
#include 
#include 
#include 

// 日志级别枚举
typedef enum {
    LOG_LEVEL_DEBUG,
    LOG_LEVEL_INFO,
    LOG_LEVEL_WARN,
    LOG_LEVEL_ERROR,
    LOG_LEVEL_FATAL
} LogLevel;

// 日志管理器结构体
typedef struct {
    FILE* file; // 日志文件指针
    LogLevel level; // 日志级别
    pthread_mutex_t lock; // 互斥锁
} LogManager;

// 日志管理器单例结构体
typedef struct {
    LogManager* manager; // 日志管理器指针
} LogManagerSingleton;

static LogManagerSingleton* instance = NULL; // 日志管理器单例对象指针

// 获取当前时间字符串函数
void get_current_time_string(char* buffer, size_t size) {
    time_t now = time(NULL);
    struct tm* tm = localtime(&now);
    strftime(buffer, size, "%Y-%m-%d %H:%M:%S", tm);
}

// 写日志函数
void write_log(LogLevel level, const char* message) {
    LogManager* manager = instance->manager;
    if (level < manager->level) {
        return;
    }
    char time_str[20];
    get_current_time_string(time_str, sizeof(time_str));
    pthread_mutex_lock(&manager->lock);
    fprintf(manager->file, "[%s] ", time_str);
    switch (level) {
        case LOG_LEVEL_DEBUG:
            fprintf(manager->file, "[DEBUG] ");
            break;
        case LOG_LEVEL_INFO:
            fprintf(manager->file, "[INFO] ");
            break;
        case LOG_LEVEL_WARN:
            fprintf(manager->file, "[WARN] ");
            break;
        case LOG_LEVEL_ERROR:
            fprintf(manager->file, "[ERROR] ");
            break;
        case LOG_LEVEL_FATAL:
            fprintf(manager->file, "[FATAL] ");
            break;
    }
    fprintf(manager->file, "%s\n", message);
    fflush(manager->file);	// 将写缓存区立即写入磁盘。
    pthread_mutex_unlock(&manager->lock);
}

// 设置日志级别函数
void set_log_level(LogLevel level) {
    instance->manager->level = level;
}

init_instance() {
	instance = (LogManagerSingleton*)malloc(sizeof(LogManagerSingleton));
	instance->manager = (LogManager*)malloc(sizeof(LogManager));
	instance->manager->file = fopen("log.txt", "a");
	instance->manager->level = LOG_LEVEL_INFO;	// 日志默认级别INFO
	pthread_mutex_init(&instance->manager->lock, NULL);
}


// 获取日志管理器单例对象函数
LogManager* get_log_manager_instance() {
    return instance->manager;
}

int main() {
	init_instance();	/* 程序一开始,就必须执行。不然,与懒汉式无较大差异。 */
    LogManager* manager = get_log_manager_instance(); // 获取日志管理器单例对象
    set_log_level(LOG_LEVEL_DEBUG); // 设置日志级别为DEBUG
    write_log(LOG_LEVEL_DEBUG, "debug message"); // 写DEBUG级别日志
    write_log(LOG_LEVEL_INFO, "info message"); // 写INFO级别日志
    write_log(LOG_LEVEL_WARN, "warn message"); // 写WARN级别日志
    write_log(LOG_LEVEL_ERROR, "error message"); // 写ERROR级别日志
    write_log(LOG_LEVEL_FATAL, "fatal message"); // 写FATAL级别日志
    fclose(manager->file); // 关闭日志文件
    pthread_mutex_destroy(&manager->lock); // 销毁互斥锁
    free(manager); // 释放日志管理器内存
    free(instance); // 释放日志管理器单例对象内存
    return 0;
}

/*
该示例代码中,使用了单例模式来创建日志管理器对象,保证了整个程序中只有一个日志管理器对象。
日志管理器中包含了日志文件指针、日志级别、互斥锁等成员,通过这些成员来实现日志的写入和级别控制。
在主函数中,设置了日志级别为DEBUG,并写入了5条不同级别的日志,最后关闭日志文件、销毁互斥锁、释放内存。
*/

你可能感兴趣的:(C,设计模式,Linux,C/C++,c语言,单例模式,设计模式)