1 | /* $Id: Logging.cpp 37666 2011-06-28 12:33:34Z vboxsync $ */
|
---|
2 |
|
---|
3 | /** @file
|
---|
4 | *
|
---|
5 | * Logging in VBoxSVC.
|
---|
6 | */
|
---|
7 |
|
---|
8 | /*
|
---|
9 | * Copyright (C) 2011 Oracle Corporation
|
---|
10 | *
|
---|
11 | * This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
12 | * available from http://www.virtualbox.org. This file is free software;
|
---|
13 | * you can redistribute it and/or modify it under the terms of the GNU
|
---|
14 | * General Public License (GPL) as published by the Free Software
|
---|
15 | * Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
16 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
17 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
18 | */
|
---|
19 |
|
---|
20 | #include "Logging.h"
|
---|
21 |
|
---|
22 | #include <package-generated.h>
|
---|
23 |
|
---|
24 | #include <iprt/buildconfig.h>
|
---|
25 | #include <iprt/err.h>
|
---|
26 | #include <iprt/message.h>
|
---|
27 | #include <iprt/path.h>
|
---|
28 | #include <iprt/system.h>
|
---|
29 | #include <iprt/process.h>
|
---|
30 | #include <VBox/version.h>
|
---|
31 | #include <VBox/log.h>
|
---|
32 |
|
---|
33 |
|
---|
34 | static void vboxsvcHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
|
---|
35 | {
|
---|
36 | /* some introductory information */
|
---|
37 | static RTTIMESPEC s_TimeSpec;
|
---|
38 | char szTmp[256];
|
---|
39 | if (enmPhase == RTLOGPHASE_BEGIN)
|
---|
40 | RTTimeNow(&s_TimeSpec);
|
---|
41 | RTTimeSpecToString(&s_TimeSpec, szTmp, sizeof(szTmp));
|
---|
42 |
|
---|
43 | switch (enmPhase)
|
---|
44 | {
|
---|
45 | case RTLOGPHASE_BEGIN:
|
---|
46 | {
|
---|
47 | pfnLog(pLoggerRelease,
|
---|
48 | "VirtualBox (XP)COM Server %s r%u %s (%s %s) release log\n"
|
---|
49 | #ifdef VBOX_BLEEDING_EDGE
|
---|
50 | "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n"
|
---|
51 | #endif
|
---|
52 | "Log opened %s\n",
|
---|
53 | VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET,
|
---|
54 | __DATE__, __TIME__, szTmp);
|
---|
55 |
|
---|
56 | int vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp));
|
---|
57 | if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
|
---|
58 | pfnLog(pLoggerRelease, "OS Product: %s\n", szTmp);
|
---|
59 | vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp));
|
---|
60 | if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
|
---|
61 | pfnLog(pLoggerRelease, "OS Release: %s\n", szTmp);
|
---|
62 | vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp));
|
---|
63 | if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
|
---|
64 | pfnLog(pLoggerRelease, "OS Version: %s\n", szTmp);
|
---|
65 | if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
|
---|
66 | pfnLog(pLoggerRelease, "OS Service Pack: %s\n", szTmp);
|
---|
67 |
|
---|
68 | /* the package type is interesting for Linux distributions */
|
---|
69 | char szExecName[RTPATH_MAX];
|
---|
70 | char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName));
|
---|
71 | pfnLog(pLoggerRelease,
|
---|
72 | "Executable: %s\n"
|
---|
73 | "Process ID: %u\n"
|
---|
74 | "Package type: %s"
|
---|
75 | #ifdef VBOX_OSE
|
---|
76 | " (OSE)"
|
---|
77 | #endif
|
---|
78 | "\n",
|
---|
79 | pszExecName ? pszExecName : "unknown",
|
---|
80 | RTProcSelf(),
|
---|
81 | VBOX_PACKAGE_STRING);
|
---|
82 | break;
|
---|
83 | }
|
---|
84 |
|
---|
85 | case RTLOGPHASE_PREROTATE:
|
---|
86 | pfnLog(pLoggerRelease, "Log rotated - Log started %s\n", szTmp);
|
---|
87 | break;
|
---|
88 |
|
---|
89 | case RTLOGPHASE_POSTROTATE:
|
---|
90 | pfnLog(pLoggerRelease, "Log continuation - Log started %s\n", szTmp);
|
---|
91 | break;
|
---|
92 |
|
---|
93 | case RTLOGPHASE_END:
|
---|
94 | pfnLog(pLoggerRelease, "End of log file - Log started %s\n", szTmp);
|
---|
95 | break;
|
---|
96 |
|
---|
97 | default:
|
---|
98 | /* nothing */;
|
---|
99 | }
|
---|
100 | }
|
---|
101 |
|
---|
102 | int VBoxSVCLogRelCreate(const char *pszLogFile, uint32_t cHistory,
|
---|
103 | uint32_t uHistoryFileTime, uint64_t uHistoryFileSize)
|
---|
104 | {
|
---|
105 | /* create release logger */
|
---|
106 | PRTLOGGER pLoggerReleaseFile;
|
---|
107 | static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
|
---|
108 | RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG;
|
---|
109 | #if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
|
---|
110 | fFlags |= RTLOGFLAGS_USECRLF;
|
---|
111 | #endif
|
---|
112 | char szError[RTPATH_MAX + 128] = "";
|
---|
113 | int vrc = RTLogCreateEx(&pLoggerReleaseFile, fFlags, "all",
|
---|
114 | "VBOXSVC_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, 0 /* fDestFlags */,
|
---|
115 | vboxsvcHeaderFooter, cHistory, uHistoryFileSize, uHistoryFileTime,
|
---|
116 | szError, sizeof(szError), pszLogFile);
|
---|
117 | if (RT_SUCCESS(vrc))
|
---|
118 | {
|
---|
119 | /* register this logger as the release logger */
|
---|
120 | RTLogRelSetDefaultInstance(pLoggerReleaseFile);
|
---|
121 |
|
---|
122 | /* Explicitly flush the log in case of VBOXWEBSRV_RELEASE_LOG=buffered. */
|
---|
123 | RTLogFlush(pLoggerReleaseFile);
|
---|
124 | }
|
---|
125 | else
|
---|
126 | {
|
---|
127 | /* print a message, but do not fail */
|
---|
128 | RTMsgError("failed to open release log (%s, %Rrc)", szError, vrc);
|
---|
129 | }
|
---|
130 | return vrc;
|
---|
131 | }
|
---|
132 |
|
---|
133 | /* vi: set tabstop=4 shiftwidth=4 expandtab: */
|
---|