[PATCH] dix: adding timestamps to the server logs.
Alan Coopersmith
Alan.Coopersmith at Sun.COM
Tue Sep 1 02:19:38 PDT 2009
localtime() & strftime() are not safe to call from signal handlers.
Perhaps we should have special log functions to call from signal handlers
instead of reusing, and thus limiting, the main ones - but until that happens,
we need to stick to async-signal-safe functions in the log routines.
--
-Alan Coopersmith- alan.coopersmith at sun.com
Sun Microsystems, Inc. - X Window System Engineering
Bhaskar Tilak wrote:
> This patch prepends a timestamp to each line of the X log file.
> Hopefully, this is helpful in diagnosing user problems, and correlating
> between events in the X log and system log.
>
> Here is an example snippet of the X log with timestamps prepended:
>
> Aug 31 16:08:47 (II) Loading extension XFree86-VidModeExtension
> Aug 31 16:08:47 (II) Loading extension DPMS
> Aug 31 16:08:47 (II) Loading extension XVideo
> Aug 31 16:08:47 (II) Loading extension XVideo-MotionCompensation
>
> This patch enables timestamps by default, and provides a "-notimestamps"
> commandline option to disable timestamps.
> ---
> dix/globals.c | 5 +++++
> doc/Xserver.man.pre | 4 ++++
> include/globals.h | 1 +
> os/log.c | 30 ++++++++++++++++++++++++------
> os/utils.c | 5 +++++
> 5 files changed, 39 insertions(+), 6 deletions(-)
>
> diff --git a/dix/globals.c b/dix/globals.c
> index c24a94f..49a0819 100644
> --- a/dix/globals.c
> +++ b/dix/globals.c
> @@ -139,3 +139,8 @@ char *ConnectionInfo;
> CARD32 TimeOutValue = DEFAULT_TIMEOUT * MILLI_PER_SECOND;
>
> DDXPointRec dixScreenOrigins[MAXSCREENS];
> +
> +/* Timestamping support for X logs. By default, timestamping in X logs is on.
> + * Use command line option '-notimestamps' to turn it off.
> + */
> +Bool logTimestamps = TRUE;
> diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
> index 6154191..699fd15 100644
> --- a/doc/Xserver.man.pre
> +++ b/doc/Xserver.man.pre
> @@ -197,6 +197,10 @@ overrides a previous
> .B \-terminate
> command line option.
> .TP 8
> +.B \-notimestamps
> +Disable the time stamps in the X log file.
> +By default, the server adds the time stamps to the X log file.
> +.TP 8
> .B \-p \fIminutes\fP
> sets screen-saver pattern cycle time in minutes.
> .TP 8
> diff --git a/include/globals.h b/include/globals.h
> index 52c19a4..779f994 100644
> --- a/include/globals.h
> +++ b/include/globals.h
> @@ -26,6 +26,7 @@ extern _X_EXPORT Bool noTestExtensions;
> extern _X_EXPORT DDXPointRec dixScreenOrigins[MAXSCREENS];
>
> extern _X_EXPORT char *ConnectionInfo;
> +extern _X_EXPORT Bool logTimestamps;
>
> #ifdef DPMSExtension
> extern _X_EXPORT CARD32 DPMSStandbyTime;
> diff --git a/os/log.c b/os/log.c
> index 8108890..47364bb 100644
> --- a/os/log.c
> +++ b/os/log.c
> @@ -316,7 +316,10 @@ void
> LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
> {
> const char *s = X_UNKNOWN_STRING;
> - char tmpBuf[1024];
> + char tmpBuf[1024], timestampBuf[32];
> + time_t rawtime;
> + struct tm *timeinfo = NULL;
> + int timeFault = 0;
>
> /* Ignore verbosity for X_ERROR */
> if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
> @@ -358,11 +361,26 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
> break;
> }
>
> - /* if s is not NULL we need a space before format */
> - snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
> - s ? " " : "",
> - format);
> - LogVWrite(verb, tmpBuf, args);
> + if (!logTimestamps || (-1 == time(&rawtime))) {
> + timeFault = 1;
> + } else {
> + if (NULL == (timeinfo = localtime(&rawtime)))
> + timeFault = 1;
> + }
> +
> + if (timeFault || !strftime(timestampBuf, sizeof(timestampBuf),
> + "%b %d %X ", timeinfo))
> + timestampBuf[0] = '\0';
> +
> + /* being extra cautious with string management */
> + timestampBuf[31] = '\0';
> +
> + /* if s is not NULL we need a space before format */
> + snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s%s", timestampBuf,
> + s ? s : "",
> + s ? " " : "",
> + format);
> + LogVWrite(verb, tmpBuf, args);
> }
> }
>
> diff --git a/os/utils.c b/os/utils.c
> index 3718b17..eeb9781 100644
> --- a/os/utils.c
> +++ b/os/utils.c
> @@ -511,6 +511,7 @@ void UseMsg(void)
> ErrorF("-logo enable logo in screen saver\n");
> ErrorF("nologo disable logo in screen saver\n");
> #endif
> + ErrorF("-notimestamps disable the timestamps in X log file\n");
> ErrorF("-nolisten string don't listen on protocol\n");
> ErrorF("-noreset don't reset after last client exists\n");
> ErrorF("-reset reset after last client exists\n");
> @@ -960,6 +961,10 @@ ProcessCommandLine(int argc, char *argv[])
> else
> UseMsg();
> }
> + else if ( strcmp( argv[i], "-notimestamps") == 0)
> + {
> + logTimestamps = FALSE;
> + }
> else
> {
> ErrorF("Unrecognized option: %s\n", argv[i]);
More information about the xorg-devel
mailing list