📄 mod_log_nw.c
字号:
} 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; /* * Log this transaction.. */ 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; 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); mls->rotatedaily = 0; mls->rotateinterval = 0; 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; if (add->rotatedaily==0) { add->rotatedaily=base->rotatedaily; } if (add->rotateinterval==0) { add->rotateinterval=base->rotateinterval; } 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, char *envclause){ 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->condition_var = NULL; if (envclause != NULL) { if (strncasecmp(envclause, "env=", 4) != 0) { return "error in condition clause"; } if ((envclause[4] == '\0') || ((envclause[4] == '!') && (envclause[5] == '\0'))) { return "missing environment variable name"; } cls->condition_var = ap_pstrdup(cmd->pool, &envclause[4]); } cls->fname = fn; cls->format_string = fmt; if (fmt == NULL) { 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, 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", NULL);}static const char *set_rotate_log_daily(cmd_parms *cmd, void *dummy, int arg){ multi_log_state *mls = ap_get_module_config(cmd->server->module_config, &config_log_module); mls->rotatedaily = arg; if (mls->rotatedaily) mls->rotateinterval = 0; return NULL;}static const char *set_rotate_log_interval(cmd_parms *cmd, void *dummy, char *arg){ multi_log_state *mls = ap_get_module_config(cmd->server->module_config, &config_log_module); int interval = 0; if (arg) interval = atoi(arg); if (interval < 0) return NULL; mls->rotatedaily = 0; mls->rotateinterval = interval; return NULL;}static const command_rec config_log_cmds[] ={ {"CustomLog", add_custom_log, NULL, RSRC_CONF, TAKE23, "a file name, a custom log format string or format name, " "and an optional \"env=\" clause (see docs)"}, {"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"}, {"LogRotateDaily", set_rotate_log_daily, NULL, RSRC_CONF, FLAG, "rotate logs daily (On:Off)"}, {"LogRotateInterval", set_rotate_log_interval, NULL, RSRC_CONF, TAKE1, "rotate logs every NNN minutes"}, {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; struct tm *time_tmp; time_t time_now; multi_log_state *mls = ap_get_module_config(s->module_config,&config_log_module); if ((mls->rotatedaily || mls->rotateinterval)&&(*cls->fname!='|')&&(strcmp(cls->fname,"/dev/null") != 0)) { time_now=time(NULL); if (mls->rotatedaily) { time_tmp=localtime(&time_now); cls->time_jump=time_now+((60-time_tmp->tm_sec)+60*(59-time_tmp->tm_min)+3600*(23-time_tmp->tm_hour)); } else cls->time_jump = time_now + (60*mls->rotateinterval); fname = ap_pstrcat(p, ap_server_root_relative(p, cls->fname), "-", ap_ht_time(p,time_now,"%Y%m%d%H%M",0), NULL ); } else { fname = ap_server_root_relative(p, cls->fname); } if ((cls->log_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1)) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "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 + -