c语言可变参数日志,C语言可变参数日志函数

本文介绍了如何在C语言中创建一个可变参数的`writelog`函数,该函数接受一个日志级别和一个格式化的字符串作为输入,用于打印日志信息。函数首先获取当前时间,然后根据日志级别打印不同的前缀,接着使用`vfprintf`处理格式化字符串中的可变参数。如果日志文件大小超过设定阈值,函数还会将旧日志文件重命名备份。
摘要由CSDN通过智能技术生成

可变参数的C函数:写可变参数的C函数要在程序中用到以下这些宏:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

va在这里是variable-argument(可变参数)的意思.

这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个

头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数

参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值.

#include

#include

#include

#include

#include

#include

#include

#include

#define LOG_FILE_NAME         "log.txt"

#define LOG_MAX_BAK_SIZE       8192*1024     /* 错误记录文件的最大容量 */

int get_file_size(char *filename)  /*定义一个用来获取文件大小的函数*/

{

struct stat buf;

if(stat(filename, &buf)<0)

{

return 0;

}

return buf.st_size;

}

int writelog(int nLogLevel,char *pcFormat,...)

{

char  szBuf[16];

char  szRename[256];

int iRc=0;

memset(szBuf,0,sizeof(szBuf));

memset(szRename,0,sizeof(szRename));

time_t now;

now=time(NULL);

struct tm *tp;

tp =localtime(&now);

int iFileSize =0;

FILE *fp =NULL;

fp=fopen(LOG_FILE_NAME,"a+");

if(fp==NULL)

{

perror("open logfile");

exit(1);

}

chmod(LOG_FILE_NAME, 0755);//修改日志文件权限

iFileSize= get_file_size(LOG_FILE_NAME);

if (nLogLevel ==LOG_INFO ) {

strcpy(szBuf,"

}else if(nLogLevel==LOG_WARNING){

strcpy(szBuf,"

}else if(nLogLevel==LOG_ERR){

strcpy(szBuf,"

}else{

strcpy(szBuf,"~~~~~");

}

fprintf(fp,"%s %02d:%02d:%02d>",szBuf,tp->tm_hour,tp->tm_min,tp->tm_sec);

va_list  argptr;

va_start(argptr,pcFormat);

vfprintf(fp,pcFormat,argptr);

va_end(argptr);

if (iFileSize >= LOG_MAX_BAK_SIZE)

{

sprintf(szRename,"%s.(%02d:%02d:%02d)",LOG_FILE_NAME,tp->tm_hour,tp->tm_min,tp->tm_sec);

if ((iRc = rename(LOG_FILE_NAME, szRename)) != 0)

{

printf("fatal error occured ! iRc= %d error_no is %d\n",

iRc,errno);

printf("writelog: %s CANNOT BE RENAMED !\n",LOG_FILE_NAME);

return(-1);

}

}

fclose(fp);

fp=NULL;

return(0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值