tokyo tyrant源码分析-日志系统实现
2009-10-24 22:18
387 查看
enum { /* enumeration for logging levels */
TTLOGDEBUG, /* debug */
TTLOGINFO, /* information */
TTLOGERROR, /* error */
TTLOGSYSTEM /* system */
};
int g_loglevel = TTLOGINFO; /* global,default */
static void do_log(int level, const char *msg, void *opq){
if(level < g_loglevel) return;
LOGARG *arg = (LOGARG *)opq;
char date[48];
tcdatestrwww(INT64_MAX, INT_MAX, date);
char buf[LINEBUFSIZ];
int len = snprintf(buf, LINEBUFSIZ, "%s/t%s/n", date, msg);
tcwrite(arg ? arg->fd : 1, buf, len);
}
程序参数中关于log的选项:-ld (g_loglevel = TTLOGDEBUG), -le (g_loglevel = TTLOGERROR)
tyrant的日志系统实现的很简单,4个level,默认为INFO,可以在通过运行时参数设置为DEBUG或ERROR。低于指定level的msg直接忽略,高的记录到文件或输出到STDOUT。
程序启动时,arg->fd = 1,这时开始检查用户指定参数的有效性,因无效参数而报出的warning都输出到STDOUT(==1)。然后才设置arg->fd为用户参数"-log"指定的文件(当然如果不指定该参数就继续输出到STDOUT)。
**很多重要的warning,包括一些参数的错误,都是用level INFO输出的,所以如果你指定"-le"(ERROR)的话,你将看不到它们!
系统没提供参数让用户指定level SYSTEM是因为很多错误信息都是用level ERROR输出的,用户不应忽略它们。
我推荐使用者就使用默认的level INFO,很多有用的出错提示都是都是在这个level输出的,而且和level ERROR相比基本不会降低程序性能
。如果用于调试或实验,可以用level DEBUG,能得到更多信息。
当然,这只是普遍情况。很少数的情况,比如你用MASK参数禁止了tyrant的某个命令的使用,而客户端又大量发送这个命令的请求时,就会
有大量level INFO的信息输出。实际中你应该视你的log输出量决定,如果level INFO的输出量并不大,就用它。
有人可能担心在需要高频率执行、对性能要求苛刻的代码片段中使用log输出函数的负面影响:在生产环境中虽然调高了log level,但频繁的函数调用开销不可避免。解决办法很简单:使用宏。比如把level的判定拿出来,放到宏中。
TTLOGDEBUG, /* debug */
TTLOGINFO, /* information */
TTLOGERROR, /* error */
TTLOGSYSTEM /* system */
};
int g_loglevel = TTLOGINFO; /* global,default */
static void do_log(int level, const char *msg, void *opq){
if(level < g_loglevel) return;
LOGARG *arg = (LOGARG *)opq;
char date[48];
tcdatestrwww(INT64_MAX, INT_MAX, date);
char buf[LINEBUFSIZ];
int len = snprintf(buf, LINEBUFSIZ, "%s/t%s/n", date, msg);
tcwrite(arg ? arg->fd : 1, buf, len);
}
程序参数中关于log的选项:-ld (g_loglevel = TTLOGDEBUG), -le (g_loglevel = TTLOGERROR)
tyrant的日志系统实现的很简单,4个level,默认为INFO,可以在通过运行时参数设置为DEBUG或ERROR。低于指定level的msg直接忽略,高的记录到文件或输出到STDOUT。
程序启动时,arg->fd = 1,这时开始检查用户指定参数的有效性,因无效参数而报出的warning都输出到STDOUT(==1)。然后才设置arg->fd为用户参数"-log"指定的文件(当然如果不指定该参数就继续输出到STDOUT)。
**很多重要的warning,包括一些参数的错误,都是用level INFO输出的,所以如果你指定"-le"(ERROR)的话,你将看不到它们!
系统没提供参数让用户指定level SYSTEM是因为很多错误信息都是用level ERROR输出的,用户不应忽略它们。
我推荐使用者就使用默认的level INFO,很多有用的出错提示都是都是在这个level输出的,而且和level ERROR相比基本不会降低程序性能
。如果用于调试或实验,可以用level DEBUG,能得到更多信息。
当然,这只是普遍情况。很少数的情况,比如你用MASK参数禁止了tyrant的某个命令的使用,而客户端又大量发送这个命令的请求时,就会
有大量level INFO的信息输出。实际中你应该视你的log输出量决定,如果level INFO的输出量并不大,就用它。
有人可能担心在需要高频率执行、对性能要求苛刻的代码片段中使用log输出函数的负面影响:在生产环境中虽然调高了log level,但频繁的函数调用开销不可避免。解决办法很简单:使用宏。比如把level的判定拿出来,放到宏中。
相关文章推荐
- 系统学习深度学习(四) --CNN原理,推导及实现源码分析
- AWStats 日志分析系统(含源码包)
- 利用Kafka, Cloudera Search以及Hue实现实时日志分析系统
- Ceilometer项目源码分析----ceilometer分布式报警系统的具体实现(1)
- android日志系统源码分析
- 【7. 日志分析模块】云跳板机服务系统设计及实现
- Android屏幕截图实现方式 & 系统截屏源码分析和三指截屏
- <系统安全运维> Server 2008 R2 事件查看器实现日志分析
- Android 系统源码情景分析读书笔记(2)----Logger 日志系统
- 分布式系统Hadoop源码阅读与分析(一):作业调度器实现机制
- Android日志系统第三方库------Logger 源码分析
- tokyo tyrant源码分析-主从复制实现
- Docker源码分析之容器日志处理与log-driver实现
- Ceilometer项目源码分析----ceilometer分布式报警系统的具体实现(2)
- 《hadoop进阶》web日志系统 KPI指标的分析与实现
- 使用perl+MongoDB实现一个WEB站点请求耗时日志分析系统
- Android 日志系统(Logcat)的实现分析
- slf4j绑定log4j2日志系统的过程(源码分析)
- 分布式日志收集系统: Facebook Scribe之结构及源码分析
- ELK 实现 Java 分布式系统日志分析架构