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;
}

效果:

相关推荐
wc_xue_fei_le2 分钟前
11.11DNS主从服务器
linux·服务器·前端
用户31187945592187 分钟前
申威SW64系统安装docker-ce-19.03.14.rpm详细教程(附安装包)
linux
是Dream呀15 分钟前
华为CANN 8.0深度评测:挑战CUDA生态的AI计算架构
运维·服务器·cann
white-persist29 分钟前
二进制movl及CTF逆向GDB解析:Python(env)环境下dbg从原理到实战
linux·服务器·开发语言·python·网络安全·信息可视化·系统安全
sxjk198729 分钟前
华为IMS系统主要接口备忘
运维·服务器·前端·核心网
Le_ee30 分钟前
Rocky Linux 8 网络配置
linux·运维·服务器
Creeper.exe1 小时前
【C语言】分支与循环(上)
c语言·开发语言
llc的足迹1 小时前
python构建webRTC服务器,coturn搭建中继服务器
服务器·python·webrtc·turn
CS_浮鱼1 小时前
【Linux】基础IO
linux·运维·chrome
序属秋秋秋1 小时前
《Linux系统编程之进程基础》【进程状态】
linux·运维·c语言·c++·笔记·操作系统·进程状态