c语言日志函数

本文介绍了一款纯C语言实现的日志记录库,支持动态配置日志级别及多种输出方式,包括控制台和文件输出。提供了简单的使用示例和配置文件说明,适用于Windows平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.   特性

l  纯c语言日志记录函数

l  调用简单,支持可变参数

l  支持配置文件动态调整日志级别

l  当前支持控制台与文件两种日志输出类型

2.   使用说明

2.1.  简单示例

#include <stdio.h> 
#include <stdlib.h> 
#include "bipub.h" 
#define PROGNAME "TestLog" 
 
int main(int argc, char *argv[]) 

  char fullPath[1024]={'/0'}; 
  int i; 
  int seconds1,seconds2; 
   
  srand((int)time(0)); 
  seconds1= time((time_t*)NULL); 
   
  //程序名称,源程序文件名称,参数个数,参数内容  
  if( logInitial(PROGNAME,"D://Dev-Cpp//bipub//bipub.exe",argc,argv) ) 
  { 
      printf("初始化错误"); 
      system("PAUSE");     
      return 1
  } 
   
  for(i=0; i<1; i++) 
  { 
      //记录日志,使用类似printf       
      logError ("****%s****","22222---2222"); 
  } 
 
  seconds2= time((time_t*)NULL); 
  printf("/n%d/n",seconds2-seconds1); 
  system("PAUSE");     
  return 0

2.2.  配置文件示例

{$qhbilog}

[Logger.root]

         level = info #注释1

         output = app,stdout

                   output.stdout.type = stdout

                   output.stdout.format = [%r]  [%p - %c(%n)]  [%t]  [%m]

                  

                   output.app.type=file

                   output.app.format = [%r]  [%p - %c(%n)]  [%t]  [%m]

                   output.app.file = D://data//temp//%p_%ld.log

文件名称参数支持:

p  :程序名

f  :文件名

o  :进程号

d  :日期 ,例如2010-11-12,ld代表紧凑格式,例如20101112

t  :时间戳,例如2005-12-13 15:58:50.248782,ld代表紧凑格式,例如20051213155850248782

日志参数支持:

p  :程序名

f  :文件名

o  :进程号

d  :日期 ,例如2010-11-12,ld代表紧凑格式,例如20101112

t  :时间戳,例如2005-12-13 15:58:50.248782,ld代表紧凑格式,例如20051213155850248782

m  : 输出代码中指定的消息

r  : 输出优先级

c  : 函数名

n  : 行号

常见日志格式:

日志格式:[%r]  [%p - %c(%n)]  [%t]  [%m]

生成示例:[Info ]  [TestLog - main(27)]  [2010-11-12 17:50:51.24825]  [****11111---1111****]

当前支持的日志级别::

trace

debug

info

warn

error

fatal

3.   性能

每秒1000条左右

4.   注意事项

l  使用前设置配置文件路径

l  不初始化是自动按照默认格式输出控制台日志

l  Windows平台的微秒级别时间为随机数

l  同一种日志类型,不支持多个不同名字的输出

直接贴代码造成页面打开过慢,下载查看

### C语言实现日志记录函数 在C语言中,可以通过自定义函数来实现日志记录功能。这通常涉及以下几个方面: - **日志初始化**:创建或打开指定路径的日志文件[^2]。 ```c int LogInit(const char *plogpath); ``` - **获取当前时间**:为了使日志条目具有时间戳,程序应使用`time()`函数获取系统当前时间,并通过`strftime()`将其格式化为易读的形式[^5]。 - **日志级别管理**:根据不同的严重程度(如DEBUG、INFO、WARN、ERROR),选择合适的标签附加到每条日志消息前。 - **实际的日志写入逻辑**:此部分负责将带有时间和级别的信息按照给定格式输出至控制台或者追加到文件末尾。这里可以采用标准库中的`fprintf()`配合可变参数列表(`va_list`)完成复杂的消息构建工作[^4]。 - **刷新缓存区**:每次写入后都应当调用`fflush()`确保数据即时同步到底层存储设备上。 下面给出一个简单的例子展示如何组合上述要素形成完整的日志记录接口: ```c #include <stdio.h> #include <stdarg.h> /* va_start, va_end */ #include <time.h> #define MAX_LOG_LEVEL 4 enum LogLevel { DEBUG, INFO, WARN, ERROR }; static FILE* log_file = NULL; void init_log(const char* path){ log_file = fopen(path,"a+"); if (!log_file) perror("Failed to open log file"); } void write_log(enum LogLevel level, const char* format,...){ time_t now; struct tm *now_tm; // Get current local time. time(&now); now_tm=localtime(&now); // Format the timestamp string. char timestr[20]; strftime(timestr,sizeof(timestr),"%Y-%m-%d %H:%M:%S",now_tm); // Prepare and output message with formatted arguments. fprintf(log_file,"%s [%s] ",timestr,get_level_str(level)); va_list args; va_start(args,format); vfprintf(log_file,format,args); va_end(args); fputc('\n',log_file); // Flush buffer immediately after writing a new line into it. fflush(log_file); } const char* get_level_str(enum LogLevel level){ static const char* levels[]={"DEBUG","INFO ","WARN ","ERROR"}; return ((level>=0 && level<MAX_LOG_LEVEL)?levels[level]:"UNKN "); } ``` 该示例展示了基本框架下的日志模块设计思路,其中包含了必要的组件以满足大多数应用场景的需求。当然,在具体应用时可能还需要考虑线程安全等问题以及更丰富的特性支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值