linux下的日志编写

1、日志初始化创建

2、日志写入

3、日志关闭

log.c

cpp 复制代码
#include "log.h"

static log_t LOG;


//初始化日志文件,在当前目录创建日志文件
int log_init(char *pdirname)
{
    time_t t;
    struct tm *ptm = NULL;
    char filepath[64] = {0};
    int ret = 0;

    time(&t);
    ptm = localtime(&t);

    ret = access(pdirname, F_OK);
    if (0 != ret)
    {
        mkdir(pdirname, 0777);
    }

    sprintf(filepath, "%s/log_%4d%02d%02d", pdirname, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);

    LOG.flog = fopen(filepath, "a");
    if (NULL == LOG.flog)
    {
        fprintf(stderr, "logfile open faileed, can not record software information");
        return -1;
    }

    LOG.curtime = ptm;

    pthread_mutex_init(&LOG.lock, NULL);

    return 0;
}


//写入日志文件
int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...)
{
    time_t t;
    struct tm *ptm = NULL;
    char tmpinfo[1024] = {0};
    va_list pnext;

    pthread_mutex_lock(&LOG.lock);
    if (level < LOG.curlevel)
    {
        pthread_mutex_unlock(&LOG.lock);
        return 0;
    }

    va_start(pnext, pstr);

    time(&t);
    ptm = localtime(&t);

    if (ptm->tm_year != LOG.curtime->tm_year | ptm->tm_mon != LOG.curtime->tm_mon | ptm->tm_mday != LOG.curtime->tm_mday)
    {   
        pthread_mutex_unlock(&LOG.lock);
        log_deinit();
        log_init("LOG_FILE");
        pthread_mutex_lock(&LOG.lock);
        LOG.curtime = ptm;
    }

    sprintf(tmpinfo, "%s\n", pstr);
    fprintf(LOG.flog, "[%4d-%02d-%02d %02d-%02d-%02d] [%s %d %s] ", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, pfile, line, pfunc);
    vfprintf(LOG.flog, tmpinfo, pnext);

    va_end(pnext);

    pthread_mutex_unlock(&LOG.lock);

    return 0;
}



//销毁日志文件
int log_deinit(void)
{
    //关闭日志文件
    if (NULL != LOG.flog)
    {
        pthread_mutex_lock(&LOG.lock);
        fclose(LOG.flog);
        LOG.flog = NULL;
        pthread_mutex_unlock(&LOG.lock);
        pthread_mutex_destroy(&LOG.lock);
    }

    return 0;
}


//设置日志级别
void log_setlevel(LEVEL_T level)
{
    LOG.curlevel = level;

    return;
}

log.h

cpp 复制代码
#ifndef __LOG_H__
#define __LOG_H__

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#include <pthread.h>

typedef struct LOG_DATE 
{
    int year;
    int mon;
    int day;
}DATE_T;

typedef enum LOG_LEVEL
{
    LOG_MASSAGE,
    LOG_WORNING,
    LOG_ERROR,
}LEVEL_T;

typedef struct log
{
    FILE *flog;
    LEVEL_T curlevel;
    struct tm *curtime;  
    pthread_mutex_t lock;
}log_t;

extern int log_init(char *pdirname);
extern int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...);
extern int log_deinit(void);


#endif

main.c

cpp 复制代码
#include "log.h"

int main(void)
{
    int num = 11451;

    log_init("LOG_FILE");

    log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");
    log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "             software log record systerm           ");
    log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");
    log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);
    log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);

    log_deinit();

    return 0;
}

效果:

相关推荐
ltl8 小时前
存储性能建模:IOPS、吞吐与延迟
linux
波波0078 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
刘某的Cloud9 小时前
ceph osd 导入导出 rbd volume 卷
linux·运维·ceph·volume
SuperByteMaster10 小时前
timer.c 介绍
c语言
隔窗听雨眠10 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
酸菜。11 小时前
dw_axi_dmac总结
linux
神奇霸王龙11 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统11 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
qq_4480111612 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
那年窗外下的雪.12 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php