summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Magliocchetti <riccardo.magliocchetti@gmail.com>2012-11-23 18:34:17 +0100
committerStephan Bergmann <sbergman@redhat.com>2012-12-20 11:24:42 +0100
commit2c9ab4bd1bd895478ca6c5887b05ff29a73f1215 (patch)
treef51232578cb1e0b3c35f4a5f4ce48aca4da2b524
parent585e4181f09d1860413051c8f111ecf4f9deb786 (diff)
Add ability to send SAL_* messages to syslog
Use environment variable SAL_LOG_SYSLOG=1 Change-Id: I0c260ca69fbeefb0c2e8cc46ca6955e92791c05b Signed-off-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r--config/config_global.h.in1
-rw-r--r--configure.ac5
-rw-r--r--sal/osl/all/log.cxx37
-rw-r--r--sal/osl/unx/salinit.cxx13
4 files changed, 52 insertions, 4 deletions
diff --git a/config/config_global.h.in b/config/config_global.h.in
index 77980d48fde5..63effa9eab07 100644
--- a/config/config_global.h.in
+++ b/config/config_global.h.in
@@ -13,3 +13,4 @@ Any change in this header will cause a rebuild of almost everything.
#undef HAVE_GCC_BUILTIN_ATOMIC
#undef HAVE_SFINAE_ANONYMOUS_BROKEN
#undef HAVE_THREADSAFE_STATICS
+#undef HAVE_SYSLOG_H
diff --git a/configure.ac b/configure.ac
index d344884bc13f..d47cb4b96cc5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4257,7 +4257,10 @@ SOURCEVERSION="OOO$UPD"
AC_SUBST(UPD)
AC_SUBST(SOURCEVERSION)
-
+dnl ===================================================================
+dnl Check for syslog header
+dnl ===================================================================
+AC_CHECK_HEADER(syslog.h, AC_DEFINE(HAVE_SYSLOG_H))
dnl ===================================================================
dnl Set the ENABLE_CRASHDUMP variable.
diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx
index 8d4d5f2ac3c5..7e43082cc85a 100644
--- a/sal/osl/all/log.cxx
+++ b/sal/osl/all/log.cxx
@@ -56,6 +56,12 @@
#define OSL_DETAIL_GETPID getpid()
#endif
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+// sal/osl/unx/salinit.cxx::sal_detail_initialize updates this:
+bool sal_use_syslog;
+#endif
+
// Avoid the use of other sal code in this file as much as possible, so that
// this code can be called from other sal code without causing endless
// recursion.
@@ -96,6 +102,22 @@ char const * getEnvironmentVariable() {
return p2;
}
+#ifdef HAVE_SYSLOG_H
+int toSyslogPriority(sal_detail_LogLevel level) {
+ switch (level) {
+ default:
+ assert(false); // this cannot happen
+ // fall through
+ case SAL_DETAIL_LOG_LEVEL_INFO:
+ return LOG_INFO;
+ case SAL_DETAIL_LOG_LEVEL_WARN:
+ return LOG_WARNING;
+ case SAL_DETAIL_LOG_LEVEL_DEBUG:
+ return LOG_DEBUG;
+ }
+}
+#endif
+
bool report(sal_detail_LogLevel level, char const * area) {
if (level == SAL_DETAIL_LOG_LEVEL_DEBUG)
return true;
@@ -167,14 +189,23 @@ void log(
char const * message)
{
std::ostringstream s;
+#ifdef HAVE_SYSLOG_H
+ if (!sal_use_syslog)
+#endif
+ s << toString(level) << ':';
if (level == SAL_DETAIL_LOG_LEVEL_DEBUG) {
- s << toString(level) << ':' << /*no where*/' ' << message << '\n';
+ s << /*no where*/' ' << message << '\n';
} else {
- s << toString(level) << ':' << area << ':' << OSL_DETAIL_GETPID << ':'
+ s << area << ':' << OSL_DETAIL_GETPID << ':'
<< osl::Thread::getCurrentIdentifier() << ':' << where << message
<< '\n';
}
- std::fputs(s.str().c_str(), stderr);
+#ifdef HAVE_SYSLOG_H
+ if (sal_use_syslog)
+ syslog(toSyslogPriority(level), "%s", s.str().c_str());
+ else
+#endif
+ std::fputs(s.str().c_str(), stderr);
}
}
diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx
index d880258f387e..4211d081ad7e 100644
--- a/sal/osl/unx/salinit.cxx
+++ b/sal/osl/unx/salinit.cxx
@@ -29,6 +29,13 @@
#include "sal/main.h"
#include "sal/types.h"
+#ifdef HAVE_SYSLOG_H
+#include <string.h>
+#include <syslog.h>
+// from sal/osl/all/log.cxx:
+extern bool sal_use_syslog;
+#endif
+
extern "C" {
void sal_detail_initialize(int argc, char ** argv) {
@@ -57,6 +64,12 @@ void sal_detail_initialize(int argc, char ** argv) {
close(fd);
}
#endif
+#ifdef HAVE_SYSLOG_H
+ const char *use_syslog = getenv("SAL_LOG_SYSLOG");
+ sal_use_syslog = use_syslog != NULL && !strcmp(use_syslog, "1");
+ if (sal_use_syslog)
+ openlog("libreoffice", 0, LOG_USER);
+#endif
osl_setCommandArgs(argc, argv);
}