You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by Satoshi Tatsuoka <sa...@softagency.co.jp> on 1999/12/06 12:52:51 UTC

other/5425: [PATCH] new function for rotatelogs

>Number:         5425
>Category:       other
>Synopsis:       [PATCH] new function for rotatelogs
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    apache
>State:          open
>Class:          change-request
>Submitter-Id:   apache
>Arrival-Date:   Mon Dec  6 05:10:00 PST 1999
>Last-Modified:
>Originator:     satoshi@softagency.co.jp
>Organization:
apache
>Release:        1.3.9
>Environment:
Linux sv1 2.2.13 #2 Sat Oct 30 11:40:47 JST 1999 i686 unknown
>Description:
I made new functions for rotatelogs program of apache as bellow:

TransferLog "|./rotatelogs /some/where monthly"
the name will be /some/where.YYYYMM

and

TransferLog "|./rotatelogs /some/where daily"
the name will be /some/where.YYYYMMDD

Local time is used for generating new files.
>How-To-Repeat:

>Fix:
--- rotatelogs.c.org    Fri Dec  3 16:23:08 1999
+++ rotatelogs.c        Mon Dec  6 20:48:30 1999
@@ -4,6 +4,7 @@
  * Contributed by Ben Laurie <be...@algroup.co.uk>
  *
  * 12 Mar 1996
+ * 03 Dec 1999 modified by Satoshi Tatsuoka <sa...@softagency.co.jp>
  */


@@ -22,11 +23,12 @@
     time_t tRotation;
     int nLogFD = -1;
     int nRead;
+    int ch = 0;
     char *szLogRoot;

     if (argc != 3) {
        fprintf(stderr,
-               "%s <logfile> <rotation time in seconds>\n\n",
+               "%s <logfile> <rotation time in seconds>|monthly|daily\n\n",
                argv[0]);
 #ifdef OS2
        fprintf(stderr,
@@ -34,23 +36,36 @@
                argv[0]);
 #else
        fprintf(stderr,
-               "Add this:\n\nTransferLog \"|%s /some/where 86400\"\n\n",
-               argv[0]);
+               "Add this:\n\nTransferLog \"|%s /some/where 86400\"\n\nor\n\n"
+               "TransferLog \"|%s /some/where monthly\"\n\nor\n\n"
+               "TransferLog \"|%s /some/where daily\"\n\n",
+               argv[0],argv[0],argv[0]);
 #endif
        fprintf(stderr,
                "to httpd.conf. The generated name will be /some/where.nnnn "
                "where nnnn is the\nsystem time at which the log nominally "
                "starts (N.B. this time will always be a\nmultiple of the "
                "rotation time, so you can synchronize cron scripts with it).\n"
+               "the name will be /home/where.YYYYMM by 'monthly' and"
+               " /home/where.YYYYMMDD by\n 'daily'. "
                "At the end of each rotation time a new log is started.\n");
        exit(1);
     }

     szLogRoot = argv[1];
-    tRotation = atoi(argv[2]);
-    if (tRotation <= 0) {
-       fprintf(stderr, "Rotation time must be > 0\n");
-       exit(6);
+    if (strcmp("monthly",argv[2]) == 0) {
+       ch = 2;
+    }
+    else if (strcmp("daily",argv[2]) == 0) {
+       ch = 1;
+    }
+    else {
+       ch = 0;
+       tRotation = atoi(argv[2]);
+       if (tRotation <= 0) {
+           fprintf(stderr, "Rotation time must be > 0\n");
+           exit(6);
+       }
     }

     for (;;) {
@@ -65,9 +80,40 @@
            nLogFD = -1;
        }
        if (nLogFD < 0) {
-           time_t tLogStart = (time(NULL) / tRotation) * tRotation;
-           sprintf(buf2, "%s.%010d", szLogRoot, (int) tLogStart);
-           tLogEnd = tLogStart + tRotation;
+           switch (ch) {
+               time_t tLogStart;
+               struct tm *tmLocalTime;
+               char suffix[10];
+           case 0:
+               /* normal */
+               tLogStart = (time(NULL) / tRotation) * tRotation;
+               sprintf(buf2, "%s.%010d", szLogRoot, (int) tLogStart);
+               tLogEnd = tLogStart + tRotation;
+               break;
+           case 1:
+               /* localtime daily */
+               tLogStart = time(NULL);
+               tmLocalTime = localtime(&tLogStart);
+               strftime(suffix, 10, "%Y%m%d", tmLocalTime);
+               sprintf(buf2, "%s.%s", szLogRoot, suffix);
+               tmLocalTime->tm_mday++;
+               tmLocalTime->tm_min = 0;
+               tmLocalTime->tm_sec = 0;
+               tLogEnd = mktime(tmLocalTime);
+               break;
+           case 2:
+               /* localtime monthly */
+               tLogStart = time(NULL);
+               tmLocalTime = localtime(&tLogStart);
+               strftime(suffix, 10, "%Y%m", tmLocalTime);
+               sprintf(buf2, "%s.%s", szLogRoot, suffix);
+               tmLocalTime->tm_mon++;
+               tmLocalTime->tm_mday = 1;
+               tmLocalTime->tm_min = 0;
+               tmLocalTime->tm_sec = 0;
+               tLogEnd = mktime(tmLocalTime);
+               break;
+           }
            nLogFD = open(buf2, O_WRONLY | O_CREAT | O_APPEND, 0666);
            if (nLogFD < 0) {
                perror(buf2);
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, you need]
[to include <ap...@Apache.Org> in the Cc line and make sure the]
[subject line starts with the report component and number, with ]
[or without any 'Re:' prefixes (such as "general/1098:" or      ]
["Re: general/1098:").  If the subject doesn't match this       ]
[pattern, your message will be misfiled and ignored.  The       ]
["apbugs" address is not added to the Cc line of messages from  ]
[the database automatically because of the potential for mail   ]
[loops.  If you do not include this Cc, your reply may be ig-   ]
[nored unless you are responding to an explicit request from a  ]
[developer.  Reply only with text; DO NOT SEND ATTACHMENTS!     ]