Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 1.0.1, 1.0.2, 1.0.3
    • Fix Version/s: 1.0.4
    • Component/s: Jsvc
    • Labels:
      None
    • Environment:

      Operating System: Linux
      Platform: PC

    • Bugzilla Id:
      37430

      Description

      Currently, the only way to rotate the logs produced via jsvc
      is to restart the tomcat server. I've coded up support for
      using syslog through the local0.* channels. It probably needs
      a little work, but hopefully it can be incorporated into a
      future release.

      — jsvc-unix.c 2005-05-17 06:13:39.000000000 -0700
      +++ /tmp/jsvc-unix.c 2005-11-08 14:18:18.000000000 -0800
      @@ -25,6 +25,8 @@
      #include <stdio.h>
      #include <pwd.h>
      #include <grp.h>
      +#include <syslog.h>
      +#include <errno.h>
      #ifdef OS_LINUX
      #include <sys/prctl.h>
      #include <sys/syscall.h>
      @@ -35,6 +37,7 @@
      extern char **environ;

      pid_t controlled=0; /* the son process pid */
      +pid_t logger=0; /* the logger process pid */
      static bool stopping=false;
      static bool doreload=false;
      static void (*handler_int)(int)=NULL;
      @@ -562,10 +565,53 @@
      return(freopen(outfile,mode,stream));
      }

      +static int logger_child (int outpipe, int errpipe, char *procname) {
      + /* Read from file descriptors. Log to syslog. */
      + fd_set rfds;
      + struct timeval tv;
      + int retval, n;
      + int bufsz = 1024;
      + char buf[bufsz];
      +
      + if (outpipe > errpipe)

      { + n = outpipe + 1; + }

      else

      { + n = errpipe + 1; + }

      +
      + openlog(procname, LOG_PID, LOG_LOCAL0);
      +
      + while (1) {
      + /* Watch two pipes for input */
      + FD_ZERO(&rfds);
      + FD_SET(outpipe, &rfds);
      + FD_SET(errpipe, &rfds);
      + /* Wait for a minute */
      + tv.tv_sec = 60;
      + tv.tv_usec = 0;
      +
      + retval = select (n, &rfds, NULL, NULL, &tv);
      + if (retval == -1)
      + perror("select()");
      + else if (retval) {
      + if (FD_ISSET(outpipe, &rfds))

      { + read(outpipe, buf, bufsz); + syslog(LOG_INFO, "%s", buf); + }

      + if (FD_ISSET(errpipe, &rfds))

      { + read(errpipe, buf, bufsz); + syslog(LOG_ERR, "%s", buf); + }

      + }
      + }
      +}
      +
      /**

      • Redirect stdin, stdout, stderr.
        */
        -static void set_output(char *outfile, char *errfile) {
        +static void set_output(char *outfile, char *errfile, char *procname) {
        + int stdoutdes[2] = {0,0}, stderrdes[2] = {0,0}

        ,
        + forkoutlogger=0, forkerrlogger=0;
        freopen("/dev/null", "r", stdin);
        log_debug("redirecting stdout to %s and stderr to %s",outfile,errfile);

      @@ -577,11 +623,28 @@
      if(strcmp(outfile, "&2") == 0 && strcmp(errfile,"&1") == 0)

      { outfile="/dev/null"; }
      • if(strcmp(outfile, "&2") != 0) {
        +
        + if (strcmp(outfile, "SYSLOG") == 0)
        Unknown macro: {+ /* Send stdout to syslog through a logger process */+ if (pipe(stdoutdes)) { + fprintf(stderr, "Unable to create stdout pipe for syslog: %s\n", + strerror(errno)); + } else { + forkoutlogger=1; + }+ }

        else if(strcmp(outfile, "&2") != 0)

        { loc_freopen(outfile, "a", stdout); }
      • if(strcmp(errfile,"&1") != 0) {
        + if (strcmp(errfile, "SYSLOG") == 0)
        Unknown macro: {+ /* Send stderr to syslog through a logger process */+ if (pipe(stderrdes)) { + fprintf(stderr, "Unable to create stderr pipe for syslog: %s\n", + strerror(errno)); + } else { + forkerrlogger=1; + }+ }

        else if(strcmp(errfile,"&1") != 0)

        { loc_freopen(errfile, "a", stderr); }

        else

        { close(2); @@ -591,6 +654,33 @@ close(1); dup(2); }

        +
        + if (forkoutlogger || forkerrlogger) {
        + int pid;
        + if ((pid=fork())!=-1) {
        + if (pid) {
        + if (stdoutdes[0] != 0)

        Unknown macro: {+ close(stdoutdes[0]);+ if (dup2(stdoutdes[1],1) == -1) { + fprintf(stderr,"Unable to redirect stdout to pipe for syslog: %s\n", + strerror(errno)); + }+ }

        + if (stderrdes[0] != 0)

        Unknown macro: {+ close(stderrdes[0]);+ if (dup2(stderrdes[1],2) == -1) { + fprintf(stderr,"Unable to redirect stderr to pipe for syslog: %s\n", + strerror(errno)); + }+ }

        + } else

        { + exit (logger_child(stdoutdes[1],stderrdes[1],procname)); + }

        + } else

        { + fprintf(stderr, "Unable to create logger child process: %s\n", + strerror(errno)); + }

        + }
        }

      int main(int argc, char *argv[])

      { @@ -678,7 +768,7 @@ #endif }
      • set_output(args->outfile, args->errfile);
        + set_output(args->outfile, args->errfile, args->procname);

      /* We have to fork: this process will become the controller and the other
      will be the child */
      @@ -734,10 +824,16 @@
      void main_reload(void) {
      log_debug("Killing self with HUP signal");
      kill(controlled,SIGHUP);
      + if (logger != 0)

      { + kill(logger,SIGHUP); + }

      }

      void main_shutdown(void) {
      log_debug("Killing self with TERM signal");
      kill(controlled,SIGTERM);
      + if (logger != 0)

      { + kill(logger,SIGTERM); + }

      }

        Attachments

        1. syslog.diff
          10 kB
          Damien Raude-Morvan

          Issue Links

            Activity

              People

              • Assignee:
                mturk@apache.org Mladen Turk
                Reporter:
                mike@pictage.com Mike Polek
              • Votes:
                1 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: