linux下c语言简单实现写日志函数(多线程安全)

Posted Hero_HL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下c语言简单实现写日志函数(多线程安全)相关的知识,希望对你有一定的参考价值。

调用时包含log.h文件后使用LOG函数进行写入日志操作

// eg:
LOG("[%s][%d] a:%d b:%s", __FILE__, __LINE, a, b);

log.h

// log.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <stdio.h>
#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>
#include <sys/syscall.h>//Linux system call for thread id

int safe_asprintf(char** strp, const char* fmt, ...);
int safe_vasprintf(char** strp, const char* fmt, va_list ap);
void LOG(const char* format, ...);

static pthread_mutex_t fileMutex = PTHREAD_MUTEX_INITIALIZER;

log.c

// log.cpp: 定义应用程序的入口点。
//

#include "log.h"

int safe_asprintf(char** strp, const char* fmt, ...)
{
    va_list ap;
    int retval;

    va_start(ap, fmt);
    retval = safe_vasprintf(strp, fmt, ap);
    va_end(ap);

    return retval;
}

/*
 * safe_vasprintf();
 */
int safe_vasprintf(char** strp, const char* fmt, va_list ap)
{
    int retval;

    retval = vasprintf(strp, fmt, ap);
    if (retval == -1)
    {
        printf("Failed to vasprintf: %s. Bailing out\\n", strerror(errno));
        return 1;
    }
    return retval;
}

/*
 * plog();
 */
void LOG(const char* format, ...)
{
    pthread_mutex_lock(&fileMutex);

    FILE* fp = NULL;
    va_list vlist;
    char* fmt = NULL;

    // Open debug info output file.
    if (!(fp = fopen("log.txt", "a+")))
    {
        pthread_mutex_unlock(&fileMutex);
        return;
    }

    va_start(vlist, format);
    safe_vasprintf(&fmt, format, vlist);
    va_end(vlist);
    if (!fmt)
    {
        pthread_mutex_unlock(&fileMutex);
        return;
    }

    time_t timep;
    struct tm* ptm = NULL;
    time(&timep);
    ptm = localtime(&timep);
    fprintf(fp, "[%04d-%02d-%02d-%02d:%02d:%02d][pid:%d]%s\\n",
        ptm->tm_year + 1900,
        ptm->tm_mon + 1,
        ptm->tm_mday,
        ptm->tm_hour,
        ptm->tm_min,
        ptm->tm_sec,
        syscall(SYS_gettid),
        fmt);

    free(fmt);
    fsync(fileno(fp));
    fclose(fp);

    pthread_mutex_unlock(&fileMutex);
}

以上是关于linux下c语言简单实现写日志函数(多线程安全)的主要内容,如果未能解决你的问题,请参考以下文章

windows环境下c语言支持ftp和http多线程下载的客户端

C语言怎么写线程代码

C语言中 怎么实现双线程 或者 父子线程啊

linux系统下,c语言pthread多线程编程传参问题

用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?

linux下c语言实现多线程文件复制