mirror of https://gitee.com/bigwinds/arangodb
Forward ERROR & FATAL logmessages into the windows eventlog. Else debugging services in the early starting phase is next to impossible.
This commit is contained in:
parent
023d880b5f
commit
6b22b1e31c
|
@ -1317,14 +1317,24 @@ void TRI_Log (char const* func,
|
||||||
TRI_tid_t threadId;
|
TRI_tid_t threadId;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "win-utils.h"
|
||||||
|
if ((level == TRI_LOG_LEVEL_FATAL) || (level == TRI_LOG_LEVEL_ERROR)) {
|
||||||
|
va_list wva;
|
||||||
|
va_copy(wva, ap);
|
||||||
|
TRI_LogWindowsEventlog(func, file, line, fmt, ap);
|
||||||
|
va_end(wva);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (! LoggingActive) {
|
if (! LoggingActive) {
|
||||||
return;
|
return;
|
||||||
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
processId = TRI_CurrentProcessId();
|
processId = TRI_CurrentProcessId();
|
||||||
threadId = TRI_CurrentThreadId();
|
threadId = TRI_CurrentThreadId();
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
LogThread(func, file, line, level, severity, processId, threadId, fmt, ap);
|
LogThread(func, file, line, level, severity, processId, threadId, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
|
@ -461,6 +461,60 @@ int TRI_MapSystemError (DWORD error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief logs a message to the windows event log.
|
||||||
|
/// we rather are keen on logging something at all then on being able to work
|
||||||
|
/// with fancy dynamic buffers; thus we work with a static buffer.
|
||||||
|
/// the arango internal logging will handle that usually.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// No clue why there is no header for these...
|
||||||
|
#define MSG_INVALID_COMMAND ((DWORD)0xC0020100L)
|
||||||
|
#define UI_CATEGORY ((WORD)0x00000003L)
|
||||||
|
void TRI_LogWindowsEventlog (char const* func,
|
||||||
|
char const* file,
|
||||||
|
int line,
|
||||||
|
char const* fmt,
|
||||||
|
va_list ap) {
|
||||||
|
|
||||||
|
char buf[1024];
|
||||||
|
char linebuf[32];
|
||||||
|
LPCSTR logBuffers [] = {
|
||||||
|
buf,
|
||||||
|
file,
|
||||||
|
func,
|
||||||
|
linebuf,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
HANDLE hEventLog = NULL;
|
||||||
|
|
||||||
|
hEventLog = RegisterEventSource(NULL, "ArangoDB");
|
||||||
|
if (NULL == hEventLog) {
|
||||||
|
// well, fail then.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(linebuf, sizeof(linebuf), "%d", line);
|
||||||
|
|
||||||
|
DWORD len = _vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
|
||||||
|
// Try to get messages through to windows syslog...
|
||||||
|
if (!ReportEvent(hEventLog,
|
||||||
|
EVENTLOG_ERROR_TYPE,
|
||||||
|
UI_CATEGORY,
|
||||||
|
MSG_INVALID_COMMAND,
|
||||||
|
NULL, 4, 0, (LPCSTR*) logBuffers,
|
||||||
|
NULL)) {
|
||||||
|
// well, fail then...
|
||||||
|
}
|
||||||
|
DeregisterEventSource(hEventLog);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- END-OF-FILE
|
// --SECTION-- END-OF-FILE
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -106,6 +106,19 @@ void TRI_FixIcuDataEnv ();
|
||||||
|
|
||||||
int TRI_MapSystemError (DWORD);
|
int TRI_MapSystemError (DWORD);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief logs a message to the windows event log.
|
||||||
|
/// we rather are keen on logging something at all then on being able to work
|
||||||
|
/// with fancy dynamic buffers; thus we work with a static buffer.
|
||||||
|
/// the arango internal logging will handle that usually.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void TRI_LogWindowsEventlog (char const* func,
|
||||||
|
char const* file,
|
||||||
|
int line,
|
||||||
|
char const* fmt,
|
||||||
|
va_list ap);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue