(!1688) os: log: add syslog support

Add support for logging to syslog.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-09-10 15:28:00 +02:00
parent 2d5c8090a8
commit 69bdc2c247
5 changed files with 69 additions and 0 deletions

View File

@ -23,6 +23,7 @@ is" without express or implied warranty.
#include "dix/screenint_priv.h"
#include "miext/extinit_priv.h"
#include "os/ddx_priv.h"
#include "os/log_priv.h"
#include "os/osdep.h"
#include "screenint.h"

View File

@ -88,6 +88,10 @@ OR PERFORMANCE OF THIS SOFTWARE.
#include <X11/Xfuncproto.h>
#include <X11/Xos.h>
#ifdef CONFIG_SYSLOG
#include <syslog.h>
#endif
#include "dix/dix_priv.h"
#include "dix/input_priv.h"
#include "os/audit.h"
@ -111,11 +115,16 @@ void (*OsVendorVErrorFProc) (const char *, va_list args) = NULL;
/* Default logging parameters. */
#define DEFAULT_LOG_VERBOSITY 0
#define DEFAULT_LOG_FILE_VERBOSITY 3
#define DEFAULT_SYSLOG_VERBOSITY 0
static int logFileFd = -1;
Bool xorgLogSync = FALSE;
int xorgLogVerbosity = DEFAULT_LOG_VERBOSITY;
int xorgLogFileVerbosity = DEFAULT_LOG_FILE_VERBOSITY;
#ifdef CONFIG_SYSLOG
int xorgSyslogVerbosity = DEFAULT_SYSLOG_VERBOSITY;
const char *xorgSyslogIdent = "X";
#endif
/* Buffer to information logged before the log file is opened. */
static char *saveBuffer = NULL;
@ -207,6 +216,18 @@ static inline void doLogSync(void) {
#endif
}
static void initSyslog(void) {
#ifdef CONFIG_SYSLOG
char buffer[4096];
strcpy(buffer, xorgSyslogIdent);
snprintf(buffer, sizeof(buffer), "%s :%s", xorgSyslogIdent, (display ? display : "<>"));
/* initialize syslog */
openlog(buffer, LOG_PID, LOG_LOCAL1);
#endif
}
/*
* LogInit is called to start logging to a file. It is also called (with
* NULL arguments) when logging to a file is not wanted. It must always be
@ -264,6 +285,7 @@ LogInit(const char *fname, const char *backup)
}
needBuffer = FALSE;
initSyslog();
return logFileName;
}
@ -295,6 +317,7 @@ LogSetDisplay(void)
free(saved_log_fname);
free(saved_log_backup);
}
initSyslog();
}
void
@ -541,6 +564,19 @@ pnprintf(char *string, int size, const char *f, ...)
return rc;
}
static void
LogSyslogWrite(int verb, const char *buf, size_t len, Bool end_line) {
#ifdef CONFIG_SYSLOG
if (inSignalContext) // syslog() ins't signal-safe yet :(
return; // shall we try syslog(2) syscall instead ?
if (verb >= 0 && xorgSyslogVerbosity < verb)
return;
syslog(LOG_PID, "%.*s", (int)len, buf);
#endif
}
/* This function does the actual log message writes. It must be signal safe.
* When attempting to call non-signal-safe functions, guard them with a check
* of the inSignalContext global variable. */
@ -550,6 +586,8 @@ LogSWrite(int verb, const char *buf, size_t len, Bool end_line)
static Bool newline = TRUE;
int ret;
LogSyslogWrite(verb, buf, len, end_line);
if (verb < 0 || xorgLogVerbosity >= verb)
ret = write(2, buf, len);

View File

@ -72,4 +72,21 @@ extern int xorgLogFileVerbosity;
*/
extern Bool xorgLogSync;
/**
* @brief syslog verbosity
*
* The verbosity level of logging to syslog. All messages with
* verbosity level below this one will be sent to local syslog daemon.
*/
extern int xorgSyslogVerbosity;
/**
* @brief syslog identifier
*
* The identifier prefix used for syslog logging.
* Per default will be filled with basename(argv[0]). DDX'es can override
* this before calling LogInit()
*/
extern const char *xorgSyslogIdent;
#endif /* __XORG_OS_LOGGING_H */

View File

@ -23,6 +23,8 @@ srcs_os = [
'log.c',
]
conf_data.set('CONFIG_SYSLOG', cc.has_header('syslog.h') ? '1' : false)
# Wrapper code for missing C library functions. Note that conf_data contains either '1' or false.
srcs_libc = []
if conf_data.get('HAVE_REALLOCARRAY').to_int() == 0

View File

@ -67,6 +67,8 @@ OR PERFORMANCE OF THIS SOFTWARE.
#define TRANS_REOPEN
#include <X11/Xtrans/Xtrans.h>
#include <libgen.h>
#include "input.h"
#include "dixfont.h"
#include <X11/fonts/libxfont2.h>
@ -428,6 +430,12 @@ ProcessCommandLine(int argc, char *argv[])
}
SeatId = getenv("XDG_SEAT");
#ifdef CONFIG_SYSLOG
xorgSyslogIdent = getenv("SYSLOG_IDENT");
if (!xorgSyslogIdent)
xorgSyslogIdent = strdup(basename(argv[0]));
#endif
for (i = 1; i < argc; i++) {
/* call ddx first, so it can peek/override if it wants */
if ((skip = ddxProcessArgument(argc, argv, i))) {
@ -797,6 +805,9 @@ ProcessCommandLine(int argc, char *argv[])
else
UseMsg();
}
#ifdef CONFIG_SYSLOG
else if (ProcessCmdLineMultiInt(argc, argv, &i, "-syslogverbose", &xorgSyslogVerbosity));
#endif
else {
ErrorF("Unrecognized option: %s\n", argv[i]);
UseMsg();