shttpd 日志

#include "defs.h"

/*
* Log function
*/
void
_shttpd_elog(int flags, struct conn *c, const char *fmt, ...)
{
     char     date[64], buf[URI_PATH_MAX];
     int     len;
     FILE     *fp = c == NULL ? NULL : c->ctx->error_log;
     va_list     ap;

     /* Print to stderr */
     if (c == NULL || !IS_TRUE(c->ctx, OPT_INETD)) {
          va_start(ap, fmt);
          (void) vfprintf(stderr, fmt, ap);
          (void) fputc('\n', stderr);
          va_end(ap);
     }

     strftime(date, sizeof(date), "%a %b %d %H:%M:%S %Y",
         localtime(&_shttpd_current_time));

     len = _shttpd_snprintf(buf, sizeof(buf),
         "[%s] [error] [client %s] \"%s\" ",
         date, c ? inet_ntoa(c->sa.u.sin.sin_addr) : "-",
         c && c->request ? c->request : "-");

     va_start(ap, fmt);
     (void) vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
     va_end(ap);

     buf[sizeof(buf) - 1] = '\0';

     if (fp != NULL && (flags & (E_FATAL | E_LOG))) {
          (void) fprintf(fp, "%s\n", buf);
          (void) fflush(fp);
     }

     if (flags & E_FATAL)
          exit(EXIT_FAILURE);
}

void
_shttpd_log_access(FILE *fp, const struct conn *c)
{
     static const struct vec     dash = {"-", 1};

     const struct vec     *user = &c->ch.user.v_vec;
     const struct vec     *referer = &c->ch.referer.v_vec;
     const struct vec     *user_agent = &c->ch.useragent.v_vec;
     char               date[64], buf[URI_PATH_MAX], *q1 = "\"", *q2 = "\"";

     if (user->len == 0)
          user = ‐

     if (referer->len == 0) {
          referer = ‐
          q1 = "";
     }

     if (user_agent->len == 0) {
          user_agent = ‐
          q2 = "";
     }

     (void) strftime(date, sizeof(date), "%d/%b/%Y:%H:%M:%S",
               localtime(&c->birth_time));

     (void) _shttpd_snprintf(buf, sizeof(buf),
         "%s - %.*s [%s %+05d] \"%s\" %d %lu %s%.*s%s %s%.*s%s",
         inet_ntoa(c->sa.u.sin.sin_addr), user->len, user->ptr,
         date, _shttpd_tz_offset, c->request ? c->request : "-",
         c->status, (unsigned long) c->loc.io.total,
         q1, referer->len, referer->ptr, q1,
         q2, user_agent->len, user_agent->ptr, q2);

     if (fp != NULL) {
          (void) fprintf(fp, "%s\n", buf);
          (void) fflush(fp);
     }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值