155#define APR_WANT_STRFUNC
175#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b"
177module AP_MODULE_DECLARE_DATA log_config_module;
217#define LOG_BUFSIZE PIPE_BUF
219#define LOG_BUFSIZE (512)
312 const char *remote_host;
350 else if (strlen(
rvalue) == 0) {
487 rp->len = strlen(
rp->value);
518 const char *cp =
NULL;
609#define DEFAULT_REQUEST_TIME_SIZE 32
616#define TIME_FMT_CUSTOM 0
617#define TIME_FMT_CLF 1
618#define TIME_FMT_ABS_SEC 2
619#define TIME_FMT_ABS_MSEC 3
620#define TIME_FMT_ABS_USEC 4
621#define TIME_FMT_ABS_MSEC_FRAC 5
622#define TIME_FMT_ABS_USEC_FRAC 6
624#define TIME_CACHE_SIZE 4
625#define TIME_CACHE_MASK 3
656 else if (*
fmt ==
':') {
667 else if (*
fmt ==
':') {
767 "[%02d/%s/%d:%02d:%02d:%02d %c%.2d%.2d]",
851 *
a ==
'h' ?
"%pt" :
"%pT", &tid);
891 while (*
s && *
s !=
'%') {
902 while (*
s && *
s !=
'%') {
953 it->condition_sense = 0;
973 it->condition_sense = !
it->condition_sense;
1007 i =
i * 10 + (*s) -
'0';
1009 if (!
it->conditions) {
1017 if (*
s ==
'^' && *(
s+1) && *(
s+2)) {
1031 return apr_pstrcat(
p,
"Unrecognized LogFormat directive %",
1034 it->func = handler->
func;
1035 if (
it->want_orig == -1) {
1043 return "Ran off end of LogFormat parsing args to some directive";
1075 if (
item->conditions &&
item->conditions->nelts != 0) {
1077 int *
conds = (
int *)
item->conditions->elts;
1080 for (
i = 0;
i <
item->conditions->nelts; ++
i) {
1096 return cp ? cp :
"-";
1130 if (
cls->condition_var !=
NULL) {
1132 if (*
envar !=
'!') {
1143 else if (
cls->condition_expr !=
NULL) {
1148 "Error evaluating log condition: %s",
err);
1160 while (
orig->prev) {
1174 "log writer isn't correctly setup");
1180 "Error writing to %s",
cls->fname);
1188 &log_config_module);
1201 if (
mls->config_logs->nelts) {
1203 for (
i = 0;
i <
mls->config_logs->nelts; ++
i) {
1210 if (
mls->server_config_logs) {
1212 for (
i = 0;
i <
mls->server_config_logs->nelts; ++
i) {
1215 if (
cls->inherit || !
mls->config_logs->nelts) {
1235 mls->default_format_string =
NULL;
1237 mls->server_config_logs =
NULL;
1273 &log_config_module);
1287 mls->default_format_string =
fmt;
1299 &log_config_module);
1309 return "missing environment variable name";
1316 return "missing condition";
1324 return "error in condition clause";
1329 cls->format_string =
fmt;
1330 cls->directive =
cmd->directive;
1345 &log_config_module);
1391 "a file name, a custom log format string or format name, "
1392 "and an optional \"env=\" or \"expr=\" clause (see docs)"),
1394 "Same as CustomLog, but forces virtualhosts to inherit the log"),
1396 "the filename of the access log"),
1398 "a log format string (see docs) and an optional format name"),
1400 "Enable Buffered Logging (experimental)"),
1408 if (
cls->log_writer !=
NULL) {
1427 &log_config_module);
1432 if (
mls->default_format_string) {
1439 if (!
mls->default_format) {
1443 if (
mls->config_logs->nelts) {
1445 for (
i = 0;
i <
mls->config_logs->nelts; ++
i) {
1448 if (
cls->format_string) {
1461 else if (
mls->server_config_logs) {
1463 for (
i = 0;
i <
mls->server_config_logs->nelts; ++
i) {
1466 if (
cls->format_string) {
1496 for (;
s;
s =
s->next) {
1499 if (
mls->config_logs->nelts) {
1502 else if (
mls->server_config_logs) {
1533 for (
s =
s->next; (
res ==
OK) &&
s;
s =
s->next) {
1560 this->mutex.type = apr_anylock_threadmutex;
1566 "could not initialize buffered log mutex, "
1567 "transfer log may become corrupted");
1568 this->mutex.type = apr_anylock_none;
1574 this->mutex.type = apr_anylock_none;
1652 "invalid transfer log path %s.",
name);
1658 "could not open transfer log file %s.",
fname);
1780 if (!
cls->fname ||
cls->fname[0] ==
'|' || !
cls->directive) {
1795 "Cannot access directory '%s' for log file '%s' "
1796 "defined at %s:%d",
dir,
cls->fname,
1809 &log_config_module);
Symbol export macros and hook functions.
Apache Multi-Processing Module library.
const char apr_size_t len
APR-Util transparent any lock flavor wrapper.
#define APR_ANYLOCK_UNLOCK(lck)
#define APR_ANYLOCK_LOCK(lck)
APR general purpose library routines.
APR-UTIL registration of functions exported by modules.
apr_size_t const unsigned char unsigned int unsigned int d
APR Standard Headers Support.
static apr_pool_t * pconf
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_FLAG(directive, func, mconfig, where, help)
void ap_hook_open_logs(ap_HOOK_open_logs_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_check_config(ap_HOOK_check_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
char * ap_server_root_relative(apr_pool_t *p, const char *fname)
#define ap_set_module_config(v, m, val)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_INIT_TAKE12(directive, func, mconfig, where, help)
void ap_hook_child_init(ap_HOOK_child_init_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_INIT_TAKE23(directive, func, mconfig, where, help)
#define ap_default_port(r)
const char * ap_get_server_name(request_rec *r)
const char * ap_get_remote_logname(request_rec *r)
apr_file_t * ap_piped_log_write_fd(piped_log *pl)
piped_log * ap_open_piped_log(apr_pool_t *p, const char *program)
const unsigned char * buf
void ap_hook_log_transaction(ap_HOOK_log_transaction_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
apr_status_t ap_explode_recent_localtime(apr_time_exp_t *tm, apr_time_t t)
const char apr_port_t port
apr_bucket apr_bucket_brigade * a
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
apr_pool_t const char apr_dbd_t ** handle
#define APR_HOOK_REALLY_FIRST
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_REGISTER_OPTIONAL_FN(name)
const char apr_size_t char * outbuf
#define AP_EXPR_FLAG_DONT_VARY
#define ap_expr_parse_cmd(cmd, expr, flags, err, lookup_fn)
int ap_expr_exec(request_rec *r, const ap_expr_info_t *expr, const char **err)
#define HTTP_INTERNAL_SERVER_ERROR
void * ap_log_writer_init(apr_pool_t *p, server_rec *s, const char *name)
const char * ap_log_handler_fn_t(request_rec *r, char *a)
apr_status_t ap_log_writer(request_rec *r, void *handle, const char **portions, int *lengths, int nelts, apr_size_t len)
#define STANDARD20_MODULE_STUFF
char * ap_append_pid(apr_pool_t *p, const char *string, const char *delim)
int ap_cstr_casecmp(const char *s1, const char *s2)
char * ap_getword(apr_pool_t *p, const char **line, char stop)
char * ap_escape_logitem(apr_pool_t *p, const char *str)
char * ap_make_dirstr_parent(apr_pool_t *p, const char *s)
char * ap_field_noparam(apr_pool_t *p, const char *intype)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
const char int apr_pool_t * pool
apr_int32_t apr_fileperms_t
const char apr_int32_t flag
apr_array_header_t ** result
int strcasecmp(const char *a, const char *b)
int strncasecmp(const char *a, const char *b, size_t n)
apr_vformatter_buff_t const char * fmt
apr_interval_time_t apr_int32_t * num
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
#define apr_time_msec(time)
#define apr_time_as_msec(time)
APR_DECLARE_DATA const char apr_month_snames[12][4]
#define apr_time_sec(time)
#define apr_time_usec(time)
const char * ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip)
const char * ap_get_useragent_host(request_rec *req, int type, int *str_is_ip)
apr_status_t ap_mpm_query(int query_code, int *result)
#define AP_MPMQ_MAX_THREADS
static void * merge_config_log_state(apr_pool_t *p, void *basev, void *addv)
static void ap_register_log_handler(apr_pool_t *p, char *tag, ap_log_handler_fn_t *handler, int def)
static const char * log_remote_logname(request_rec *r, char *a)
static const char * log_virtual_host(request_rec *r, char *a)
#define DEFAULT_LOG_FORMAT
static const char * log_format(cmd_parms *cmd, void *dummy, const char *fmt, const char *name)
static const char * log_server_port(request_rec *r, char *a)
static const char * set_transfer_log(cmd_parms *cmd, void *dummy, const char *fn)
static void * ap_default_log_writer_init(apr_pool_t *p, server_rec *s, const char *name)
static const char * log_requests_on_connection(request_rec *r, char *a)
static const char * log_request_protocol(request_rec *r, char *a)
static const char * log_request_duration_microseconds(request_rec *r, char *a)
static const char * log_pid_tid(request_rec *r, char *a)
static const char * log_handler(request_rec *r, char *a)
static const char * log_header_out(request_rec *r, char *a)
static const char * log_connection_status(request_rec *r, char *a)
static int multi_log_transaction(request_rec *r)
static char * parse_log_misc_string(apr_pool_t *p, log_format_item *it, const char **sa)
static int open_multi_logs(server_rec *s, apr_pool_t *p)
static const char * log_remote_address(request_rec *r, char *a)
static int log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp)
static const char * constant_item(request_rec *dummy, char *stuff)
static char * parse_log_item(apr_pool_t *p, log_format_item *it, const char **sa)
static const command_rec config_log_cmds[]
static apr_status_t flush_all_logs(void *data)
static int config_log_transaction(request_rec *r, config_log_state *cls, apr_array_header_t *default_format)
static ap_log_writer * ap_log_set_writer(ap_log_writer *handle)
static char * pfmt(apr_pool_t *p, int i)
static int check_log_dir(apr_pool_t *p, server_rec *s, config_log_state *cls)
static const char * log_request_file(request_rec *r, char *a)
static const char * log_cookie(request_rec *r, char *a)
static const char * log_request_query(request_rec *r, char *a)
static const char * log_request_uri(request_rec *r, char *a)
static const char * log_remote_host(request_rec *r, char *a)
static ap_log_writer_init * ap_log_set_writer_init(ap_log_writer_init *handle)
static const char * set_buffered_logs_on(cmd_parms *parms, void *dummy, int flag)
static const char * log_server_name(request_rec *r, char *a)
static apr_array_header_t * parse_log_string(apr_pool_t *p, const char *s, const char **err)
static const char * log_status(request_rec *r, char *a)
static const char * clf_log_bytes_sent(request_rec *r, char *a)
static apr_fileperms_t xfer_perms
static const char * log_request_time(request_rec *r, char *a)
static void flush_log(buffered_log *buf)
static const char * log_request_time_custom(request_rec *r, char *a, apr_time_exp_t *xt)
static void register_hooks(apr_pool_t *p)
static void * ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s, const char *name)
static int init_config_log(apr_pool_t *pc, apr_pool_t *p, apr_pool_t *pt, server_rec *s)
static const char * log_request_line(request_rec *r, char *a)
static void * make_config_log_state(apr_pool_t *p, server_rec *s)
static apr_status_t ap_default_log_writer(request_rec *r, void *handle, const char **strs, int *strl, int nelts, apr_size_t len)
#define DEFAULT_REQUEST_TIME_SIZE
static const char * log_header_in(request_rec *r, char *a)
static const char * log_local_address(request_rec *r, char *a)
static const char * process_item(request_rec *r, request_rec *orig, log_format_item *item)
static apr_status_t ap_buffered_log_writer(request_rec *r, void *handle, const char **strs, int *strl, int nelts, apr_size_t len)
static const char * add_global_log(cmd_parms *cmd, void *dummy, const char *fn, const char *fmt, const char *envclause)
static const char * log_request_duration_scaled(request_rec *r, char *a)
#define TIME_FMT_ABS_USEC_FRAC
static const char * log_log_id(request_rec *r, char *a)
static ap_log_writer * log_writer
static const char * log_trailer_in(request_rec *r, char *a)
static ap_log_writer_init * log_writer_init
#define TIME_FMT_ABS_MSEC_FRAC
static const char * log_bytes_sent(request_rec *r, char *a)
static cached_request_time request_time_cache[4]
static config_log_state * open_config_log(server_rec *s, apr_pool_t *p, config_log_state *cls, apr_array_header_t *default_format)
static const char * add_custom_log(cmd_parms *cmd, void *dummy, const char *fn, const char *fmt, const char *envclause)
static apr_time_t get_request_end_time(request_rec *r)
#define TIME_FMT_ABS_USEC
static const char * log_remote_user(request_rec *r, char *a)
static APR_INLINE char * find_multiple_headers(apr_pool_t *pool, const apr_table_t *table, const char *key)
static int log_check_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static apr_hash_t * log_hash
static void init_child(apr_pool_t *p, server_rec *s)
static const char * log_note(request_rec *r, char *a)
static const char * log_trailer_out(request_rec *r, char *a)
static const char * log_env_var(request_rec *r, char *a)
static apr_array_header_t * all_buffered_logs
#define TIME_FMT_ABS_MSEC
static const char * log_request_method(request_rec *r, char *a)
Logging Configuration Extension Module for Apache.
apr_os_thread_t apr_os_thread_current()
Structure used to build the config tree.
ap_log_handler_fn_t * func
const ap_directive_t * directive
const char * format_string
ap_expr_info_t * condition_expr
apr_array_header_t * format
ap_conn_keepalive_e keepalive
apr_sockaddr_t * local_addr
apr_time_t request_end_time
apr_array_header_t * server_config_logs
const char * default_format_string
apr_array_header_t * default_format
apr_array_header_t * config_logs
The piped logging structure.
A structure that represents the current request.
const char * content_type
apr_table_t * trailers_in
apr_sockaddr_t * useragent_addr
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * trailers_out
apr_table_t * headers_out
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
apr_status_t apr_strftime(char *s, apr_size_t *retsize, apr_size_t max, const char *format, apr_time_exp_t *xt)
Apache date-time handling functions.