lighttpd1.4.16 库 (一)log 日志

 lighttpd的日志输出很简单,只有两个文件(因此代码没有注明行号)。

 

一、log.h头文件分析

 

摘录log.h文件代码如下

代码1

 

  1. #ifndef _LOG_H_
  2. #define _LOG_H_
  3. #include "server.h"
  4. #define WP() log_error_write(srv, __FILE__, __LINE__, "");
  5. int log_error_open(server *srv);
  6. int log_error_close(server *srv);
  7. int log_error_write(server *srv, const char *filename, unsigned int line, const char *fmt, ...);
  8. int log_error_cycle(server *srv);
  9. #endif

此头文件定义了日志输出所用到的函数,可以看出,真正的输出函数只有一个,就是log_error_write,而且不区分日志的级别。

 

宏定义WP,只是预先定义了文件名和行号,可变参数直接只有一个,就是""(空字符串),以方便输出。

 

二、log.c源文件。

我们重点看

int log_error_write(server *srv, const char *filename, unsigned int line, const char *fmt, ...) 函数

 

其他函数都是一般的普通的日志文件的写法。(创建或追加文件,关闭文件等)

 

log_error_write函数代码摘录如下:

代码2

 

  1. int log_error_write(server *srv, const char *filename, unsigned int line, const char *fmt, ...) {
  2.     va_list ap;
  3.     switch(srv->errorlog_mode) {
  4.     case ERRORLOG_FILE:
  5.     case ERRORLOG_STDERR:
  6.         /* cache the generated timestamp */
  7.         if (srv->cur_ts != srv->last_generated_debug_ts) {
  8.             buffer_prepare_copy(srv->ts_debug_str, 255);
  9.             strftime(srv->ts_debug_str->ptr, srv->ts_debug_str->size - 1, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts)));
  10.             srv->ts_debug_str->used = strlen(srv->ts_debug_str->ptr) + 1;
  11.             srv->last_generated_debug_ts = srv->cur_ts;
  12.         }
  13.         buffer_copy_string_buffer(srv->errorlog_buf, srv->ts_debug_str);
  14.         BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ": (");
  15.         break;
  16.     case ERRORLOG_SYSLOG:
  17.         /* syslog is generating its own timestamps */
  18.         BUFFER_COPY_STRING_CONST(srv->errorlog_buf, "(");
  19.         break;
  20.     }
  21.     buffer_append_string(srv->errorlog_buf, filename);
  22.     BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ".");
  23.     buffer_append_long(srv->errorlog_buf, line);
  24.     BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ") ");
  25.     for(va_start(ap, fmt); *fmt; fmt++) {
  26.         int d;
  27.         char *s;
  28.         buffer *b;
  29.         off_t o;
  30.         switch(*fmt) {
  31.         case 's':           /* string */
  32.             s = va_arg(ap, char *);
  33.             buffer_append_string(srv->errorlog_buf, s);
  34.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
  35.             break;
  36.         case 'b':           /* buffer */
  37.             b = va_arg(ap, buffer *);
  38.             buffer_append_string_buffer(srv->errorlog_buf, b);
  39.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
  40.             break;
  41.         case 'd':           /* int */
  42.             d = va_arg(ap, int);
  43.             buffer_append_long(srv->errorlog_buf, d);
  44.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
  45.             break;
  46.         case 'o':           /* off_t */
  47.             o = va_arg(ap, off_t);
  48.             buffer_append_off_t(srv->errorlog_buf, o);
  49.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
  50.             break;
  51.         case 'x':           /* int (hex) */
  52.             d = va_arg(ap, int);
  53.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "0x");
  54.             buffer_append_long_hex(srv->errorlog_buf, d);
  55.             BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
  56.             break;
  57.         case 'S':           /* string */
  58.             s = va_arg(ap, char *);
  59.             buffer_append_string(srv->errorlog_buf, s);
  60.             break;
  61.         case 'B':           /* buffer */
  62.             b = va_arg(ap, buffer *);
  63.             buffer_append_string_buffer(srv->errorlog_buf, b);
  64.             break;
  65.         case 'D':           /* int */
  66.             d = va_arg(ap, int);
  67.             buffer_append_long(srv->errorlog_buf, d);
  68.             break;
  69.         case '(':
  70.         case ')':
  71.         case '<':
  72.         case '>':
  73.         case ',':
  74.         case ' ':
  75.             buffer_append_string_len(srv->errorlog_buf, fmt, 1);
  76.             break;
  77.         }
  78.     }
  79.     va_end(ap);
  80.     switch(srv->errorlog_mode) {
  81.     case ERRORLOG_FILE:
  82.         BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "/n");
  83.         write(srv->errorlog_fd, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1);
  84.         break;
  85.     case ERRORLOG_STDERR:
  86.         BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "/n");
  87.         write(STDERR_FILENO, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1);
  88.         break;
  89.     case ERRORLOG_SYSLOG:
  90.         syslog(LOG_ERR, "%s", srv->errorlog_buf->ptr);
  91.         break;
  92.     }
  93.     return 0;
  94. }

分析此函数代码可以知道,日志输出实际上定义了自己可以解析的格式。

通常的日志输出有两种:

1、自定义格式输出。

2、使用系统的库函数printf支持的格式输出。

 

两者的比较:

1、定义自己的输出格式。(1)只解析自己定义的错误的格式,这样避免了接口调用者发生系统级的错误(2)调用者要重新学习按此接口提供的格式输出,如果输出格式定义设计要最大程度的满足调用者的需要

2、printf格式输出。(1)很好的兼容,不需要重新遵循新的接口定义。

(2)printf格式基本满足了调用者的最大需求,体现了printf输出格式f的灵活性。

 

lighttpd的日志输出文件没有自定义了文件名和行号的宏,所以使用的使用要手动加上文件名和行号,比较不方便。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值