include/sal/log.hxx | 28 +++++++++++++++---------- sal/osl/all/log.cxx | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 13 deletions(-)
New commits: commit fb00c725bba8b5ea30d47d28d0e54c071f1fe2a6 Author: Tor Lillqvist <t...@collabora.com> Date: Thu Aug 18 14:07:00 2016 +0300 Add handling of a +TIMESTAMP flag in the SAL_LOG environment variable Change-Id: I9bdcd8b2d7b46a087d7f5461b6f7c3d9f02ec084 diff --git a/include/sal/log.hxx b/include/sal/log.hxx index e01d708..9465486 100644 --- a/include/sal/log.hxx +++ b/include/sal/log.hxx @@ -228,15 +228,21 @@ inline char const * unwrapStream(SAL_UNUSED_PARAMETER StreamIgnore const &) { with @verbatim - <switch> ::= <sense><level>("."<area>)? + <switch> ::= <sense><item> <sense> ::= "+"|"-" + <item> ::= <flag>|<level>("."<area>)? + <flag> ::= "TIMESTAMP" <level> ::= "INFO"|"WARN" @endverbatim - If the environment variable is unset, "+WARN" is used instead (which results - in all warnings being output but no infos). If the given value does not - match the regular expression, "+INFO+WARN" is used instead (which in turn - results in everything being output). + If the environment variable is unset, or contains no level, the level + setting "+WARN" is assumed instead (which results in all warnings being + output but no infos). If the given value does not match the regular + expression, "+INFO+WARN" is used instead (which in turn results in + everything being output). + + The "+TIMESTAMP" flag causes each output line (as selected by the level + switch(es)) to be prefixed by a timestamp like 2016-08-18:14:04:43.672. A given macro call's level (INFO or WARN) and area is matched against the given switches as follows: Only those switches for which the level matches @@ -251,12 +257,12 @@ inline char const * unwrapStream(SAL_UNUSED_PARAMETER StreamIgnore const &) { SAL_INFO("other", ...) generate output, while calls like SAL_INFO("foo", ...) or SAL_INFO("foo.barzzz", ...) do not. - The generated log output consists of the given level ("info" or "warn"), the - given area, the process ID, the thread ID, the source file, and the source - line number, each followed by a colon, followed by a space, the given - message, and a newline. The precise format of the log output is subject to - change. The log output is printed to stderr without further text encoding - conversion. + The generated log output consists of the optinal timestamp, the given level + ("info" or "warn"), the given area, the process ID, the thread ID, the + source file, and the source line number, each followed by a colon, followed + by a space, the given message, and a newline. The precise format of the log + output is subject to change. The log output is printed to stderr without + further text encoding conversion. @see @ref sal_log_areas diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx index 9c75393..da7eeeb 100644 --- a/sal/osl/all/log.cxx +++ b/sal/osl/all/log.cxx @@ -105,6 +105,55 @@ char const * getEnvironmentVariable() { return env; } +void maybeOutputTimestamp(std::ostringstream &s) { + char const * env = getEnvironmentVariable(); + if (env == nullptr) + return; + for (char const * p = env;;) { + switch (*p++) { + case '\0': + return; + case '+': + { + char const * p1 = p; + while (*p1 != '.' && *p1 != '+' && *p1 != '-' && *p1 != '\0') { + ++p1; + } + if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("TIMESTAMP"))) { + char ts[100]; + TimeValue systemTime; + osl_getSystemTime(&systemTime); + TimeValue localTime; + osl_getLocalTimeFromSystemTime(&systemTime, &localTime); + oslDateTime dateTime; + osl_getDateTimeFromTimeValue(&localTime, &dateTime); + struct tm tm; + tm.tm_sec = dateTime.Seconds; + tm.tm_min = dateTime.Minutes; + tm.tm_hour = dateTime.Hours; + tm.tm_mday = dateTime.Day; + tm.tm_mon = dateTime.Month - 1; + tm.tm_year = dateTime.Year - 1900; + strftime(ts, sizeof(ts), "%Y-%m-%d:%H:%M:%S", &tm); + char milliSecs[10]; + sprintf(milliSecs, "%03d", dateTime.NanoSeconds/1000000); + s << ts << '.' << milliSecs << ':'; + return; + } + char const * p2 = p1; + while (*p2 != '+' && *p2 != '-' && *p2 != '\0') { + ++p2; + } + p = p2; + } + break; + default: + ; // nothing + } + } + return; +} + #endif namespace { @@ -119,7 +168,7 @@ bool report(sal_detail_LogLevel level, char const * area) { return true; assert(area != nullptr); char const * env = getEnvironmentVariable(); - if (env == nullptr) { + if (env == nullptr || strcmp(env, "+TIMESTAMP") == 0) { env = "+WARN"; } std::size_t areaLen = std::strlen(area); @@ -156,6 +205,10 @@ bool report(sal_detail_LogLevel level, char const * area) { } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("WARN"))) { match = level == SAL_DETAIL_LOG_LEVEL_WARN; + } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("TIMESTAMP"))) + { + // handled later + match = false; } else { return true; // upon an illegal SAL_LOG value, everything is considered @@ -190,8 +243,9 @@ void log( std::ostringstream s; #if !defined ANDROID // On Android, the area will be used as the "tag," and log info already - // contains the PID + // contains timestamp and PID. if (!sal_use_syslog) { + maybeOutputTimestamp(s); s << toString(level) << ':'; } if (!isDebug(level)) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits