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

📄 mod_log_config.c

📁 Apache HTTP Server 是一个功能强大的灵活的与HTTP/1.1相兼容的web服务器.这里给出的是Apache HTTP服务器的源码。
💻 C
📖 第 1 页 / 共 4 页
字号:
{    int i;    multi_log_state *mls = ap_get_module_config(s->module_config,                                             &log_config_module);    config_log_state *clsarray;    const char *dummy;    const char *format;    if (mls->default_format_string) {        format = apr_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 = apr_table_get(mls->formats, cls->format_string);                if (format) {                    cls->format = parse_log_string(p, format, &dummy);                }            }            if (!open_config_log(s, p, cls, mls->default_format)) {                /* Failure already logged by open_config_log */                return DONE;            }        }    }    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 = apr_table_get(mls->formats, cls->format_string);                if (format) {                    cls->format = parse_log_string(p, format, &dummy);                }            }            if (!open_config_log(s, p, cls, mls->default_format)) {                /* Failure already logged by open_config_log */                return DONE;            }        }    }    return OK;}static apr_status_t flush_all_logs(void *data){    server_rec *s = data;    multi_log_state *mls;    apr_array_header_t *log_list;    config_log_state *clsarray;    buffered_log *buf;    int i;    if (!buffered_logs)        return APR_SUCCESS;        for (; s; s = s->next) {        mls = ap_get_module_config(s->module_config, &log_config_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) {                buf = clsarray[i].log_writer;                flush_log(buf);            }        }    }    return APR_SUCCESS;}static int init_config_log(apr_pool_t *pc, apr_pool_t *p, apr_pool_t *pt, server_rec *s){    int res;    /* First init the buffered logs array, which is needed when opening the logs. */    if (buffered_logs) {        all_buffered_logs = apr_array_make(p, 5, sizeof(buffered_log *));    }    /* Next, do "physical" server, which gets default log fd and format     * for the virtual servers, if they don't override...     */    res = open_multi_logs(s, p);    /* Then, virtual servers */    for (s = s->next; (res == OK) && s; s = s->next) {        res = open_multi_logs(s, p);    }    return res;}static void init_child(apr_pool_t *p, server_rec *s){    int mpm_threads;    ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);    /* Now register the last buffer flush with the cleanup engine */    if (buffered_logs) {        int i;        buffered_log **array = (buffered_log **)all_buffered_logs->elts;                apr_pool_cleanup_register(p, s, flush_all_logs, flush_all_logs);        for (i = 0; i < all_buffered_logs->nelts; i++) {            buffered_log *this = array[i];            #if APR_HAS_THREADS            if (mpm_threads > 1) {                apr_status_t rv;                this->mutex.type = apr_anylock_threadmutex;                rv = apr_thread_mutex_create(&this->mutex.lock.tm,                                             APR_THREAD_MUTEX_DEFAULT,                                             p);                if (rv != APR_SUCCESS) {                    ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,                                 "could not initialize buffered log mutex, "                                 "transfer log may become corrupted");                    this->mutex.type = apr_anylock_none;                }            }            else#endif            {                this->mutex.type = apr_anylock_none;            }        }    }}static void ap_register_log_handler(apr_pool_t *p, char *tag,                                     ap_log_handler_fn_t *handler, int def){    ap_log_handler *log_struct = apr_palloc(p, sizeof(*log_struct));    log_struct->func = handler;    log_struct->want_orig_default = def;    apr_hash_set(log_hash, tag, 1, (const void *)log_struct);}static void ap_log_set_writer_init(ap_log_writer_init *handle){    log_writer_init = handle;}static void ap_log_set_writer(ap_log_writer *handle){    log_writer = handle;}static apr_status_t ap_default_log_writer( request_rec *r,                           void *handle,                            const char **strs,                           int *strl,                           int nelts,                           apr_size_t len){    char *str;    char *s;    int i;    apr_status_t rv;    str = apr_palloc(r->pool, len + 1);    for (i = 0, s = str; i < nelts; ++i) {        memcpy(s, strs[i], strl[i]);        s += strl[i];    }    rv = apr_file_write((apr_file_t*)handle, str, &len);    return rv;}static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,                                         const char* name){    if (*name == '|') {        piped_log *pl;        pl = ap_open_piped_log(p, name + 1);        if (pl == NULL) {           return NULL;;        }        return ap_piped_log_write_fd(pl);    }    else {        const char *fname = ap_server_root_relative(p, name);        apr_file_t *fd;        apr_status_t rv;        if (!fname) {            ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,                            "invalid transfer log path %s.", name);            return NULL;        }        rv = apr_file_open(&fd, fname, xfer_flags, xfer_perms, p);        if (rv != APR_SUCCESS) {            ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,                            "could not open transfer log file %s.", fname);            return NULL;        }        return fd;    }}static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s,                                         const char* name){    buffered_log *b;    b = apr_pcalloc(p, sizeof(buffered_log));    b->handle = ap_default_log_writer_init(p, s, name);        if (b->handle) {        *(buffered_log **)apr_array_push(all_buffered_logs) = b;        return b;    }    else        return NULL;}static apr_status_t ap_buffered_log_writer(request_rec *r,                                           void *handle,                                            const char **strs,                                           int *strl,                                           int nelts,                                           apr_size_t len){    char *str;    char *s;    int i;    apr_status_t rv;    buffered_log *buf = (buffered_log*)handle;    if ((rv = APR_ANYLOCK_LOCK(&buf->mutex)) != APR_SUCCESS) {        return rv;    }    if (len + buf->outcnt > LOG_BUFSIZE) {        flush_log(buf);    }    if (len >= LOG_BUFSIZE) {        apr_size_t w;        str = apr_palloc(r->pool, len + 1);        for (i = 0, s = str; i < nelts; ++i) {            memcpy(s, strs[i], strl[i]);            s += strl[i];        }        w = len;        rv = apr_file_write(buf->handle, str, &w);            }    else {        for (i = 0, s = &buf->outbuf[buf->outcnt]; i < nelts; ++i) {            memcpy(s, strs[i], strl[i]);            s += strl[i];        }        buf->outcnt += len;        rv = APR_SUCCESS;    }    APR_ANYLOCK_UNLOCK(&buf->mutex);    return rv;}static int log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp){    static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register;        log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler);    if (log_pfn_register) {        log_pfn_register(p, "h", log_remote_host, 0);        log_pfn_register(p, "a", log_remote_address, 0 );        log_pfn_register(p, "A", log_local_address, 0 );        log_pfn_register(p, "l", log_remote_logname, 0);        log_pfn_register(p, "u", log_remote_user, 0);        log_pfn_register(p, "t", log_request_time, 0);        log_pfn_register(p, "f", log_request_file, 0);        log_pfn_register(p, "b", clf_log_bytes_sent, 0);        log_pfn_register(p, "B", log_bytes_sent, 0);        log_pfn_register(p, "i", log_header_in, 0);        log_pfn_register(p, "o", log_header_out, 0);        log_pfn_register(p, "n", log_note, 0);        log_pfn_register(p, "e", log_env_var, 0);        log_pfn_register(p, "V", log_server_name, 0);        log_pfn_register(p, "v", log_virtual_host, 0);        log_pfn_register(p, "p", log_server_port, 0);        log_pfn_register(p, "P", log_pid_tid, 0);        log_pfn_register(p, "H", log_request_protocol, 0);        log_pfn_register(p, "m", log_request_method, 0);        log_pfn_register(p, "q", log_request_query, 0);        log_pfn_register(p, "X", log_connection_status, 0);        log_pfn_register(p, "C", log_cookie, 0);        log_pfn_register(p, "r", log_request_line, 1);        log_pfn_register(p, "D", log_request_duration_microseconds, 1);        log_pfn_register(p, "T", log_request_duration, 1);        log_pfn_register(p, "U", log_request_uri, 1);        log_pfn_register(p, "s", log_status, 1);    }    return OK;}static void register_hooks(apr_pool_t *p){    ap_hook_pre_config(log_pre_config,NULL,NULL,APR_HOOK_REALLY_FIRST);    ap_hook_child_init(init_child,NULL,NULL,APR_HOOK_MIDDLE);    ap_hook_open_logs(init_config_log,NULL,NULL,APR_HOOK_MIDDLE);    ap_hook_log_transaction(multi_log_transaction,NULL,NULL,APR_HOOK_MIDDLE);    /* Init log_hash before we register the optional function. It is      * possible for the optional function, ap_register_log_handler,     * to be called before any other mod_log_config hooks are called.     * As a policy, we should init everything required by an optional function     * before calling APR_REGISTER_OPTIONAL_FN.     */     log_hash = apr_hash_make(p);    APR_REGISTER_OPTIONAL_FN(ap_register_log_handler);    APR_REGISTER_OPTIONAL_FN(ap_log_set_writer_init);    APR_REGISTER_OPTIONAL_FN(ap_log_set_writer);}module AP_MODULE_DECLARE_DATA log_config_module ={    STANDARD20_MODULE_STUFF,    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 apr_table_t */    register_hooks              /* register hooks */};

⌨️ 快捷键说明

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