Hrm. Apparently there's a bug, not in this patch, that prevents external 
rotation
from working correctly: the "Reopen log file every second" logic in syslogd
doesn't reopen _all_ files, just the first one written in that second.

On 2014-05-20 01:08, Joshua Judson Rosen wrote:
Configurable at build time.

Invoke "syslogd -c logrotate" to call out to "logrotate"
when it's time to rotate log-files.

Signed-off-by: Joshua Judson Rosen <jro...@harvestai.com>
---
  sysklogd/Config.src |    9 +++++++++
  sysklogd/syslogd.c  |   32 +++++++++++++++++++++++++++++++-
  2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/sysklogd/Config.src b/sysklogd/Config.src
index fd8d408..7938f6f 100644
--- a/sysklogd/Config.src
+++ b/sysklogd/Config.src
@@ -41,6 +41,15 @@ config FEATURE_ROTATE_LOGFILE
          This enables syslogd to rotate the message files
          on his own. No need to use an external rotatescript.

+config FEATURE_LOGROTATE_CMD
+       bool "Support calling an external logrotate command"
+       default n
+       depends on FEATURE_ROTATE_LOGFILE
+       help
+         This adds a "-c" option to syslogd, to specify
+         an external command to call in order to rotate
+         logs when they pass the rotation-threshold.
+
  config FEATURE_LOGROTATE_TIMESTAMPS
        bool "Suffix rotated logfile names with timestamps"
        default n
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index d9cf289..689b036 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -25,6 +25,9 @@
  //usage:     "\n -l N            Log only messages more urgent than prio N 
(1-8)"
  //usage:     "\n -S              Smaller output"
  //usage:      IF_FEATURE_ROTATE_LOGFILE(
+//usage:       IF_FEATURE_LOGROTATE_CMD(
+//usage:     "\n  -c COMMAND      Call out to shell to run COMMAND to rotate 
logs"
+//usage:       )
  //usage:     "\n -s SIZE         Max size (KB) before rotation (default:200KB, 
0=off)"
  //usage:     "\n -b N            N rotated logs to keep (default:1, max=99, 
0=purge)"
  //usage:      )
@@ -82,6 +85,10 @@
  #include <unistd.h>
  #endif

+#if ENABLE_FEATURE_LOGROTATE_CMD
+#include <stdlib.h>
+#endif
+
  #define DEBUG 0

  /* MARK code is not very useful, is bloat, and broken:
@@ -142,6 +149,10 @@ IF_FEATURE_ROTATE_LOGFILE( \
        unsigned logFileSize;                   \
        /* number of rotated message files */   \
        unsigned logFileRotate;                 \
+IF_FEATURE_LOGROTATE_CMD( \
+       /* external logrotate command */        \
+       const char *logrotateCmd;               \
+) \
  ) \
  IF_FEATURE_IPC_SYSLOG( \
        int shmid; /* ipc shared memory id */   \
@@ -198,6 +209,9 @@ static const struct init_globals init_data = {
  #if ENABLE_FEATURE_ROTATE_LOGFILE
        .logFileSize = 200 * 1024,
        .logFileRotate = 1,
+#if ENABLE_FEATURE_LOGROTATE_CMD
+       .logrotateCmd = NULL,
+#endif
  #endif
  #if ENABLE_FEATURE_IPC_SYSLOG
        .shmid = -1,
@@ -221,6 +235,7 @@ enum {
        OPTBIT_outfile, // -O
        OPTBIT_loglevel, // -l
        OPTBIT_small, // -S
+       IF_FEATURE_LOGROTATE_CMD( OPTBIT_rotatecmd  ,)  // -c
        IF_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize   ,)  // -s
        IF_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt  ,)  // -b
        IF_FEATURE_REMOTE_LOG(    OPTBIT_remotelog  ,)  // -R
@@ -235,6 +250,7 @@ enum {
        OPT_outfile     = 1 << OPTBIT_outfile ,
        OPT_loglevel    = 1 << OPTBIT_loglevel,
        OPT_small       = 1 << OPTBIT_small   ,
+       OPT_rotatecmd   = IF_FEATURE_LOGROTATE_CMD( (1 << OPTBIT_rotatecmd  )) 
+ 0,
        OPT_filesize    = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize   )) 
+ 0,
        OPT_rotatecnt   = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt  )) 
+ 0,
        OPT_remotelog   = IF_FEATURE_REMOTE_LOG(    (1 << OPTBIT_remotelog  )) 
+ 0,
@@ -246,6 +262,7 @@ enum {

  };
  #define OPTION_STR "m:nO:l:S" \
+       IF_FEATURE_LOGROTATE_CMD( "c:" )  \
        IF_FEATURE_ROTATE_LOGFILE("s:" ) \
        IF_FEATURE_ROTATE_LOGFILE("b:" ) \
        IF_FEATURE_REMOTE_LOG(    "R:" ) \
@@ -255,11 +272,13 @@ enum {
        IF_FEATURE_SYSLOGD_CFG(   "f:" ) \
        IF_FEATURE_KMSG_SYSLOG(   "K"  )
  #define OPTION_DECL *opt_m, *opt_l \
+       IF_FEATURE_LOGROTATE_CMD( ,*opt_c = NULL) \
        IF_FEATURE_ROTATE_LOGFILE(,*opt_s) \
        IF_FEATURE_ROTATE_LOGFILE(,*opt_b) \
        IF_FEATURE_IPC_SYSLOG(    ,*opt_C = NULL) \
        IF_FEATURE_SYSLOGD_CFG(   ,*opt_f = NULL)
  #define OPTION_PARAM &opt_m, &(G.logFile.path), &opt_l \
+       IF_FEATURE_LOGROTATE_CMD( ,&(G.logrotateCmd)) \
        IF_FEATURE_ROTATE_LOGFILE(,&opt_s) \
        IF_FEATURE_ROTATE_LOGFILE(,&opt_b) \
        IF_FEATURE_REMOTE_LOG(    ,&remoteAddrList) \
@@ -639,7 +658,18 @@ static void log_locally(time_t now, char *msg, logFile_t 
*log_file)

  #if ENABLE_FEATURE_ROTATE_LOGFILE
        if (G.logFileSize && log_file->isRegular && log_file->size > 
G.logFileSize) {
-               if (G.logFileRotate) { /* always 0..99 */
+               IF_FEATURE_LOGROTATE_CMD(
+               if (G.logrotateCmd) {
+                       system(G.logrotateCmd);
+
+                       /* Note the unlink(), below, saves us from
+                        * getting into an infinite loop in the case that
+                        * this "rotate" command actually doesn't do its job
+                        * (and note that this precludes the command from
+                        * intentionally leaving/inserting content in
+                        * the new file).
+                        */
+               } else) if (G.logFileRotate) { /* always 0..99 */
                        int oldname_len = strlen(log_file->path);
  #if ENABLE_FEATURE_LOGROTATE_TIMESTAMPS
                        int i = oldname_len + 1 + 4 + 2 + 2 + 2 + 2 + 2    + 1;


--
"'tis an ill wind that blows no minds."
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to