[Libreoffice-commits] core.git: include/sal sal/osl
Tor Lillqvist
tml at collabora.com
Thu Aug 18 11:30:04 UTC 2016
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 <tml at 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)) {
More information about the Libreoffice-commits
mailing list