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

📄 mod_log_config.c

📁 apache简化版
💻 C
📖 第 1 页 / 共 3 页
字号:
/* ==================================================================== * Copyright (c) 1995-1998 The Apache Group.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgment: *    "This product includes software developed by the Apache Group *    for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to *    endorse or promote products derived from this software without *    prior written permission. For written permission, please contact *    apache@apache.org. * * 5. Products derived from this software may not be called "Apache" *    nor may "Apache" appear in their names without prior written *    permission of the Apache Group. * * 6. Redistributions of any form whatsoever must retain the following *    acknowledgment: *    "This product includes software developed by the Apache Group *    for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group and was originally based * on public domain software written at the National Center for * Supercomputing Applications, University of Illinois, Urbana-Champaign. * For more information on the Apache Group and the Apache HTTP server * project, please see <http://www.apache.org/>. * *//* * Modified by djm@va.pubnix.com: * If no TransferLog is given explicitly, decline to log. * * This is module implements the TransferLog directive (same as the * common log module), and additional directives, LogFormat and CustomLog. * * * Syntax: * *    TransferLog fn      Logs transfers to fn in standard log format, unless *                        a custom format is set with LogFormat *    LogFormat format    Set a log format from TransferLog files *    CustomLog fn format *                        Log to file fn with format given by the format *                        argument * *    CookieLog fn        For backwards compatability with old Cookie *                        logging module - now deprecated. * * There can be any number of TransferLog and CustomLog * commands. Each request will be logged to _ALL_ the * named files, in the appropriate format. * * If no TransferLog or CustomLog directive appears in a VirtualHost, * the request will be logged to the log file(s) defined outside * the virtual host section. If a TransferLog or CustomLog directive * appears in the VirtualHost section, the log files defined outside * the VirtualHost will _not_ be used. This makes this module compatable * with the CLF and config log modules, where the use of TransferLog * inside the VirtualHost section overrides its use outside. *  * Examples: * *    TransferLog    logs/access_log *    <VirtualHost> *    LogFormat      "... custom format ..." *    TransferLog    log/virtual_only *    CustomLog      log/virtual_useragents "%t %{user-agent}i" *    </VirtualHost> * * This will log using CLF to access_log any requests handled by the * main server, while any requests to the virtual host will be logged * with the "... custom format..." to virtual_only _AND_ using * the custom user-agent log to virtual_useragents. * * Note that the NCSA referer and user-agent logs are easily added with * CustomLog: *   CustomLog   logs/referer  "%{referer}i -> %U" *   CustomLog   logs/agent    "%{user-agent}i" * * Except: no RefererIgnore functionality *         logs '-' if no Referer or User-Agent instead of nothing * * But using this method allows much easier modification of the * log format, e.g. to log hosts along with UA: *   CustomLog   logs/referer "%{referer}i %U %h" * * The argument to LogFormat and CustomLog is a string, which can include * literal characters copied into the log files, and '%' directives as * follows: * * %...b:  bytes sent, excluding HTTP headers. * %...{FOOBAR}e:  The contents of the environment variable FOOBAR * %...f:  filename * %...h:  remote host * %...a:  remote IP-address * %...{Foobar}i:  The contents of Foobar: header line(s) in the request *                 sent to the client. * %...l:  remote logname (from identd, if supplied) * %...{Foobar}n:  The contents of note "Foobar" from another module. * %...{Foobar}o:  The contents of Foobar: header line(s) in the reply. * %...p:  the port the request was served to * %...P:  the process ID of the child that serviced the request. * %...r:  first line of request * %...s:  status.  For requests that got internally redirected, this *         is status of the *original* request --- %...>s for the last. * %...t:  time, in common log format time format * %...{format}t:  The time, in the form given by format, which should *                 be in strftime(3) format. * %...T:  the time taken to serve the request, in seconds. * %...u:  remote user (from auth; may be bogus if return status (%s) is 401) * %...U:  the URL path requested. * %...v:  the name of the server (i.e. which virtual host?) * * The '...' can be nothing at all (e.g. "%h %u %r %s %b"), or it can * indicate conditions for inclusion of the item (which will cause it * to be replaced with '-' if the condition is not met).  Note that * there is no escaping performed on the strings from %r, %...i and * %...o; some with long memories may remember that I thought this was * a bad idea, once upon a time, and I'm still not comfortable with * it, but it is difficult to see how to "do the right thing" with all * of '%..i', unless we URL-escape everything and break with CLF. * * The forms of condition are a list of HTTP status codes, which may * or may not be preceded by '!'.  Thus, '%400,501{User-agent}i' logs * User-agent: on 400 errors and 501 errors (Bad Request, Not * Implemented) only; '%!200,304,302{Referer}i' logs Referer: on all * requests which did *not* return some sort of normal status. * * The default LogFormat reproduces CLF; see below. * * The way this is supposed to work with virtual hosts is as follows: * a virtual host can have its own LogFormat, or its own TransferLog. * If it doesn't have its own LogFormat, it inherits from the main * server.  If it doesn't have its own TransferLog, it writes to the * same descriptor (meaning the same process for "| ..."). * * --- rst */#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b"#include "httpd.h"#include "http_config.h"#include "http_core.h"          /* For REMOTE_NAME */#include "http_log.h"#include <limits.h>module MODULE_VAR_EXPORT config_log_module;static int xfer_flags = (O_WRONLY | O_APPEND | O_CREAT);#if defined(OS2) || defined(WIN32)/* OS/2 dosen't support users and groups */static mode_t xfer_mode = (S_IREAD | S_IWRITE);#elsestatic mode_t xfer_mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);#endif/* POSIX.1 defines PIPE_BUF as the maximum number of bytes that is * guaranteed to be atomic when writing a pipe.  And PIPE_BUF >= 512 * is guaranteed.  So we'll just guess 512 in the event the system * doesn't have this.  Now, for file writes there is actually no limit, * the entire write is atomic.  Whether all systems implement this * correctly is another question entirely ... so we'll just use PIPE_BUF * because it's probably a good guess as to what is implemented correctly * everywhere. */#ifdef PIPE_BUF#define LOG_BUFSIZE     PIPE_BUF#else#define LOG_BUFSIZE     (512)#endif/* * multi_log_state is our per-(virtual)-server configuration. We store * an array of the logs we are going to use, each of type config_log_state. * If a default log format is given by LogFormat, store in default_format * (backward compat. with mod_log_config).  We also store for each virtual * server a pointer to the logs specified for the main server, so that if this * vhost has no logs defined, we can use the main server's logs instead. * * So, for the main server, config_logs contains a list of the log files * and server_config_logs in empty. For a vhost, server_config_logs * points to the same array as config_logs in the main server, and * config_logs points to the array of logs defined inside this vhost, * which might be empty. */typedef struct {    char *default_format_string;    array_header *default_format;    array_header *config_logs;    array_header *server_config_logs;    table *formats;} multi_log_state;/* * config_log_state holds the status of a single log file. fname might * be NULL, which means this module does no logging for this * request. format might be NULL, in which case the default_format * from the multi_log_state should be used, or if that is NULL as * well, use the CLF. log_fd is -1 before the log file is opened and * set to a valid fd after it is opened. */typedef struct {    char *fname;    char *format_string;    array_header *format;    int log_fd;#ifdef BUFFERED_LOGS    int outcnt;    char outbuf[LOG_BUFSIZE];#endif} config_log_state;/* * Format items... * Note that many of these could have ap_sprintfs replaced with static buffers. */typedef const char *(*item_key_func) (request_rec *, char *);typedef struct {    item_key_func func;    char *arg;    int condition_sense;    int want_orig;    array_header *conditions;} log_format_item;static char *format_integer(pool *p, int i){    return ap_psprintf(p, "%d", i);}static char *pfmt(pool *p, int i){    if (i <= 0) {        return "-";    }    else {        return format_integer(p, i);    }}static const char *constant_item(request_rec *dummy, char *stuff){    return stuff;}static const char *log_remote_host(request_rec *r, char *a){    return ap_get_remote_host(r->connection, r->per_dir_config,                                    REMOTE_NAME);}static const char *log_remote_address(request_rec *r, char *a){    return r->connection->remote_ip;}static const char *log_remote_logname(request_rec *r, char *a){    return ap_get_remote_logname(r);}static const char *log_remote_user(request_rec *r, char *a){    char *rvalue = r->connection->user;    if (rvalue == NULL) {        rvalue = "-";    }    else if (strlen(rvalue) == 0) {        rvalue = "\"\"";    }    return rvalue;}static const char *log_request_line(request_rec *r, char *a){	    /* NOTE: If the original request contained a password, we	     * re-write the request line here to contain XXXXXX instead:	     * (note the truncation before the protocol string for HTTP/0.9 requests)	     * (note also that r->the_request contains the unmodified request)	     */    return (r->parsed_uri.password) ? ap_pstrcat(r->pool, r->method, " ",					 ap_unparse_uri_components(r->pool, &r->parsed_uri, 0),					 r->assbackwards ? NULL : " ", r->protocol, NULL)					: r->the_request;}static const char *log_request_file(request_rec *r, char *a){    return r->filename;}static const char *log_request_uri(request_rec *r, char *a){    return r->uri;}static const char *log_status(request_rec *r, char *a){    return pfmt(r->pool, r->status);}static const char *log_bytes_sent(request_rec *r, char *a){    if (!r->sent_bodyct) {        return "-";    }    else {        long int bs;        ap_bgetopt(r->connection->client, BO_BYTECT, &bs);	return ap_psprintf(r->pool, "%ld", bs);    }}static const char *log_header_in(request_rec *r, char *a){    return ap_table_get(r->headers_in, a);}

⌨️ 快捷键说明

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