⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_log_config.c

📁 apache简化版
💻 C
📖 第 1 页 / 共 3 页
字号:
    orig = r;    while (orig->prev) {        orig = orig->prev;    }    while (r->next) {        r = r->next;    }    for (i = 0; i < format->nelts; ++i) {        strs[i] = process_item(r, orig, &items[i]);    }    for (i = 0; i < format->nelts; ++i) {        len += strl[i] = strlen(strs[i]);    }#ifdef BUFFERED_LOGS    if (len + cls->outcnt > LOG_BUFSIZE) {        flush_log(cls);    }    if (len >= LOG_BUFSIZE) {        str = ap_palloc(r->pool, len + 1);        for (i = 0, s = str; i < format->nelts; ++i) {            memcpy(s, strs[i], strl[i]);            s += strl[i];        }        write(cls->log_fd, str, len);    }    else {        for (i = 0, s = &cls->outbuf[cls->outcnt]; i < format->nelts; ++i) {            memcpy(s, strs[i], strl[i]);            s += strl[i];        }        cls->outcnt += len;    }#else    str = ap_palloc(r->pool, len + 1);    for (i = 0, s = str; i < format->nelts; ++i) {        memcpy(s, strs[i], strl[i]);        s += strl[i];    }    write(cls->log_fd, str, len);#endif    return OK;}static int multi_log_transaction(request_rec *r){    multi_log_state *mls = ap_get_module_config(r->server->module_config,                                             &config_log_module);    config_log_state *clsarray;    int i;    if (mls->config_logs->nelts) {        clsarray = (config_log_state *) mls->config_logs->elts;        for (i = 0; i < mls->config_logs->nelts; ++i) {            config_log_state *cls = &clsarray[i];            config_log_transaction(r, cls, mls->default_format);        }    }    else if (mls->server_config_logs) {        clsarray = (config_log_state *) mls->server_config_logs->elts;        for (i = 0; i < mls->server_config_logs->nelts; ++i) {            config_log_state *cls = &clsarray[i];            config_log_transaction(r, cls, mls->default_format);        }    }    return OK;}/***************************************************************** * * Module glue... */static void *make_config_log_state(pool *p, server_rec *s){    multi_log_state *mls = (multi_log_state *) ap_palloc(p, sizeof(multi_log_state));    mls->config_logs = ap_make_array(p, 1, sizeof(config_log_state));    mls->default_format_string = NULL;    mls->default_format = NULL;    mls->server_config_logs = NULL;    mls->formats = ap_make_table(p, 4);    ap_table_setn(mls->formats, "CLF", DEFAULT_LOG_FORMAT);    return mls;}/* * Use the merger to simply add a pointer from the vhost log state * to the log of logs specified for the non-vhost configuration.  Make sure * vhosts inherit any globally-defined format names. */static void *merge_config_log_state(pool *p, void *basev, void *addv){    multi_log_state *base = (multi_log_state *) basev;    multi_log_state *add = (multi_log_state *) addv;    add->server_config_logs = base->config_logs;    if (!add->default_format) {        add->default_format_string = base->default_format_string;        add->default_format = base->default_format;    }    add->formats = ap_overlay_tables(p, base->formats, add->formats);    return add;}/* * Set the default logfile format, or define a nickname for a format string. */static const char *log_format(cmd_parms *cmd, void *dummy, char *fmt,                              char *name){    const char *err_string = NULL;    multi_log_state *mls = ap_get_module_config(cmd->server->module_config,                                             &config_log_module);    /*     * If we were given two arguments, the second is a name to be given to the     * format.  This syntax just defines the nickname - it doesn't actually     * make the format the default.     */    if (name != NULL) {        parse_log_string(cmd->pool, fmt, &err_string);        if (err_string == NULL) {            ap_table_setn(mls->formats, name, fmt);        }    }    else {        mls->default_format_string = fmt;        mls->default_format = parse_log_string(cmd->pool, fmt, &err_string);    }    return err_string;}static const char *add_custom_log(cmd_parms *cmd, void *dummy, char *fn,                                  char *fmt){    const char *err_string = NULL;    multi_log_state *mls = ap_get_module_config(cmd->server->module_config,                                             &config_log_module);    config_log_state *cls;    cls = (config_log_state *) ap_push_array(mls->config_logs);    cls->fname = fn;    cls->format_string = fmt;    if (!fmt) {        cls->format = NULL;    }    else {        cls->format = parse_log_string(cmd->pool, fmt, &err_string);    }    cls->log_fd = -1;    return err_string;}static const char *set_transfer_log(cmd_parms *cmd, void *dummy, char *fn){    return add_custom_log(cmd, dummy, fn, NULL);}static const char *set_cookie_log(cmd_parms *cmd, void *dummy, char *fn){    return add_custom_log(cmd, dummy, fn, "%{Cookie}n \"%r\" %t");}static const command_rec config_log_cmds[] ={    {"CustomLog", add_custom_log, NULL, RSRC_CONF, TAKE2,     "a file name and a custom log format string or format name"},    {"TransferLog", set_transfer_log, NULL, RSRC_CONF, TAKE1,     "the filename of the access log"},    {"LogFormat", log_format, NULL, RSRC_CONF, TAKE12,     "a log format string (see docs) and an optional format name"},    {"CookieLog", set_cookie_log, NULL, RSRC_CONF, TAKE1,     "the filename of the cookie log"},    {NULL}};static config_log_state *open_config_log(server_rec *s, pool *p,                                         config_log_state *cls,                                         array_header *default_format){    if (cls->log_fd > 0) {        return cls;             /* virtual config shared w/main server */    }    if (cls->fname == NULL) {        return cls;             /* Leave it NULL to decline.  */    }    if (*cls->fname == '|') {        piped_log *pl;        pl = ap_open_piped_log(p, cls->fname + 1);        if (pl == NULL) {            exit(1);        }        cls->log_fd = ap_piped_log_write_fd(pl);    }    else {        char *fname = ap_server_root_relative(p, cls->fname);        if ((cls->log_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) {            ap_log_error(APLOG_MARK, APLOG_ERR, s,                         "httpd: could not open transfer log file %s.", fname);            exit(1);        }    }#ifdef BUFFERED_LOGS    cls->outcnt = 0;#endif    return cls;}static config_log_state *open_multi_logs(server_rec *s, pool *p){    int i;    multi_log_state *mls = ap_get_module_config(s->module_config,                                             &config_log_module);    config_log_state *clsarray;    const char *dummy;    const char *format;    if (mls->default_format_string) {	format = ap_table_get(mls->formats, mls->default_format_string);	if (format) {	    mls->default_format = parse_log_string(p, format, &dummy);	}    }        if (!mls->default_format) {        mls->default_format = parse_log_string(p, DEFAULT_LOG_FORMAT, &dummy);    }    if (mls->config_logs->nelts) {        clsarray = (config_log_state *) mls->config_logs->elts;        for (i = 0; i < mls->config_logs->nelts; ++i) {            config_log_state *cls = &clsarray[i];	    if (cls->format_string) {		format = ap_table_get(mls->formats, cls->format_string);		if (format) {		    cls->format = parse_log_string(p, format, &dummy);		}	    }            cls = open_config_log(s, p, cls, mls->default_format);        }    }    else if (mls->server_config_logs) {        clsarray = (config_log_state *) mls->server_config_logs->elts;        for (i = 0; i < mls->server_config_logs->nelts; ++i) {            config_log_state *cls = &clsarray[i];	    if (cls->format_string) {		format = ap_table_get(mls->formats, cls->format_string);		if (format) {		    cls->format = parse_log_string(p, format, &dummy);		}	    }            cls = open_config_log(s, p, cls, mls->default_format);        }    }    return NULL;}static void init_config_log(server_rec *s, pool *p){    /* First, do "physical" server, which gets default log fd and format     * for the virtual servers, if they don't override...     */    open_multi_logs(s, p);    /* Then, virtual servers */    for (s = s->next; s; s = s->next) {        open_multi_logs(s, p);    }}#ifdef BUFFERED_LOGSstatic void flush_all_logs(server_rec *s, pool *p){    multi_log_state *mls;    array_header *log_list;    config_log_state *clsarray;    int i;    for (; s; s = s->next) {        mls = ap_get_module_config(s->module_config, &config_log_module);        log_list = NULL;        if (mls->config_logs->nelts) {            log_list = mls->config_logs;        }        else if (mls->server_config_logs) {            log_list = mls->server_config_logs;        }        if (log_list) {            clsarray = (config_log_state *) log_list->elts;            for (i = 0; i < log_list->nelts; ++i) {                flush_log(&clsarray[i]);            }        }    }}#endifmodule MODULE_VAR_EXPORT config_log_module ={    STANDARD_MODULE_STUFF,    init_config_log,            /* initializer */    NULL,                       /* create per-dir config */    NULL,                       /* merge per-dir config */    make_config_log_state,      /* server config */    merge_config_log_state,     /* merge server config */    config_log_cmds,            /* command table */    NULL,                       /* handlers */    NULL,                       /* filename translation */    NULL,                       /* check_user_id */    NULL,                       /* check auth */    NULL,                       /* check access */    NULL,                       /* type_checker */    NULL,                       /* fixups */    multi_log_transaction,      /* logger */    NULL,                       /* header parser */    NULL,                       /* child_init */#ifdef BUFFERED_LOGS    flush_all_logs,             /* child_exit */#else    NULL,#endif    NULL                        /* post read-request */};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -