aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hendricks <michael@ndrix.org>2012-03-02 12:31:16 -0700
committerMichael Hendricks <michael@ndrix.org>2012-05-18 16:20:03 -0600
commit9af080c351c40a4f56d37174253d33a9f4ffdb69 (patch)
treeb3b9f85c0f7cbca2ca880ba36a5e4bbca8e006d0
parentfea25712ca54c4715f874cf3d871e84bbfd83352 (diff)
Reopen debug.log on SIGHUP
The best log rotation method formerly available was to configure logrotate with the copytruncate option. As described in the logrotate documentation, "there is a very small time slice between copying the file and truncating it, so some logging data might be lost". By sending SIGHUP to the server process, one can now reopen the debug log file without losing any data.
-rw-r--r--src/init.cpp12
-rw-r--r--src/util.cpp9
-rw-r--r--src/util.h1
3 files changed, 21 insertions, 1 deletions
diff --git a/src/init.cpp b/src/init.cpp
index b027a53d81..726950bdb6 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -80,6 +80,10 @@ void HandleSIGTERM(int)
fRequestShutdown = true;
}
+void HandleSIGHUP(int)
+{
+ fReopenDebugLog = true;
+}
@@ -285,7 +289,13 @@ bool AppInit2()
sa.sa_flags = 0;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
- sigaction(SIGHUP, &sa, NULL);
+
+ // Reopen debug.log on SIGHUP
+ struct sigaction sa_hup;
+ sa_hup.sa_handler = HandleSIGHUP;
+ sigemptyset(&sa_hup.sa_mask);
+ sa_hup.sa_flags = 0;
+ sigaction(SIGHUP, &sa_hup, NULL);
#endif
fTestNet = GetBoolArg("-testnet");
diff --git a/src/util.cpp b/src/util.cpp
index d143306aec..e3a49dcbcf 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -70,6 +70,7 @@ bool fTestNet = false;
bool fNoListen = false;
bool fLogTimestamps = false;
CMedianFilter<int64> vTimeOffsets(200,0);
+bool fReopenDebugLog = false;
// Init openssl library multithreading support
static CCriticalSection** ppmutexOpenSSL;
@@ -213,6 +214,14 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
static boost::mutex mutexDebugLog;
boost::mutex::scoped_lock scoped_lock(mutexDebugLog);
+ // reopen the log file, if requested
+ if (fReopenDebugLog) {
+ fReopenDebugLog = false;
+ boost::filesystem::path pathDebug = GetDataDir() / "debug.log";
+ if (freopen(pathDebug.string().c_str(),"a",fileout) != NULL)
+ setbuf(fileout, NULL); // unbuffered
+ }
+
// Debug print useful for profiling
if (fLogTimestamps && fStartedNewLine)
fprintf(fileout, "%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str());
diff --git a/src/util.h b/src/util.h
index f7bdaf5332..edef354443 100644
--- a/src/util.h
+++ b/src/util.h
@@ -121,6 +121,7 @@ extern std::string strMiscWarning;
extern bool fTestNet;
extern bool fNoListen;
extern bool fLogTimestamps;
+extern bool fReopenDebugLog;
void RandAddSeed();
void RandAddSeedPerfmon();