You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/11/03 17:08:57 UTC

svn commit: r1197197 - in /commons/proper/daemon/trunk/src/native/windows: apps/prunsrv/prunsrv.c include/log.h src/log.c

Author: mturk
Date: Thu Nov  3 16:08:56 2011
New Revision: 1197197

URL: http://svn.apache.org/viewvc?rev=1197197&view=rev
Log:
Step 1 in log rotation support. We still need to check if JVM will allow changing stdout/stderr descriptors

Modified:
    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
    commons/proper/daemon/trunk/src/native/windows/include/log.h
    commons/proper/daemon/trunk/src/native/windows/src/log.c

Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1197197&r1=1197196&r2=1197197&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Thu Nov  3 16:08:56 2011
@@ -131,6 +131,7 @@ static APXCMDLINEOPT _options[] = {
 /* 36 */    { L"StdOutput",         L"StdOutput",       L"Log",         APXCMDOPT_STE | APXCMDOPT_REG, NULL, 0},
 /* 37 */    { L"LogJniMessages",    L"LogJniMessages",  L"Log",         APXCMDOPT_INT | APXCMDOPT_REG, NULL, 1},
 /* 38 */    { L"PidFile",           L"PidFile",         L"Log",         APXCMDOPT_STR | APXCMDOPT_REG, NULL, 0},
+/* 39 */    { L"Rotate",            L"Rotate",          L"Log",         APXCMDOPT_INT | APXCMDOPT_REG, NULL, 0},
             /* NULL terminate the array */
             { NULL }
 };
@@ -193,6 +194,7 @@ static APXCMDLINEOPT _options[] = {
 #define SO_STDOUTPUT        GET_OPT_V(36)
 #define SO_JNIVFPRINTF      GET_OPT_I(37)
 #define SO_PIDFILE          GET_OPT_V(38)
+#define SO_LOGROTATE        GET_OPT_I(39)
 
 /* Main service table entry
  * filled at run-time
@@ -239,18 +241,28 @@ static BOOL   gSignalValid   = TRUE;
 static APXJAVA_THREADARGS gRargs;
 static APXJAVA_THREADARGS gSargs;
 
-
 DWORD WINAPI eventThread(LPVOID lpParam)
 {
+    DWORD dwRotateCnt = SO_LOGROTATE;
+
     for (;;) {
-        DWORD dw = WaitForSingleObject(gSignalEvent, INFINITE);
+        DWORD dw = WaitForSingleObject(gSignalEvent, 1000);
+        if (dw == WAIT_TIMEOUT) {
+            /* Do process maintenance */
+            if (SO_LOGROTATE != 0 && --dwRotateCnt == 0) {
+                /* Perform log rotation. */
+
+                 dwRotateCnt = SO_LOGROTATE;
+            }
+            continue;
+        }
         if (dw == WAIT_OBJECT_0 && gSignalValid) {
             if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0))
                 apxLogWrite(APXLOG_MARK_SYSERR);
             ResetEvent(gSignalEvent);
+            continue;
         }
-        else
-            break;
+        break;
     }
     ExitThread(0);
     return 0;
@@ -266,8 +278,16 @@ static BOOL redirectStdStreams(APX_STDWR
     BOOL aErr = FALSE;
     BOOL aOut = FALSE;
 
-    if (lpWrapper->szStdOutFilename || lpWrapper->szStdErrFilename)
-        AllocConsole();
+    if (lpWrapper->szStdOutFilename || lpWrapper->szStdErrFilename) {
+        /* Alloc console if it doesn't exists. */
+        if (!AttachConsole(ATTACH_PARENT_PROCESS) &&
+             GetLastError() == ERROR_INVALID_HANDLE) {
+            HWND hc;
+            AllocConsole();
+            if ((hc = GetConsoleWindow()) != NULL)
+                ShowWindow(hc, SW_HIDE);
+        }
+    }
     /* redirect to file or console */
     if (lpWrapper->szStdOutFilename) {
         if (lstrcmpiW(lpWrapper->szStdOutFilename, PRSRV_AUTO) == 0) {
@@ -279,7 +299,8 @@ static BOOL redirectStdStreams(APX_STDWR
             lpWrapper->szStdOutFilename = apxLogFile(gPool,
                                                      lpWrapper->szLogPath,
                                                      lsn,
-                                                     NULL, TRUE);
+                                                     NULL, TRUE,
+                                                     SO_LOGROTATE);
         }
         /* Delete the file if not in append mode
          * XXX: See if we can use the params instead of that.
@@ -305,7 +326,8 @@ static BOOL redirectStdStreams(APX_STDWR
             lpWrapper->szStdErrFilename = apxLogFile(gPool,
                                                      lpWrapper->szLogPath,
                                                      lsn,
-                                                     NULL, TRUE);
+                                                     NULL, TRUE,
+                                                     SO_LOGROTATE);
         }
         if (!aErr)
             DeleteFileW(lpWrapper->szStdErrFilename);
@@ -1016,7 +1038,7 @@ static DWORD serviceStart()
         return TRUE;    /* Nothing to do */
     }
     if (IS_VALID_STRING(SO_PIDFILE)) {
-        gPidfileName = apxLogFile(gPool, SO_LOGPATH, SO_PIDFILE, NULL, FALSE);
+        gPidfileName = apxLogFile(gPool, SO_LOGPATH, SO_PIDFILE, NULL, FALSE, 0);
         if (GetFileAttributesW(gPidfileName) !=  INVALID_FILE_ATTRIBUTES) {
             /* Pid file exists */
             if (!DeleteFileW(gPidfileName)) {
@@ -1384,7 +1406,13 @@ void WINAPI serviceMain(DWORD argc, LPTS
             goto cleanup;
         }
         /* Allocate console so that events gets processed */
-        AllocConsole();
+        if (!AttachConsole(ATTACH_PARENT_PROCESS) &&
+             GetLastError() == ERROR_INVALID_HANDLE) {
+            HWND hc;
+            AllocConsole();
+            if ((hc = GetConsoleWindow()) != NULL)
+                ShowWindow(hc, SW_HIDE);
+        }
     }
     reportServiceStatus(SERVICE_START_PENDING, NO_ERROR, 3000);
     if ((rc = serviceStart()) == 0) {
@@ -1514,9 +1542,12 @@ void __cdecl main(int argc, char **argv)
         }
     }
 
-    apxLogOpen(gPool, SO_LOGPATH, SO_LOGPREFIX);
+    apxLogOpen(gPool, SO_LOGPATH, SO_LOGPREFIX, SO_LOGROTATE);
     apxLogLevelSetW(NULL, SO_LOGLEVEL);
     apxLogWrite(APXLOG_MARK_DEBUG "Commons Daemon procrun log initialized");
+    if (SO_LOGROTATE)
+        apxLogWrite(APXLOG_MARK_DEBUG "Log will rotate each %d seconds.", SO_LOGROTATE);
+
     apxLogWrite(APXLOG_MARK_INFO "Commons Daemon procrun (%s %d-bit) started",
                 PRG_VERSION, PRG_BITS);
 

Modified: commons/proper/daemon/trunk/src/native/windows/include/log.h
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/include/log.h?rev=1197197&r1=1197196&r2=1197197&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/include/log.h (original)
+++ commons/proper/daemon/trunk/src/native/windows/include/log.h Thu Nov  3 16:08:56 2011
@@ -43,8 +43,8 @@ __APXBEGIN_DECLS
 #define APXLOG_LEVEL_WARN   2
 #define APXLOG_LEVEL_ERROR  3
 
-#define APXLOG_MARK_INFO    NULL, APXLOG_LEVEL_INFO,  TRUE,  NULL, 0, ""
-#define APXLOG_MARK_WARN    NULL, APXLOG_LEVEL_WARN,  TRUE,  NULL, 0, ""
+#define APXLOG_MARK_INFO    NULL, APXLOG_LEVEL_INFO,  TRUE,  __FILE__, __LINE__, ""
+#define APXLOG_MARK_WARN    NULL, APXLOG_LEVEL_WARN,  TRUE,  __FILE__, __LINE__, ""
 #define APXLOG_MARK_ERROR   NULL, APXLOG_LEVEL_ERROR, TRUE,  __FILE__, __LINE__, ""
 #define APXLOG_MARK_DEBUG   NULL, APXLOG_LEVEL_DEBUG, TRUE,  __FILE__, __LINE__, ""
 #define APXLOG_MARK_RAW     NULL, APXLOG_LEVEL_INFO,  FALSE, NULL, 0,
@@ -55,13 +55,15 @@ LPWSTR apxLogFile(
     LPCWSTR szPath,
     LPCWSTR szPrefix,
     LPCWSTR szName,
-    BOOL bTimeStamp
+    BOOL bTimeStamp,
+    DWORD dwRotate
 );
 
 HANDLE apxLogOpen(
     APXHANDLE hPool,
     LPCWSTR szPath,
-    LPCWSTR szPrefix
+    LPCWSTR szPrefix,
+    DWORD dwRotate
 );
 
 void apxLogClose(

Modified: commons/proper/daemon/trunk/src/native/windows/src/log.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/log.c?rev=1197197&r1=1197196&r2=1197197&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/log.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/log.c Thu Nov  3 16:08:56 2011
@@ -20,6 +20,7 @@
 
 #define LINE_SEP    "\r\n"
 #define LOGF_EXT    L".%04d-%02d-%02d.log"
+#define LOGF_EXR    L".%04d-%02d-%02d.%02d%02d%02d.log"
 
 static LPCSTR _log_level[] = {
     "[debug] ",
@@ -32,9 +33,11 @@ static LPCSTR _log_level[] = {
 typedef struct apx_logfile_st {
     HANDLE      hFile;
     DWORD       dwLogLevel;
+    DWORD       dwRotate;
     SYSTEMTIME  sysTime;
     WCHAR       szPath[SIZ_PATHLEN];
     WCHAR       szPrefix[MAX_PATH];
+    WCHAR       szFile[MAX_PATH];
 } apx_logfile_st;
 
 /* Per-application master log file */
@@ -42,13 +45,60 @@ static apx_logfile_st *_st_sys_loghandle
 
 static apx_logfile_st  _st_sys_errhandle = { NULL, APXLOG_LEVEL_WARN, FALSE};
 
+static void logRotate(apx_logfile_st *lf, LPSYSTEMTIME t)
+{
+    WCHAR sName[SIZ_PATHLEN];
+    ULARGE_INTEGER cft;
+    ULARGE_INTEGER lft;
+    HANDLE h;
+
+    if (lf->dwRotate == 0)
+        return;
+
+    SystemTimeToFileTime(&lf->sysTime, (LPFILETIME)&lft);
+    SystemTimeToFileTime(t, (LPFILETIME)&cft);
+    if (cft.QuadPart < (lft.QuadPart + lf->dwRotate * 10000000ULL))
+        return;
+    /* Rotate time */
+    lf->sysTime = *t;
+    if (lf->dwRotate < 86400)
+        wsprintfW(sName, L"\\%s"  LOGF_EXR,
+                  lf->szPrefix,
+                  lf->sysTime.wYear,
+                  lf->sysTime.wMonth,
+                  lf->sysTime.wDay,
+                  lf->sysTime.wHour,
+                  lf->sysTime.wMinute,
+                  lf->sysTime.wSecond);
+    else
+        wsprintfW(sName, L"\\%s"  LOGF_EXT,
+                  lf->szPrefix,
+                  lf->sysTime.wYear,
+                  lf->sysTime.wMonth,
+                  lf->sysTime.wDay);
+    lstrlcpyW(lf->szFile, MAX_PATH, lf->szPath);
+    lstrlcatW(lf->szFile, MAX_PATH, sName);
+    h =  CreateFileW(lf->szFile,
+                     GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                     NULL,
+                     OPEN_ALWAYS,
+                     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN,
+                     NULL);
+    if (h == INVALID_HANDLE_VALUE) {
+        /* TODO: Log something */
+        return;
+    }
+    CloseHandle(lf->hFile);
+    lf->hFile = h;
+}
 
 LPWSTR apxLogFile(
     APXHANDLE hPool,
     LPCWSTR szPath,
     LPCWSTR szPrefix,
     LPCWSTR szName,
-    BOOL bTimeStamp)
+    BOOL bTimeStamp,
+    DWORD dwRotate)
 {
     LPWSTR sRet;
     WCHAR sPath[SIZ_PATHLEN];
@@ -68,20 +118,33 @@ LPWSTR apxLogFile(
         szPrefix = L"";
     if (!szName)
         szName   = L"";
-    if (bTimeStamp)
-        wsprintfW(sName,
-                  L"\\%s%s" LOGF_EXT,
+    if (bTimeStamp) {
+        if (dwRotate != 0 && dwRotate < 86400)
+            wsprintfW(sName,
+                  L"\\%s%s" LOGF_EXR,
                   szPrefix,
                   szName,
                   sysTime.wYear,
                   sysTime.wMonth,
-                  sysTime.wDay);
-    else
+                  sysTime.wDay,
+                  0,
+                  0,
+                  0);
+        else
+            wsprintfW(sName,
+                      L"\\%s%s" LOGF_EXT,
+                      szPrefix,
+                      szName,
+                      sysTime.wYear,
+                      sysTime.wMonth,
+                      sysTime.wDay);
+    }
+    else {
         wsprintfW(sName,
                   L"\\%s%s",
                   szPrefix,
                   szName);
-
+    }
     sRet = apxPoolAlloc(hPool, (SIZ_PATHLEN) * sizeof(WCHAR));
     /* Set default level to info */
     CreateDirectoryW(sPath, NULL);
@@ -99,7 +162,8 @@ LPWSTR apxLogFile(
 HANDLE apxLogOpen(
     APXHANDLE hPool,
     LPCWSTR szPath,
-    LPCWSTR szPrefix)
+    LPCWSTR szPrefix,
+    DWORD dwRotate)
 {
 
     WCHAR sPath[SIZ_PATHLEN];
@@ -127,11 +191,21 @@ HANDLE apxLogOpen(
     }
     if (!szPrefix)
         szPrefix = L"commons-daemon";
-    wsprintfW(sName, L"\\%s"  LOGF_EXT,
-              szPrefix,
-              sysTime.wYear,
-              sysTime.wMonth,
-              sysTime.wDay);
+    if (dwRotate != 0 && dwRotate < 86400)
+        wsprintfW(sName, L"\\%s"  LOGF_EXR,
+                  szPrefix,
+                  sysTime.wYear,
+                  sysTime.wMonth,
+                  sysTime.wDay,
+                  0,
+                  0,
+                  0);
+    else
+        wsprintfW(sName, L"\\%s"  LOGF_EXT,
+                  szPrefix,
+                  sysTime.wYear,
+                  sysTime.wMonth,
+                  sysTime.wDay);
     if (!(h = (apx_logfile_st *)apxPoolCalloc(hPool, sizeof(apx_logfile_st))))
         return INVALID_HANDLE_VALUE;
     /* Set default level to info */
@@ -140,10 +214,11 @@ HANDLE apxLogOpen(
 
     h->sysTime = sysTime;
     lstrlcpyW(h->szPath, MAX_PATH, sPath);
-    lstrlcatW(sPath, MAX_PATH, sName);
+    lstrlcpyW(h->szFile, MAX_PATH, sPath);
+    lstrlcatW(h->szFile, MAX_PATH, sName);
     lstrlcpyW(h->szPrefix, MAX_PATH, szPrefix);
 
-    h->hFile =  CreateFileW(sPath,
+    h->hFile =  CreateFileW(h->szFile,
                       GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
                       NULL,
                       OPEN_ALWAYS,
@@ -153,9 +228,12 @@ HANDLE apxLogOpen(
         /* Make sure we write somewhere */
         h = &_st_sys_errhandle;
         apxDisplayError(FALSE, NULL, 0,
-                        "Unable to create logger at '%S'\n", sPath);
+                        "Unable to create logger at '%S'\n", h->szFile);
         return (HANDLE)h;
     }
+    else {
+        h->dwRotate = dwRotate;
+    }
     /* Set this file as system log file */
     if (!_st_sys_loghandle)
         _st_sys_loghandle = h;
@@ -226,7 +304,7 @@ apxLogWrite(
     }
     if (dwLevel < lf->dwLogLevel)
         return 0;
-    if (f) {
+    if (f && (lf->dwLogLevel == APXLOG_LEVEL_DEBUG || dwLevel == APXLOG_LEVEL_ERROR)) {
         f = (szFile + lstrlenA(szFile) - 1);
         while(f != szFile && '\\' != *f && '/' != *f)
             f--;
@@ -234,7 +312,7 @@ apxLogWrite(
             f++;
     }
     else
-        f = "";
+        f = NULL;
     szBp = buffer;
     if (!szFormat) {
         if (err == 0) {
@@ -271,6 +349,7 @@ apxLogWrite(
             GetLocalTime(&t);
             if (dolock) {
                 APX_LOGLOCK(lf->hFile);
+                logRotate(lf, &t);
             }
             if (bTimeStamp) {
                 wsprintfA(sb, "[%d-%02d-%02d %02d:%02d:%02d] ",