mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-05-04 04:31:49 +02:00
MINOR: log: support explicit log target as argument in __do_send_log()
__do_send_log() now takes an extra target parameter to pass an explicit log target instead of getting it from logger->target. This will allow __do_send_log() to be called multiple times within a logger entry containing multiple log targets.
This commit is contained in:
parent
cc3dfe89ed
commit
60c5821867
31
src/log.c
31
src/log.c
@ -1738,13 +1738,16 @@ struct ist *build_log_header(enum log_fmt format, int level, int facility,
|
||||
}
|
||||
|
||||
/*
|
||||
* This function sends a syslog message to <logger>.
|
||||
* This function sends a syslog message.
|
||||
* <logger> is the parent log entry used to deduce auto settings,
|
||||
* <target> is the actual log target where log will be sent,
|
||||
* The argument <metadata> MUST be an array of size
|
||||
* LOG_META_FIELDS*sizeof(struct ist) containing data to build the header.
|
||||
* It overrides the last byte of the message vector with an LF character.
|
||||
* Does not return any error,
|
||||
*/
|
||||
static inline void __do_send_log(struct logger *logger, int nblogger, int level, int facility, struct ist *metadata, char *message, size_t size)
|
||||
static inline void __do_send_log(struct logger *logger, struct log_target *target,
|
||||
int nblogger, int level, int facility, struct ist *metadata, char *message, size_t size)
|
||||
{
|
||||
static THREAD_LOCAL struct iovec iovec[NB_LOG_HDR_MAX_ELEMENTS+1+1] = { }; /* header elements + message + LF */
|
||||
static THREAD_LOCAL struct msghdr msghdr = {
|
||||
@ -1766,23 +1769,23 @@ static inline void __do_send_log(struct logger *logger, int nblogger, int level,
|
||||
while (size && (message[size-1] == '\n' || (message[size-1] == 0)))
|
||||
size--;
|
||||
|
||||
if (logger->target.type == LOG_TARGET_BUFFER) {
|
||||
if (target->type == LOG_TARGET_BUFFER) {
|
||||
plogfd = NULL;
|
||||
goto send;
|
||||
}
|
||||
else if (logger->target.addr->ss_family == AF_CUST_EXISTING_FD) {
|
||||
else if (target->addr->ss_family == AF_CUST_EXISTING_FD) {
|
||||
/* the socket's address is a file descriptor */
|
||||
plogfd = (int *)&((struct sockaddr_in *)logger->target.addr)->sin_addr.s_addr;
|
||||
plogfd = (int *)&((struct sockaddr_in *)target->addr)->sin_addr.s_addr;
|
||||
}
|
||||
else if (logger->target.addr->ss_family == AF_UNIX)
|
||||
else if (target->addr->ss_family == AF_UNIX)
|
||||
plogfd = &logfdunix;
|
||||
else
|
||||
plogfd = &logfdinet;
|
||||
|
||||
if (plogfd && unlikely(*plogfd < 0)) {
|
||||
/* socket not successfully initialized yet */
|
||||
if ((*plogfd = socket(logger->target.addr->ss_family, SOCK_DGRAM,
|
||||
(logger->target.addr->ss_family == AF_UNIX) ? 0 : IPPROTO_UDP)) < 0) {
|
||||
if ((*plogfd = socket(target->addr->ss_family, SOCK_DGRAM,
|
||||
(target->addr->ss_family == AF_UNIX) ? 0 : IPPROTO_UDP)) < 0) {
|
||||
static char once;
|
||||
|
||||
if (!once) {
|
||||
@ -1802,7 +1805,7 @@ static inline void __do_send_log(struct logger *logger, int nblogger, int level,
|
||||
|
||||
msg_header = build_log_header(logger->format, level, facility, metadata, &nbelem);
|
||||
send:
|
||||
if (logger->target.type == LOG_TARGET_BUFFER) {
|
||||
if (target->type == LOG_TARGET_BUFFER) {
|
||||
struct ist msg;
|
||||
size_t maxlen = logger->maxlen;
|
||||
|
||||
@ -1813,9 +1816,9 @@ static inline void __do_send_log(struct logger *logger, int nblogger, int level,
|
||||
*/
|
||||
maxlen -= 1;
|
||||
|
||||
sent = sink_write(logger->target.sink, maxlen, &msg, 1, level, facility, metadata);
|
||||
sent = sink_write(target->sink, maxlen, &msg, 1, level, facility, metadata);
|
||||
}
|
||||
else if (logger->target.addr->ss_family == AF_CUST_EXISTING_FD) {
|
||||
else if (target->addr->ss_family == AF_CUST_EXISTING_FD) {
|
||||
struct ist msg;
|
||||
|
||||
msg = ist2(message, size);
|
||||
@ -1848,8 +1851,8 @@ static inline void __do_send_log(struct logger *logger, int nblogger, int level,
|
||||
i++;
|
||||
|
||||
msghdr.msg_iovlen = i;
|
||||
msghdr.msg_name = (struct sockaddr *)logger->target.addr;
|
||||
msghdr.msg_namelen = get_addr_len(logger->target.addr);
|
||||
msghdr.msg_name = (struct sockaddr *)target->addr;
|
||||
msghdr.msg_namelen = get_addr_len(target->addr);
|
||||
|
||||
sent = sendmsg(*plogfd, &msghdr, MSG_DONTWAIT | MSG_NOSIGNAL);
|
||||
}
|
||||
@ -1916,7 +1919,7 @@ void process_send_log(struct list *loggers, int level, int facility,
|
||||
__ha_cpu_relax());
|
||||
}
|
||||
if (in_range)
|
||||
__do_send_log(logger, ++nblogger, MAX(level, logger->minlvl),
|
||||
__do_send_log(logger, &logger->target, ++nblogger, MAX(level, logger->minlvl),
|
||||
(facility == -1) ? logger->facility : facility,
|
||||
metadata, message, size);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user