实现了传输进去的字符串所在的文档,函数和行数显示功能。

实现了将传入的可变参数打印到日志功能。

  1. #include<stdio.h>
  2. #include<stdarg.h>
  3. #include<string.h>
  4.  
  5. const char * g_path = "/home/exbot/wangqinghe/log.txt";
  6. #define LOG(fmt,...) my_fprintf(__FILE__,__FUNCTION__,__LINE__,fmt,##__VA_ARGS__)
  7.  
  8. int my_fprintf(const char *pFileName,const char *pFunName,const long lLine,const char* fmt,...)
  9. {
  10. printf("%s-%s-%d\n",__FILE__,__FUNCTION__,__LINE__);
  11. int iRet = -;
  12. int i = ;
  13. va_list args;
  14. va_start(args,fmt);
  15. FILE* fp = NULL;
  16. fp = fopen(g_path,"at+");
  17.  
  18. int nFileNameLen = strlen(pFileName);
  19. char szLine[] = {};
  20. sprintf(szLine,"%ld",lLine);
  21. int nLineLen = strlen(szLine);
  22. int nSpaceLen = - nFileNameLen - nLineLen;
  23. for(i = ; i < nSpaceLen; ++i)
  24. {
  25. fwrite(" ",,,fp);
  26. }
  27. fprintf(fp,"%s:%ld ",pFileName,lLine);
  28. iRet = vfprintf(fp,fmt,args);
  29. printf("iRet = %d\n",iRet);
  30. va_end(args);
  31. fflush(fp);
  32. fclose(fp);
  33. return iRet;
  34. }
  35.  
  36. int main()
  37. {
  38. char *p = "this is my first debug";
  39. printf("%s-%s-%d\n",__FILE__,__func__,__LINE__);
  40. LOG("%s %d\n",p,);
  41. return ;
  42. }

输出结果:

exbot@ubuntu:~/wangqinghe/C/20190703$ gcc log.c -o log

exbot@ubuntu:~/wangqinghe/C/20190703$ ./log

log.c-main-41

log.c-my_fprintf-10

iRet = 25

在/home/exbot/wangqinghe/log.txt中有如下输出结果:

简单化版:

  1. #include<stdio.h>
  2. #include<stdarg.h>
  3. #include<string.h>
  4.  
  5. const char * g_path = "/home/exbot/wangqinghe/log.txt";
  6. #define LOG(fmt,...) my_fprintf(__FILE__,__FUNCTION__,__LINE__,fmt,##__VA_ARGS__)
  7.  
  8. int my_fprintf(const char *pFileName,const char *pFunName,const long lLine,const char* fmt,...)
  9. {
  10. printf("%s-%s-%d\n",__FILE__,__FUNCTION__,__LINE__);
  11. int iRet = -;
  12. int i = ;
  13. va_list args;
  14. va_start(args,fmt);
  15. FILE* fp = NULL;
  16. fp = fopen(g_path,"at+");
  17. fprintf(fp,"%s:%ld ",pFileName,lLine);
  18. iRet = vfprintf(fp,fmt,args); //使用参数列表发送格式化输出到流stream中
  19. printf("iRet = %d\n",iRet);
  20. va_end(args);
  21. fflush(fp);
  22. fclose(fp);
  23. return iRet;
  24. }
  25.  
  26. int main()
  27. {
  28. char *p = "this is my first debug";
  29. printf("%s-%s-%d\n",__FILE__,__func__,__LINE__);
  30. LOG("%s %d\n",p,);
  31. //getchar();
  32. return ;
  33. }

输出结果:

Linux 打印可变参数日志的更多相关文章

  1. _vsnprintf在可变参数打印中的用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...

  2. Redis源码笔记--服务器日志和函数可变参数处理server.c

    前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...

  3. C语言的可变参数在Linux(Ubuntu)与Windows下注意点

    基本上C语言的可变参数原理在不同平台和不同编译器下基本类似(通过函数入栈,从右向左,从高位到低位地址),不过部分实现会有所不同:在使用中需要注意的是: va_list 为char 类型指针,部分调用如 ...

  4. jpa hibernate 打印sql,format日志,打印SQL参数,打印什么指令

    环境说明:IntelliJ IDEA 2017.3.4 版本:SpringBoot 2.0.0.RELEASE:hibernate用的是JPA自带. 打印SQL 到控制台: 首先,我使用的是appli ...

  5. 利用可变参数打印log

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...

  6. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  7. C语言可变参数在宏定义中的应用

    在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用 ...

  8. C语言中可变参数的用法

    原文地址: http://blog.csdn.net/wooin/archive/2006/04/29/697106.aspx   我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() ...

  9. Linux 下实时查看日志

    Linux 下实时查看日志 cat /var/log/*.log 如果日志在更新,如何实时查看 tail -f /var/log/messages 还可以使用 watch -d -n 1 cat /v ...

随机推荐

  1. k8s遇坑:The connection to the server k8s-api.virtual.local:6443 was refused - did you specify the right host or port?

    k8s坑The connection to the server localhost:8080 was refused - did you specify the right host or port ...

  2. Java 反射理解(一)-- Class 类的使用

    Java 反射理解(一)-- Class 类的使用 概念 这里阐述几个基本概念: 在面向对象的世界里,万事万物皆对象.(在 Java 语言中,静态的成员.普通数据类型除外) 类也是对象,类是 java ...

  3. the specified service is marked as deletion,can not find the file specified

    使用命令注册windows service sc create CCGSQueueService binpath= "D:\DKX4003\services\xxx.xx.xx\xxx.ex ...

  4. 怎样在 js 中实现 反转字符串 的功能?

    "string".split('').reverse().join('');

  5. JS ES5

    常用 严格模式 use strict 必须使用var声明变量 禁止自定义函数this指向window 'use strict' funcion Person(name){ this.name = na ...

  6. js二维数组转一维数组

    方法一 利用es5的arr.reduce(callback[, initialValue])实现 var arr1 = [[0, 1], [2, 3], [4, 5]]; var arr2 = arr ...

  7. vue学习(3)-增删改查

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. day10 mysql常用操作

    一. 目录 1.mysql的简介 2.增删改查操作 3.单表查询 4.多表查询常见的三种方式 5.pymysql模块操作数据库 二. 内容 一.mysql的简介  概述:mysql是一个关系型数据库, ...

  9. 始终让footer在底部

    1.footer保持在页面底部 需求: 我们希望footer能在窗口最底端,但是由于页面内容太少,无法将内容区域撑开,从而在 footer 下面会留下一大块空白 第一种方法:采用 flexbox布局模 ...

  10. 基于Openresty+Naxsi的WAF:从小白到实践

    序 2019年2月18日,加入妈妈网,至今已经有四个月的时间,上周进到一个网关项目组,这个项目的主要目的是基于openResty+Naxsi实现WAF,相关技术初定涉及到openResty.Lua.N ...