zlog学习笔记(zc_profile)
zc_profile.h
#ifndef __zlog_profile_h
#define __zlog_profile_h #define EMPTY() #define zc_assert(expr, rc) \
if(!(expr)){ \
zc_error(#expr"is null or 0"); \
return rc; \
} /**
* 枚举类型,列举出所有profile支持的flag
*/
enum zc_profile_flag{
ZC_DEBUG = ,
ZC_WARN = ,
ZC_ERROR =
}; enum test {
A = ,
B = ,
C =
}; #define zc_debug(...) \
zc_profile_inner(ZC_DEBUG, __FILE__, __LINE__, __VA_ARGS__) #define zc_warn(...) \
zc_profile_inner(ZC_WARN, __FILE__, __LINE__, __VA_ARGS__) #define zc_error(...) \
zc_profile_inner(ZC_ERROR, __FILE__, __LINE__, __VA_ARGS__) int zc_profile_inner(int flag,
const char *file, const long line,
const char *fmt, ...); #endif
zc_profile.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h> #include "zc_profile.h" /**
* 获取当前时间字符串
*/
static void zc_time(char *time_str, size_t time_str_size){
time_t tt;
struct tm local_time; //获取当前系统时间戳
time(&tt);
//使用当前时间戳填充tm结构体, 相比localtime,线程安全
localtime_r(&tt, &local_time);
strftime(time_str, time_str_size, "%m-%d %T", &local_time); return ;
} int zc_profile_inner(int flag, const char *file, const long line, const char *fmt, ...){
va_list args;
char time_str[ + ];
FILE *fp = NULL; static char *debug_log = NULL;
static char *error_log = NULL;
//记录debug、error是否被初始化过
static size_t init_flag = ; if(!init_flag){
init_flag = ;
//stdlib getenv 获取环境变量
debug_log = getenv("ZLOG_PROFILE_DEBUG");
error_log = getenv("ZLOG_PROFILE_ERROR");
} switch(flag){
case ZC_DEBUG:
if(debug_log == NULL){
return ;
}
//以附加的方式打开只写文件
fp = fopen(debug_log, "a");
if(!fp){
return -;
}
zc_time(time_str, sizeof(time_str));
//将格式化的字符写入文件
/**
* 将格式化的字符写入文件
* sys/types.h
* unistd.h
* pid_t getpid(void)
*/
fprintf(fp, "%s DEBUG (%d:%s:%ld) ", time_str, getpid(), file, line);
break;
case ZC_WARN:
if(error_log == NULL){
return ;
}
fp = fopen(debug_log, "a");
if(!fp){
return -;
}
zc_time(time_str, sizeof(time_str));
fprintf(fp, "%s WARN (%d:%s:%ld) ", time_str, getpid(), file, line);
break;
case ZC_ERROR:
if(error_log == NULL){
return ;
}
fp = fopen(debug_log, "a");
if(!fp){
return -;
}
zc_time(time_str, sizeof(time_str));
fprintf(fp, "%s ERROR (%d:%s:%ld) ", time_str, getpid(), file, line);
break;
} va_start(args, fmt);
vfprintf(fp, fmt, args);
va_end(args);
fprintf(fp, "\n"); fclose(fp);
return ;
}
zlog学习笔记(zc_profile)的更多相关文章
- zlog学习笔记(mdc)
mdc.h #ifndef __zlog_mdc_h #define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_m ...
- zlog学习笔记(level_list)
level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_l ...
- zlog学习笔记(level)
level.h /** * */ #ifndef __zlog_level_h #define __zlog_level_h #include "stdio.h" #include ...
- zlog学习笔记(zc_hashtable)
zc_hashtable.h /** * hashtable */ #ifndef __zc_hashtable_h #define __zc_hashtable_h typedef struct z ...
- zlog学习笔记(zc_arraylist)
zc_arraylist.h /** * 实现类似列表的功能 * */ #ifndef __zc_arraylist_h #define __zc_arraylist_h #define ARRAY_ ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- Android studio .9图片造成的错误总结
前言,今天早晨遇到一个很奇葩的问题,导致我花费了很长的时间来解决.从eclipse 项目里复制过来4张.9图片,粘贴到android studio 项目里, 一运行发现报错,开始是 找不到这几张.9图 ...
- 2016最新CocoaPods安装和错误解决 + 自己的经验
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Times; color: #333333; background-color: #fffff ...
- 安装和使用cocoapods
第一步:查看自己电脑的Ruby环境:gem sources -l 1.如果已经是taobao镜像了[https://ruby.taobao.org/],此时不需要环境的修改了,直接进入第二步 2.(1 ...
- Selenium Test 自动化测试 入门级学习笔记
1.下载安装Firefox-selenium插件 需要下载插件可以联系,这里暂不提供下载地址. 2.集成Eclipse 需要下载jar包可以联系,这里暂不提供下载地址. 集成Eclipse非常简单,加 ...
- 为什么Java中字符串是不可变的
前言 在Java中,字符串是一个不可变的类,一个不可变的类指的是它的实例对象不能被修改,所有关于这个对象的信息在这个对象被创建时已初始化且不能被改变. 不可变类有很多优势,这篇文章总结了字符串类之所以 ...
- android中的万能适配器BaseAdapter的总结
有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮.添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上.但是事实并非这样,因为按钮是 ...
- 十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置
我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...
- spring hibernate摘记
一.spring 1.ContextLoaderListener 它作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextLi ...
- IntelliJ IDEA14.1中java项目Maven中没有配置JDK时的问题
在IntelliJ IDEA 14.1中使用在java项目中使用Maven时当没有在Maven中配置JDK编译版本.源码版本时,IDEA将默认的编译版本.源码版本设置为jdk5. 在IDEA中Lang ...
- 烂泥:学习ubuntu远程桌面(二):远程桌面会话管理
本文由秀依林枫提供友情赞助,首发于烂泥行天下 在上一篇文章中,我们讲解了如何给ubuntu安装远程桌面及其配置,这篇文章我们再来讲解下有关ubuntu远程桌面会话的问题. 一.问题描述 在我们使用ub ...