#define LOG_OPT_RES_CAP 0x00000010
-/* fields that need to be logged. They appear as flags in session->logs.logwait */
-#define LW_INIT 1 /* date */
+/* Fields that need to be extracted from the incoming connection or request for
+ * logging or for sending specific header information. They're set in px->to_log
+ * and appear as flags in session->logs.logwait, which are removed once the
+ * required information has been collected.
+ */
+#define LW_INIT 1 /* anything */
#define LW_CLIP 2 /* CLient IP */
#define LW_SVIP 4 /* SerVer IP */
#define LW_SVID 8 /* server ID */
curproxy->to_log &= ~LW_BYTES;
if ((curproxy->mode == PR_MODE_TCP || curproxy->mode == PR_MODE_HTTP) &&
- (curproxy->cap & PR_CAP_FE) && curproxy->to_log && LIST_ISEMPTY(&curproxy->logsrvs)) {
+ (curproxy->cap & PR_CAP_FE) && !LIST_ISEMPTY(&curproxy->logformat) && LIST_ISEMPTY(&curproxy->logsrvs)) {
Warning("config : log format ignored for %s '%s' since it has no log address.\n",
proxy_type_str(curproxy), curproxy->id);
err_code |= ERR_WARN;
if ((s->fe->mode == PR_MODE_TCP || s->fe->mode == PR_MODE_HTTP)
&& (!LIST_ISEMPTY(&s->fe->logsrvs))) {
- if (likely(s->fe->to_log)) {
+ if (likely(!LIST_ISEMPTY(&s->fe->logformat))) {
/* we have the client ip */
if (s->logs.logwait & LW_CLIP)
- if (!(s->logs.logwait &= ~LW_CLIP))
+ if (!(s->logs.logwait &= ~(LW_CLIP|LW_INIT)))
s->do_log(s);
}
else {
struct proxy *fe = s->fe;
struct proxy *be = s->be;
struct http_txn *txn = &s->txn;
- int tolog;
char *uri;
const char *svid;
struct tm tm;
struct logformat_node *tmp;
/* FIXME: let's limit ourselves to frontend logging for now. */
- tolog = fe->to_log;
-
- if (!(tolog & LW_SVID))
- svid = "-";
- else switch (obj_type(s->target)) {
- case OBJ_TYPE_SERVER:
- svid = objt_server(s->target)->id;
- break;
- case OBJ_TYPE_APPLET:
- svid = objt_applet(s->target)->name;
- break;
- default:
- svid = "<NOSRV>";
- break;
- }
t_request = -1;
if (tv_isge(&s->logs.tv_request, &s->logs.tv_accept))
break;
case LOG_FMT_SERVER: // %s
- src = (char *)svid;
+ switch (obj_type(s->target)) {
+ case OBJ_TYPE_SERVER:
+ src = objt_server(s->target)->id;
+ break;
+ case OBJ_TYPE_APPLET:
+ src = objt_applet(s->target)->name;
+ break;
+ default:
+ src = "<NOSRV>";
+ break;
+ }
ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
if (ret == NULL)
goto out;
break;
case LOG_FMT_TT: // %Tt
- if (!(tolog & LW_BYTES))
+ if (!(fe->to_log & LW_BYTES))
LOGCHAR('+');
ret = ltoa_o(s->logs.t_close, tmplog, dst + maxsize - tmplog);
if (ret == NULL)
break;
case LOG_FMT_BYTES: // %B
- if (!(tolog & LW_BYTES))
+ if (!(fe->to_log & LW_BYTES))
LOGCHAR('+');
ret = lltoa(s->logs.bytes_out, tmplog, dst + maxsize - tmplog);
if (ret == NULL)
break;
case LOG_FMT_BYTES_UP: // %U
- if (!(tolog & LW_BYTES))
- LOGCHAR('+');
ret = lltoa(s->logs.bytes_in, tmplog, dst + maxsize - tmplog);
if (ret == NULL)
goto out;
case LOG_FMT_HDRREQUEST: // %hr
/* request header */
- if (fe->to_log & LW_REQHDR && txn->req.cap) {
+ if (fe->nb_req_cap && txn->req.cap) {
if (tmp->options & LOG_OPT_QUOTE)
LOGCHAR('"');
LOGCHAR('{');
case LOG_FMT_HDRREQUESTLIST: // %hrl
/* request header list */
- if (fe->to_log & LW_REQHDR && txn->req.cap) {
+ if (fe->nb_req_cap && txn->req.cap) {
for (hdr = 0; hdr < fe->nb_req_cap; hdr++) {
if (hdr > 0)
LOGCHAR(' ');
case LOG_FMT_HDRRESPONS: // %hs
/* response header */
- if (fe->to_log & LW_RSPHDR &&
- txn->rsp.cap) {
+ if (fe->nb_rsp_cap && txn->rsp.cap) {
if (tmp->options & LOG_OPT_QUOTE)
LOGCHAR('"');
LOGCHAR('{');
case LOG_FMT_HDRRESPONSLIST: // %hsl
/* response header list */
- if (fe->to_log & LW_RSPHDR && txn->rsp.cap) {
+ if (fe->nb_rsp_cap && txn->rsp.cap) {
for (hdr = 0; hdr < fe->nb_rsp_cap; hdr++) {
if (hdr > 0)
LOGCHAR(' ');
memcpy(txn->uri, req->buf->p, urilen);
txn->uri[urilen] = 0;
- if (!(s->logs.logwait &= ~LW_REQ))
+ if (!(s->logs.logwait &= ~(LW_REQ|LW_INIT)))
s->do_log(s);
} else {
Alert("HTTP logging : out of memory.\n");
}
}
- if (!LIST_ISEMPTY(&s->fe->format_unique_id)) {
- s->unique_id = pool_alloc2(pool2_uniqueid);
- }
+ if (!LIST_ISEMPTY(&s->fe->format_unique_id))
+ s->unique_id = pool_alloc2(pool2_uniqueid);
/* 4. We may have to convert HTTP/0.9 requests to HTTP/1.0 */
if (unlikely(msg->sl.rq.v_l == 0) && !http_upgrade_v09_to_v10(txn))
s->logs.bytes_out -= s->rep->buf->i;
/* let's do a final log if we need it */
- if (s->logs.logwait &&
+ if (!LIST_ISEMPTY(&s->fe->logformat) && s->logs.logwait &&
!(s->flags & SN_MONITOR) &&
(!(s->fe->options & PR_O_NULLNOLOG) || s->req->total)) {
s->do_log(s);
* bytes from the server, then this is the right moment. We have
* to temporarily assign bytes_out to log what we currently have.
*/
- if (t->fe->to_log && !(t->logs.logwait & LW_BYTES)) {
+ if (!LIST_ISEMPTY(&t->fe->logformat) && !(t->logs.logwait & LW_BYTES)) {
t->logs.t_close = t->logs.t_data; /* to get a valid end date */
t->logs.bytes_out = txn->rsp.eoh;
t->do_log(t);
if (s->be->mode == PR_MODE_TCP) { /* let's allow immediate data connection in this case */
/* if the user wants to log as soon as possible, without counting
* bytes from the server, then this is the right moment. */
- if (s->fe->to_log && !(s->logs.logwait & LW_BYTES)) {
+ if (!LIST_ISEMPTY(&s->fe->logformat) && !(s->logs.logwait & LW_BYTES)) {
s->logs.t_close = s->logs.t_connect; /* to get a valid end date */
s->do_log(s);
}
}
/* let's do a final log if we need it */
- if (s->logs.logwait &&
+ if (!LIST_ISEMPTY(&s->fe->logformat) && s->logs.logwait &&
!(s->flags & SN_MONITOR) &&
(!(s->fe->options & PR_O_NULLNOLOG) || s->req->total)) {
s->do_log(s);