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

效果:

相关推荐
敲上瘾4 分钟前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
神里流~霜灭7 分钟前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
Yuki’37 分钟前
网络编程---TCP
服务器·网络·tcp/ip
禁默44 分钟前
已知 inode 号,如何操作文件?Ext 文件系统增删查改底层逻辑拆解
linux·服务器·数据库
许怀楠1 小时前
【Linux】基础指令(下)
linux
云飞云共享云桌面1 小时前
工厂办公环境如何实现一台服务器多人共享办公
运维·服务器·网络·数据库·3d
咕咚.萌西1 小时前
RISC-V开发环境搭建
linux·硬件架构·risc-v
zr5268554471 小时前
ModbusTCP 转 Profinet 主站网关
运维·服务器·网络
草莓熊Lotso1 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
青岛佰优联创新科技有限公司1 小时前
服务器托管,服务器运维的选择
运维·服务器