vsnprintf日志中打印程序名和行号实例

在Linux C/C++程序中打印日志时,可能会由于需要打印未知个数的变量参数,那么vsnprintf函数就排上用场了。这里使用一个简单的C程序例子,演示在打印源程序文件名和该打印函数所在的行号的同时,使用vsnprintf函数打印个数未知的参数变量。

1 完整程序

代码比较简单,如果需要把内容打印在日志文件中的话,还需要调用文件处理函数。为了便于理解,这里直接把内容输出到控制台上了。需要说明的三个地方:

静态全局变量 c_FileName 和 i_FileLineNum 分别用于存储源程序文件名和打印函数所在的行号;
自定义标识符 PRINT 先调用源程序文件名和行号的赋值函数 Get_File_Line ,然后调用个数未知的参数的处理函数 F_vsnprintf;

类似于sprintf和snprintf这两个函数,相比vsprintf函数,vsnprintf加了最大字节( MAXBYTES )的限制,防止内存溢出。

具体代码如下:

 

 代码如下 复制代码

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

#define FILENAME_LEN 100
#define MAXLINE 1024
#define MAXBYTES 50

static char c_FileName[FILENAME_LEN];
static int  i_FileLineNum;

//Self-define a function which can print the name and line-number of the source file calling it.
#define PRINT Get_File_Line( __FILE__, __LINE__ );\
              F_vsnprintf

/**
 * Get the linenum and filename of the source file.
 * @Para-in:        p_FileName: The name of the source file.
 * @Para-in:        i_FileLine: The line-number of the source file.
 */
void Get_File_Line( char *p_FileName, int i_FileLine )
{
    strcpy( c_FileName, p_FileName );
    i_FileLineNum = i_FileLine;
    return;
}

/**
 * Print the arguments according to the first argument, name as fmt.
 */
void F_vsnprintf( char *fmt, ... )
{
    char buf[MAXLINE] = {0x00};
    snprintf( buf, MAXBYTES, "[%s:%d] ", c_FileName, i_FileLineNum );
    va_list ap;
    va_start( ap, fmt );
    vsnprintf( buf+strlen(buf), MAXLINE, fmt, ap );
    va_end( ap );

    strcat( buf, "\n" );
    fflush( stdout );

    fputs( buf, stderr );
    fflush( NULL );
    return;
}

int main( int argc, char **argv )
{
    PRINT( "[%s]", "Hello." );
    PRINT( "[%s %s]", "Hello", "world." );
    return 0;
}

时间: 2024-09-18 14:26:51

vsnprintf日志中打印程序名和行号实例的相关文章

logback的Logger之上封装了一层,如何打印正确的行号?

问题描述 由于某些变量要频繁打印,而我又不想每次都用logger.info函数来一个一个地打印这些变量,于是我用一个新的类封装了Logger,例如:publicstaticclassMyLogger{Loggerlogger=...publicstaticvoidinfo(Stringmsg,String...args){...}}但是运行MyLogger.info的时候打印出来的行号却是MyLogger类中的info函数的所在行的行号.我想打印出真实的行号,除了修改logback源码或者以下网

c++-C++ 6.0中goto语句和行号之间的关系是什么

问题描述 C++ 6.0中goto语句和行号之间的关系是什么 C++ 6.0语言中的行号是不是就相当于指针?怎么样把代码行转换为函数指针?有没有库函数的实现? 解决方案 goto语句和指针有什么关系?函数才相当于指针.你可以把代码拆分成很多函数. 解决方案二: 行号1-n 是左边那个显示第几行的吧 goto 语句跟他没关系 例如:goto 基本用法 main(){ int i=0; loop: i++; if(i>9) { printf("数大于9") }: else { got

asp.net获取ListView与gridview中当前行的行号_实用技巧

本文实例讲述了asp.net获取ListView与gridview中当前行的行号.分享给大家供大家参考,具体如下: aspx中,在gridview/ListView中,有一模板列,就叫linkbutton,想单击它时,获取它所在行的索引值 ListView中: 第一种: <ItemTemplate> <tr> <td> <asp:LinkButton runat="server" ID="btnSelected" Text=

mac/linux中vim永久显示行号、开启语法高亮

步骤1:   cp /usr/share/vim/vimrc ~/.vimrc   先复制一份vim配置模板到个人目录下   注:redhat 改成 cp /etc/vimrc ~/.vimrc 步骤2:   vi ~/.vimrc   进入insert模式,在最后加二行   syntax on   set nu! 保存收工.   最后附上其它选项(从网上淘来的) set nocompatible                 "去掉有关vi一致性模式,避免以前版本的bug和局限     se

js获取table行数:js获取table中鼠标点的行号和内容

<html><head><script language="javascript">function doclick(){var td = event.srcelement; // 通过event.srcelement 获取激活事件的对象 tdalert("行号:" + (td.parentelement.rowindex + 1) + ",内容:" + td.innertext);var tab = docu

Eclipse中自动激活和显示行号设置

1. 设置自动激活(auto-activation) 自动激活默认延迟500ms, 可以修改为1ms, 响应快速, 设置位置:Window->Preferences, 具体如下图: 2. 设置显示行号(show line numbers) 设置位置: Window->Preferences, 具体如下图: 作者:csdn博客 Mystra 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

PowerShell中捕获异常时的行号和列号的方法_PowerShell

如果自己写函数动态地去执行一些脚本块或者脚本文件,那么捕获到异常时行号和列号信息非常有用.例如脚本文件: 复制代码 代码如下: trap{ $info=$_.InvocationInfo "在第{0}行,第{1}列捕获到异常:{2}" -f $info.ScriptLineNumber,$info.OffsetInLine ,$_.Exception.Message continue }   get-date 1gb/2kb Get-Service | foreach {1/0} 执行

PHP获取指定函数定义在哪个文件中以及其所在的行号实例_php技巧

当调试开源的代码时,希望查看某个函数的定义,那么就需要定位其位置.在 zend studio 这样的 IDE 中自是可以自动提示到,但当没有安装这样的开发工具时,我们可以怎么办呢?参考如下一段代码,或许就包含你所需的. 复制代码 代码如下: <?phpfunction a() {} class b {    public function f() {    }} function function_dump($funcname) {    try {        if(is_array($fu

SQL Server中查询时显示行号的方法

server|显示 Select no=Identity(int,1,1),* Into #temptable From TableName --Order By SortFieldSelect * From #temptable  --Where no>=6 And no < 10Drop Table #temptable转自:动态网制作指南 www.knowsky.com