/* integer used to provide some context about the log origin
* when sending log through logging functions
*/
-enum log_orig {
+enum log_orig_id {
LOG_ORIG_UNSPEC = 0, /* unspecified */
LOG_ORIG_SESS_ERROR, /* general error during session handling */
LOG_ORIG_SESS_KILL, /* during embryonic session kill */
LOG_ORIG_MAX = 0xFFFF, /* max log origin number (65k) */
};
+/* log orig flags
+ */
+#define LOG_ORIG_FL_NONE 0x0000
+#define LOG_ORIG_FL_ALL 0xFFFF
+
+struct log_orig {
+ enum log_orig_id id;
+ uint16_t flags; /* any LOG_ORIG_FL_* */
+};
+
/* max number of extra log origins */
#define LOG_ORIG_EXTRA_SLOTS LOG_ORIG_MAX - LOG_ORIG_EXTRA
int init_log_buffers(void);
void deinit_log_buffers(void);
-const char *log_orig_to_str(enum log_orig orig);
+const char *log_orig_to_str(enum log_orig_id orig);
void lf_expr_init(struct lf_expr *expr);
int lf_expr_dup(const struct lf_expr *orig, struct lf_expr *dest);
void free_logformat_list(struct list *fmt);
void free_logformat_node(struct logformat_node *node);
+/* helper to build log_orig struct from known id and flags values */
+static inline struct log_orig log_orig(enum log_orig_id id, uint16_t flags)
+{
+ struct log_orig orig;
+
+ orig.id = id;
+ orig.flags = flags;
+ return orig;
+}
+
/* build a log line for the session and an optional stream */
int sess_build_logline_orig(struct session *sess, struct stream *s, char *dst, size_t maxsize,
- struct lf_expr *lf_expr, enum log_orig orig);
+ struct lf_expr *lf_expr, struct log_orig orig);
/* wrapper for sess_build_logline_orig(), uses LOG_ORIG_UNSPEC log origin */
static inline int sess_build_logline(struct session *sess, struct stream *s, char *dst, size_t maxsize,
struct lf_expr *lf_expr)
{
- return sess_build_logline_orig(sess, s, dst, maxsize, lf_expr, LOG_ORIG_UNSPEC);
+ return sess_build_logline_orig(sess, s, dst, maxsize, lf_expr,
+ log_orig(LOG_ORIG_UNSPEC, LOG_ORIG_FL_NONE));
}
/*
* send a log for the stream when we have enough info about it.
* Will not log if the frontend has no log defined.
*/
-void strm_log(struct stream *s, int origin);
+void strm_log(struct stream *s, struct log_orig origin);
/* send an error log for the session, embryonic version should be used
* when the log is emitted for a session which is still in embryonic state
void free_logger(struct logger *logger);
void deinit_log_target(struct log_target *target);
struct log_profile *log_profile_find_by_name(const char *name);
-enum log_orig log_orig_register(const char *name);
+enum log_orig_id log_orig_register(const char *name);
/* Parse "log" keyword and update the linked list. */
int parse_logger(char **args, struct list *loggers, int do_del, const char *file, int linenum, char **err);
* Builds a log line for the stream (must be valid).
*/
static inline int build_logline_orig(struct stream *s, char *dst, size_t maxsize,
- struct lf_expr *lf_expr, enum log_orig orig)
+ struct lf_expr *lf_expr, struct log_orig orig)
{
return sess_build_logline_orig(strm_sess(s), s, dst, maxsize, lf_expr, orig);
}
*/
static inline int build_logline(struct stream *s, char *dst, size_t maxsize, struct lf_expr *lf_expr)
{
- return build_logline_orig(s, dst, maxsize, lf_expr, LOG_ORIG_UNSPEC);
+ return build_logline_orig(s, dst, maxsize, lf_expr,
+ log_orig(LOG_ORIG_UNSPEC, LOG_ORIG_FL_NONE));
}
struct ist *build_log_header(struct log_header hdr, size_t *nbelem);
#include <haproxy/dynbuf-t.h>
#include <haproxy/filters-t.h>
#include <haproxy/obj_type-t.h>
+#include <haproxy/log-t.h>
#include <haproxy/show_flags-t.h>
#include <haproxy/stick_table-t.h>
#include <haproxy/vars-t.h>
struct strm_logs logs; /* logs for this stream */
void (*do_log)(struct stream *s, /* the function to call in order to log (or NULL) */
- int origin);
+ struct log_orig origin);
void (*srv_error)(struct stream *s, /* the function to call upon unrecoverable server errors (or NULL) */
struct stconn *sc);
if (!lf_expr_isempty(&fe->logformat) && s->logs.logwait &&
!(s->flags & SF_MONITOR) &&
(!(fe->options & PR_O_NULLNOLOG) || s->req.total)) {
- s->do_log(s, LOG_ORIG_TXN_CLOSE);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_CLOSE, LOG_ORIG_FL_NONE));
}
/* stop tracking content-based counters */
/* we have the client ip */
if (s->logs.logwait & LW_CLIP)
if (!(s->logs.logwait &= ~(LW_CLIP|LW_INIT)))
- s->do_log(s, LOG_ORIG_TXN_ACCEPT);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_ACCEPT, LOG_ORIG_FL_NONE));
}
else if (conn) {
src = sc_src(s->scf);
txn->uri[len] = 0;
if (!(s->logs.logwait &= ~(LW_REQ|LW_INIT)))
- s->do_log(s, LOG_ORIG_TXN_REQUEST);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_REQUEST, LOG_ORIG_FL_NONE));
} else {
ha_alert("HTTP logging : out of memory.\n");
}
if (!lf_expr_isempty(&sess->fe->logformat) && !(s->logs.logwait & LW_BYTES)) {
s->logs.t_close = s->logs.t_data; /* to get a valid end date */
s->logs.bytes_out = htx->data;
- s->do_log(s, LOG_ORIG_TXN_RESPONSE);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_RESPONSE, LOG_ORIG_FL_NONE));
s->logs.bytes_out = 0;
}
static struct list log_origins = LIST_HEAD_INIT(log_origins);
/* get human readable representation for log_orig enum members */
-const char *log_orig_to_str(enum log_orig orig)
+const char *log_orig_to_str(enum log_orig_id orig)
{
switch (orig) {
case LOG_ORIG_SESS_ERROR:
struct process_send_log_ctx {
struct session *sess;
struct stream *stream;
- enum log_orig origin;
+ struct log_orig origin;
};
static inline void _process_send_log_final(struct logger *logger, struct log_header hdr,
struct log_profile_step *step = NULL;
struct ist orig_tag = hdr.metadata[LOG_META_TAG];
struct ist orig_sd = hdr.metadata[LOG_META_STDATA];
- enum log_orig orig = (ctx) ? ctx->origin : LOG_ORIG_UNSPEC;
+ enum log_orig_id orig = (ctx) ? ctx->origin.id : LOG_ORIG_UNSPEC;
BUG_ON(!prof);
*/
int sess_build_logline_orig(struct session *sess, struct stream *s,
char *dst, size_t maxsize, struct lf_expr *lf_expr,
- enum log_orig log_orig)
+ struct log_orig log_orig)
{
struct lf_buildctx *ctx = &lf_buildctx;
struct proxy *fe = sess->fe;
break;
case LOG_FMT_ORIGIN: // %OG
- ret = lf_text(tmplog, log_orig_to_str(log_orig),
+ ret = lf_text(tmplog, log_orig_to_str(log_orig.id),
dst + maxsize - tmplog, ctx);
if (ret == NULL)
goto out;
* send a log for the stream when we have enough info about it.
* Will not log if the frontend has no log defined.
*/
-void strm_log(struct stream *s, int origin)
+void strm_log(struct stream *s, struct log_orig origin)
{
struct session *sess = s->sess;
int size, err, level;
{
int size, level;
int sd_size = 0;
- int orig = (embryonic) ? LOG_ORIG_SESS_KILL : LOG_ORIG_SESS_ERROR;
+ struct log_orig orig;
if (!sess)
return;
+ if (embryonic)
+ orig = log_orig(LOG_ORIG_SESS_KILL, LOG_ORIG_FL_NONE);
+ else
+ orig = log_orig(LOG_ORIG_SESS_ERROR, LOG_ORIG_FL_NONE);
+
if (LIST_ISEMPTY(&sess->fe->loggers))
return;
* Don't forget to update the documentation when new log origins are added
* (both %OG log alias and on <step> log-profile keyword are concerned)
*/
-enum log_orig log_orig_register(const char *name)
+enum log_orig_id log_orig_register(const char *name)
{
struct log_origin_node *cur;
size_t last = 0;
if (!lf_expr_isempty(&strm_fe(s)->logformat) && !(s->logs.logwait & LW_BYTES)) {
/* note: no pend_pos here, session is established */
s->logs.t_close = s->logs.t_connect; /* to get a valid end date */
- s->do_log(s, LOG_ORIG_TXN_CONNECT);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_CONNECT, LOG_ORIG_FL_NONE));
}
}
else {
pendconn_free(s);
stream_cond_update_cpu_usage(s);
- s->do_log(s, LOG_ORIG_TXN_CLOSE);
+ s->do_log(s, log_orig(LOG_ORIG_TXN_CLOSE, LOG_ORIG_FL_NONE));
}
/* update time stats for this stream */