Hello,
Il 27/08/2012 09:41, Riccardo Magliocchetti ha scritto:
Hello Stephan,
Il 27/08/2012 09:13, Stephan Bergmann ha scritto:
On 08/26/2012 12:34 PM, Riccardo Magliocchetti wrote:
while in headless mode i'd like to have messages delivered to syslog
instead of stderr / stdout, looking at the SAL_* implementation it looks
like what i want is to substitute the std::fputs in
osl/all/log.cxx::log() with syslog() plus some map between these levels
and syslog ones. Is that ok?
yes
So here's a quick patch, not even compile tested because i have few
questions to resolve before considering it ready for review:
- what about errors? it looks like SAL does not have a level for errors.
I'd like to have the errors in vcl/headless/headlessinst.cxx going to
syslog too. Should i use straight syslog or can i use another facility?
- is it ok to initialize syslog in desktop/source/app/sofficemain.cxx?
- can you suggests something better than WANT_SYSLOG_LOGS ? :)
- should i add a switch for syslog logging to configure so that the
feature may be used also in other environments? May be useful for large
deployments i think where you want centralized logs.
thanks in advance,
riccardo
diff --git a/configure.in b/configure.in
index 7d7ec8b..b7cc0f4 100644
--- a/configure.in
+++ b/configure.in
@@ -9098,6 +9098,8 @@ if test "x$enable_headless" = "xyes"; then
ENABLE_HEADLESS="TRUE"
SCPDEFS="$SCPDEFS -DLIBO_HEADLESS"
R="headless"
+ dnl if we support syslog, we want our logs there
+ AC_CHECK_HEADER(syslog.h, AC_DEFINE(WANT_SYSLOG_LOGS))
fi
AC_SUBST(ENABLE_HEADLESS)
diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index a0fba04..251cc20 100755
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -43,6 +43,10 @@
#include <windows.h>
#endif
+#ifdef WANT_SYSLOG_LOGS
+#include <syslog.h>
+#endif
+
int SVMain();
// -=-= main() -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -82,6 +86,9 @@ extern "C" int DESKTOP_DLLPUBLIC soffice_main()
return EXIT_FAILURE;
}
#endif
+#ifdef WANT_SYSLOG_LOGS
+ openlog("libreoffice", 0, LOG_USER);
+#endif
return SVMain();
#if defined ANDROID || defined WNT
} catch (const ::com::sun::star::uno::Exception &e) {
diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx
index bac0e93..f869060 100644
--- a/sal/osl/all/log.cxx
+++ b/sal/osl/all/log.cxx
@@ -55,6 +55,10 @@
#define OSL_DETAIL_GETPID getpid()
#endif
+#ifdef WANT_SYSLOG_LOGS
+#include <syslog.h>
+#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.
@@ -82,6 +86,22 @@ char const * toString(sal_detail_LogLevel level) {
}
}
+#ifdef WANT_SYSLOG_LOGS
+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;
@@ -156,14 +176,21 @@ void log(
char const * message)
{
std::ostringstream s;
+#ifndef WANT_SYSLOG_LOGS
+ s << toString(level) << ':';
+#endif
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';
}
+#ifdef WANT_SYSLOG_LOGS
+ syslog(toSyslogPriority(level), "%s", s.str().c_str());
+#else
std::fputs(s.str().c_str(), stderr);
+#endif
}
}
diff --git a/vcl/headless/headlessinst.cxx b/vcl/headless/headlessinst.cxx
index 439de86..792e8af 100644
--- a/vcl/headless/headlessinst.cxx
+++ b/vcl/headless/headlessinst.cxx
@@ -78,7 +78,6 @@ public:
virtual bool ErrorTrapPop( bool ) { return false; }
};
-// All the interesting stuff is slaved from the AndroidSalInstance
void InitSalData() {}
void DeInitSalData() {}
void InitSalMain() {}
@@ -89,6 +88,7 @@ void SalAbort( const rtl::OUString& rErrorText, bool bDumpCore )
rtl::OUString aError( rErrorText );
if( aError.isEmpty() )
aError = rtl::OUString::createFromAscii("Unknown application error");
+ /* FIXME: use sal error ? */
::fprintf( stderr, "%s\n", rtl::OUStringToOString(rErrorText,
osl_getThreadTextEncoding()).getStr() );
::fprintf( stderr, "SalAbort: '%s'",
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.