1 /* 2 include/types/log.h 3 This file contains definitions of log-related structures and macros. 4 5 Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu 6 7 This library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public 9 License as published by the Free Software Foundation, version 2.1 10 exclusively. 11 12 This library is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Lesser General Public License for more details. 16 17 You should have received a copy of the GNU Lesser General Public 18 License along with this library; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #ifndef _TYPES_LOG_H 23 #define _TYPES_LOG_H 24 25 #include <sys/socket.h> 26 #include <sys/un.h> 27 #include <netinet/in.h> 28 #include <common/config.h> 29 #include <common/hathreads.h> 30 #include <common/mini-clist.h> 31 32 #define NB_LOG_FACILITIES 24 33 #define NB_LOG_LEVELS 8 34 #define NB_MSG_IOVEC_ELEMENTS 8 35 #define SYSLOG_PORT 514 36 #define UNIQUEID_LEN 128 37 38 /* The array containing the names of the log levels. */ 39 extern const char *log_levels[]; 40 41 /* enum for log format */ 42 enum { 43 LOG_FORMAT_RFC3164 = 0, 44 LOG_FORMAT_RFC5424, 45 LOG_FORMAT_SHORT, 46 LOG_FORMAT_RAW, 47 LOG_FORMATS, /* number of supported log formats, must always be last */ 48 }; 49 50 /* lists of fields that can be logged */ 51 enum { 52 53 LOG_FMT_TEXT = 0, /* raw text */ 54 LOG_FMT_EXPR, /* sample expression */ 55 LOG_FMT_SEPARATOR, /* separator replaced by one space */ 56 57 /* information fields */ 58 LOG_FMT_GLOBAL, 59 LOG_FMT_CLIENTIP, 60 LOG_FMT_CLIENTPORT, 61 LOG_FMT_BACKENDIP, 62 LOG_FMT_BACKENDPORT, 63 LOG_FMT_FRONTENDIP, 64 LOG_FMT_FRONTENDPORT, 65 LOG_FMT_SERVERPORT, 66 LOG_FMT_SERVERIP, 67 LOG_FMT_COUNTER, 68 LOG_FMT_LOGCNT, 69 LOG_FMT_PID, 70 LOG_FMT_DATE, 71 LOG_FMT_DATEGMT, 72 LOG_FMT_DATELOCAL, 73 LOG_FMT_TS, 74 LOG_FMT_MS, 75 LOG_FMT_FRONTEND, 76 LOG_FMT_FRONTEND_XPRT, 77 LOG_FMT_BACKEND, 78 LOG_FMT_SERVER, 79 LOG_FMT_BYTES, 80 LOG_FMT_BYTES_UP, 81 LOG_FMT_Ta, 82 LOG_FMT_Th, 83 LOG_FMT_Ti, 84 LOG_FMT_TQ, 85 LOG_FMT_TW, 86 LOG_FMT_TC, 87 LOG_FMT_Tr, 88 LOG_FMT_tr, 89 LOG_FMT_trg, 90 LOG_FMT_trl, 91 LOG_FMT_TR, 92 LOG_FMT_TD, 93 LOG_FMT_TT, 94 LOG_FMT_STATUS, 95 LOG_FMT_CCLIENT, 96 LOG_FMT_CSERVER, 97 LOG_FMT_TERMSTATE, 98 LOG_FMT_TERMSTATE_CK, 99 LOG_FMT_ACTCONN, 100 LOG_FMT_FECONN, 101 LOG_FMT_BECONN, 102 LOG_FMT_SRVCONN, 103 LOG_FMT_RETRIES, 104 LOG_FMT_SRVQUEUE, 105 LOG_FMT_BCKQUEUE, 106 LOG_FMT_HDRREQUEST, 107 LOG_FMT_HDRRESPONS, 108 LOG_FMT_HDRREQUESTLIST, 109 LOG_FMT_HDRRESPONSLIST, 110 LOG_FMT_REQ, 111 LOG_FMT_HTTP_METHOD, 112 LOG_FMT_HTTP_URI, 113 LOG_FMT_HTTP_PATH, 114 LOG_FMT_HTTP_QUERY, 115 LOG_FMT_HTTP_VERSION, 116 LOG_FMT_HOSTNAME, 117 LOG_FMT_UNIQUEID, 118 LOG_FMT_SSL_CIPHER, 119 LOG_FMT_SSL_VERSION, 120 }; 121 122 /* enum for parse_logformat_string */ 123 enum { 124 LF_INIT = 0, // before first character 125 LF_TEXT, // normal text 126 LF_SEPARATOR, // a single separator 127 LF_VAR, // variable name, after '%' or '%{..}' 128 LF_STARTVAR, // % in text 129 LF_STARG, // after '%{' and berore '}' 130 LF_EDARG, // '}' after '%{' 131 LF_STEXPR, // after '%[' or '%{..}[' and berore ']' 132 LF_EDEXPR, // ']' after '%[' 133 LF_END, // \0 found 134 }; 135 136 137 struct logformat_node { 138 struct list list; 139 int type; // LOG_FMT_* 140 int options; // LOG_OPT_* 141 char *arg; // text for LOG_FMT_TEXT, arg for others 142 void *expr; // for use with LOG_FMT_EXPR 143 }; 144 145 #define LOG_OPT_HEXA 0x00000001 146 #define LOG_OPT_MANDATORY 0x00000002 147 #define LOG_OPT_QUOTE 0x00000004 148 #define LOG_OPT_REQ_CAP 0x00000008 149 #define LOG_OPT_RES_CAP 0x00000010 150 #define LOG_OPT_HTTP 0x00000020 151 #define LOG_OPT_ESC 0x00000040 152 153 154 /* Fields that need to be extracted from the incoming connection or request for 155 * logging or for sending specific header information. They're set in px->to_log 156 * and appear as flags in session->logs.logwait, which are removed once the 157 * required information has been collected. 158 */ 159 #define LW_INIT 1 /* anything */ 160 #define LW_CLIP 2 /* CLient IP */ 161 #define LW_SVIP 4 /* SerVer IP */ 162 #define LW_SVID 8 /* server ID */ 163 #define LW_REQ 16 /* http REQuest */ 164 #define LW_RESP 32 /* http RESPonse */ 165 #define LW_BYTES 256 /* bytes read from server */ 166 #define LW_COOKIE 512 /* captured cookie */ 167 #define LW_REQHDR 1024 /* request header(s) */ 168 #define LW_RSPHDR 2048 /* response header(s) */ 169 #define LW_BCKIP 4096 /* backend IP */ 170 #define LW_FRTIP 8192 /* frontend IP */ 171 #define LW_XPRT 16384 /* transport layer information (eg: SSL) */ 172 173 /* Range of indexes for log sampling. */ 174 struct smp_log_range { 175 unsigned int low; /* Low limit of the indexes of this range. */ 176 unsigned int high; /* High limit of the indexes of this range. */ 177 size_t sz; /* The size of this range, or number of indexes in 178 * this range. 179 */ 180 unsigned int curr_idx; /* The current index used to sample this range of 181 *indexes. 182 */ 183 }; 184 185 /* Log sampling information. */ 186 struct smp_info { 187 struct smp_log_range *smp_rgs; /* Array of ranges for log sampling. */ 188 size_t smp_rgs_sz; /* The size of <smp_rgs> array. */ 189 size_t smp_sz; /* The total number of logs to be sampled. */ 190 unsigned int curr_rg; /* The current range to be sampled. */ 191 unsigned int curr_idx; /* A counter to store the current index of the log 192 * already sampled. 193 */ 194 }; 195 196 struct logsrv { 197 struct list list; 198 struct sockaddr_storage addr; 199 struct smp_info lb; 200 int format; 201 int facility; 202 int level; 203 int minlvl; 204 int maxlen; 205 struct logsrv *ref; 206 __decl_hathreads(HA_SPINLOCK_T lock); 207 }; 208 209 #endif /* _TYPES_LOG_H */ 210 211 /* 212 * Local variables: 213 * c-indent-level: 8 214 * c-basic-offset: 8 215 * End: 216 */ 217