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