📄 mod_log_config.c
字号:
{ 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 + -