C语言打印log写文件的demo

偶尔会用到c语言打印log写文件本地.这里分享一个比较好的demo.
先看log效果:
main函数:

void main(int argc,char argv[])
{
    int value = 2;
    double dvalue = 0.5;
    char* str = "string test";
    hdslog("hdstestttt");
    hdslog("hdstestttt:%d",value);
    hdslog("hdstestttt:%f",dvalue);
    hdslog("hdstestttt:%s",str);
}

log结果:
[2020.04.25 09:42:05] :log.c:118: hdstestttt
[2020.04.25 09:42:05] :log.c:119: hdstestttt:2
[2020.04.25 09:42:05] :log.c:120: hdstestttt:0.500000
[2020.04.25 09:42:05] :log.c:121: hdstestttt:string test

打印添加了时间,文件名,行号
代码在linux下运行成功过.如果要在window下运行,估计需要修改下:LJQ_DEBUG_FILE_log保存的路径,和修改头文件.
具体代码如下:
头文件log.h:

#include <stdio.h>
#include <stdarg.h>
#include <time.h>

#ifndef _LJQ_LOG_H_
#define _LJQ_LOG_H_

    #define HDS_DEBUG_ON        //hds open

    #ifdef  __cplusplus
    extern "C" {
    #endif
    
        #ifdef HDS_DEBUG_ON
        void C_LJQ_LOG2(const char *file, int line,const char *fmt, ...);
        #define hdslog(...)     C_LJQ_LOG2(__FILE__, __LINE__,__VA_ARGS__)
        #else
        #define hdslog(...)
        #endif

        #define hdslog_anyway(...)     C_LJQ_LOG2(__FILE__, __LINE__,__VA_ARGS__)

    #ifdef  __cplusplus
    }
    #endif

#endif

源文件log.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "log.h"

#define LJQ_DEBUG_FILE_ "/home/hds/桌面/log.txt"
#define LJQ_MAX_STRING_LEN      3000

//Level类别

static int C_LJQ_Error_GetCurTime(char* strTime)
{
    struct tm*      tmTime = NULL;
    size_t          timeLen = 0;
    time_t          tTime = 0;

    tTime = time(NULL);
    tmTime = localtime(&tTime);
    //timeLen = strftime(strTime, 33, "%Y(Y)%m(M)%d(D)%H(H)%M(M)%S(S)", tmTime);
    timeLen = strftime(strTime, 33, "%Y.%m.%d %H:%M:%S", tmTime);

    return timeLen;
}

static int C_LJQ_Error_OpenFile(int* pf)
{
    char    fileName[1024];

    memset(fileName, 0, sizeof(fileName));

    strcat(fileName,LJQ_DEBUG_FILE_);
    // sprintf(fileName, LJQ_DEBUG_FILE_);
    
    *pf = open(fileName, O_WRONLY | O_CREAT | O_APPEND, 0666);
    if (*pf < 0)
    {
        return -1;
    }

    return 0;
}

static void C_LJQ_Error_Core2(const char *file, int line,const char *fmt, va_list args)
{
    char str[LJQ_MAX_STRING_LEN];
    int  strLen = 0;
    char tmpStr[64];
    int  tmpStrLen = 0;
    int  pf = 0;

    //初始化
    memset(str, 0, LJQ_MAX_STRING_LEN);
    memset(tmpStr, 0, 64);

    //加入LOG时间
    tmpStrLen = C_LJQ_Error_GetCurTime(tmpStr);
    tmpStrLen = sprintf(str, "[%s] ", tmpStr);
    strLen = tmpStrLen;

    //加入LOG发生文件
    tmpStrLen = sprintf(str + strLen, ":%s:", file);
    strLen += tmpStrLen;

    //加入LOG发生行数
    tmpStrLen = sprintf(str + strLen, "%d:\t", line);
    strLen += tmpStrLen;

    //加入LOG信息
    tmpStrLen = vsprintf(str + strLen, fmt, args);
    strLen += tmpStrLen;

    //加入LOG发生行数
    tmpStrLen = sprintf(str + strLen, "\n");
    strLen += tmpStrLen;

    //打开LOG文件
    if (C_LJQ_Error_OpenFile(&pf))
    {
        return;
    }

    //写入LOG文件
    printf(str);
    write(pf, str, strLen);
    //IC_Log_Error_WriteFile(str);

    //关闭文件
    close(pf);

    return;
}


void C_LJQ_LOG2(const char *file, int line,const char *fmt, ...)
{
    va_list args;


    //调用核心的写LOG函数
    va_start(args, fmt);
    C_LJQ_Error_Core2(file, line,fmt, args);
    va_end(args);

    return;
}


void main(int argc,char argv[])
{
    int value = 2;
    double dvalue = 0.5;
    char* str = "string test";
    hdslog("hdstestttt");
    hdslog("hdstestttt:%d\n",value);
    hdslog("hdstestttt:%f\n",dvalue);
    hdslog("hdstestttt:%s\n",str);

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用标准库函数`fprintf()`来将文本文件。使用该函数需要打开文件并将文件指针传递给`fprintf()`,然后通过格式化字符串来将要文件的内容传递给该函数。 下面是一个简单的例子,展示如何将日志文件: ```c #include <stdio.h> int main() { FILE *fp; char msg[] = "This is a log message.\n"; fp = fopen("log.txt", "a"); // 打开文件,并以追加方式入 if (fp == NULL) { printf("Failed to open file.\n"); return 1; } fprintf(fp, "%s", msg); // 将日志信息文件 fclose(fp); // 关闭文件 return 0; } ``` 在上面的代码中,我们先定义了一个字符串变量 `msg`,这个字符串就是我们要文件日志信息。然后我们使用`fopen()`函数打开文件,其中第一个参数是文件名,第二个参数是打开文件的模式,这里我们使用的是追加方式(`"a"`)打开文件,这样每次入都会在文件末尾追加。如果文件打开失败,`fopen()`函数会返回`NULL`。 接下来,我们使用`fprintf()`函数将日志信息文件,第一个参数是文件指针,第二个参数是格式化字符串,这里我们使用了`%s`占位符来表示要入的字符串。最后,我们使用`fclose()`函数关闭文件。 在实际应用中,我们可以将上面的代码封装成一个函数,方便在多个地方调用。注意,在多线程环境下,需要确保同一时刻只有一个线程在文件,否则可能会导致文件入冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值