mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 22:55:23 +00:00
virlog: Introduce virLogNewOutputTo* as a replacement for virLogAddOutputTo*
Continuing with the effort to split output parsing and defining, these new functions return a logging object reference instead of defining the output. Eventually, these functions will replace the existing ones (virLogAddOutputTo*) which will then be dropped. Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
58ab1b6f89
commit
4c35229580
@ -782,6 +782,14 @@ virLogAddOutputToStderr(virLogPriority priority)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virLogOutputPtr ATTRIBUTE_UNUSED
|
||||||
|
virLogNewOutputToStderr(virLogPriority priority)
|
||||||
|
{
|
||||||
|
return virLogOutputNew(virLogOutputToFd, NULL, (void *)STDERR_FILENO,
|
||||||
|
priority, VIR_LOG_TO_STDERR, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virLogAddOutputToFile(virLogPriority priority,
|
virLogAddOutputToFile(virLogPriority priority,
|
||||||
const char *file)
|
const char *file)
|
||||||
@ -801,6 +809,27 @@ virLogAddOutputToFile(virLogPriority priority,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virLogOutputPtr ATTRIBUTE_UNUSED
|
||||||
|
virLogNewOutputToFile(virLogPriority priority,
|
||||||
|
const char *file)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
virLogOutputPtr ret = NULL;
|
||||||
|
|
||||||
|
fd = open(file, O_CREAT | O_APPEND | O_WRONLY, S_IRUSR | S_IWUSR);
|
||||||
|
if (fd < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(ret = virLogOutputNew(virLogOutputToFd, virLogCloseFd,
|
||||||
|
(void *)(intptr_t)fd,
|
||||||
|
priority, VIR_LOG_TO_FILE, file))) {
|
||||||
|
VIR_LOG_CLOSE(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_SYSLOG_H || USE_JOURNALD
|
#if HAVE_SYSLOG_H || USE_JOURNALD
|
||||||
|
|
||||||
/* Compat in case we build with journald, but no syslog */
|
/* Compat in case we build with journald, but no syslog */
|
||||||
@ -888,6 +917,51 @@ virLogAddOutputToSyslog(virLogPriority priority,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virLogOutputPtr ATTRIBUTE_UNUSED
|
||||||
|
virLogNewOutputToSyslog(virLogPriority priority,
|
||||||
|
const char *ident)
|
||||||
|
{
|
||||||
|
virLogOutputPtr ret = NULL;
|
||||||
|
int at = -1;
|
||||||
|
|
||||||
|
/* There are a couple of issues with syslog:
|
||||||
|
* 1) If we re-opened the connection by calling openlog now, it would change
|
||||||
|
* the message tag immediately which is not what we want, since we might be
|
||||||
|
* in the middle of parsing of a new set of outputs where anything still can
|
||||||
|
* go wrong and we would introduce an inconsistent state to the log. We're
|
||||||
|
* also not holding a lock on the logger if we tried to change the tag
|
||||||
|
* while other workers are actively logging.
|
||||||
|
*
|
||||||
|
* 2) Syslog keeps the open file descriptor private, so we can't just dup()
|
||||||
|
* it like we would do with files if an output already existed.
|
||||||
|
*
|
||||||
|
* If a syslog connection already exists changing the message tag has to be
|
||||||
|
* therefore special-cased and postponed until the very last moment.
|
||||||
|
*/
|
||||||
|
if ((at = virLogFindOutput(virLogOutputs, virLogNbOutputs,
|
||||||
|
VIR_LOG_TO_SYSLOG, NULL)) < 0) {
|
||||||
|
/*
|
||||||
|
* rather than copying @ident, syslog uses caller's reference instead
|
||||||
|
*/
|
||||||
|
VIR_FREE(current_ident);
|
||||||
|
if (VIR_STRDUP(current_ident, ident) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
openlog(current_ident, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret = virLogOutputNew(virLogOutputToSyslog, virLogCloseSyslog,
|
||||||
|
NULL, priority, VIR_LOG_TO_SYSLOG, ident))) {
|
||||||
|
if (at < 0) {
|
||||||
|
closelog();
|
||||||
|
VIR_FREE(current_ident);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# if USE_JOURNALD
|
# if USE_JOURNALD
|
||||||
# define IOVEC_SET(iov, data, size) \
|
# define IOVEC_SET(iov, data, size) \
|
||||||
do { \
|
do { \
|
||||||
@ -1102,6 +1176,31 @@ static int virLogAddOutputToJournald(int priority)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virLogOutputPtr ATTRIBUTE_UNUSED
|
||||||
|
virLogNewOutputToJournald(int priority)
|
||||||
|
{
|
||||||
|
int journalfd;
|
||||||
|
virLogOutputPtr ret = NULL;
|
||||||
|
|
||||||
|
if ((journalfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (virSetInherit(journalfd, false) < 0) {
|
||||||
|
VIR_LOG_CLOSE(journalfd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret = virLogOutputNew(virLogOutputToJournald, virLogCloseFd,
|
||||||
|
(void *)(intptr_t) journalfd, priority,
|
||||||
|
VIR_LOG_TO_JOURNALD, NULL))) {
|
||||||
|
VIR_LOG_CLOSE(journalfd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
# endif /* USE_JOURNALD */
|
# endif /* USE_JOURNALD */
|
||||||
|
|
||||||
int virLogPriorityFromSyslog(int priority)
|
int virLogPriorityFromSyslog(int priority)
|
||||||
|
Loading…
Reference in New Issue
Block a user