Fighting for the power. [syslogd]

Chuck Swiger cswiger at mac.com
Mon May 11 21:37:27 UTC 2009


On May 11, 2009, at 1:13 PM, Sam Leffler wrote:
>> You can use -l flag to syslogd to create additional logging sockets  
>> under your chroot'ed filesystem tree, similar to the way named &  
>> ntpd uses it; see syslogd_precmd() in /etc/rc.d/syslogd....
>>
>
> Blech, thanks.  That might be a stopgap solution but it still  
> doesn't allow syslogd to be started earlier which is what is needed  
> for many/most setups.

Something that's imperfect but available today is much more usable  
than the perfect solution tomorrow.  :-)

> syslogd has mountcritremote as REQUIRE to handle diskless setups but  
> IMO this should be (at least) configurable.  But rather than argue  
> this nonsense I think the better solution is to do what I suggest so  
> syslogd can be started very early and capture everything available  
> (e.g. your suggestion still loses msgs logged while setting up nfs  
> mounts).

True.  I'm not sure I'd really want to set up a machine such that  
critical filesystems depend upon wireless networking to be up before  
they can be mounted, but if you've really got something which needs to  
run before syslogd is allowed to run, then that something needs to be  
able to do it's own logging.  Fortunately, it's not terribly hard to  
write some wrappers which will log either via syslog or to a file (or  
both, if needed):

/* initialize logging to a file, via syslog, or both... */
void
init_logging()
{
     setlogfacility(syslog_level);

     if (enable_syslog)
         logmask |= LF_SYSLOG;
     else
         logmask &= ~LF_SYSLOG;

     if (logfile)
         logmask |= LF_LOGFILE;
     else
         logmask &= ~LF_LOGFILE;

     if (logmask & LF_SYSLOG) {
	openlog("myprogram", LOG_PID|LOG_CONS, fac);
         }

         if (debug) {
             syslog((fac | LOG_NOTICE), "logging subsystem started...");
             setlogmask(LOG_UPTO(LOG_DEBUG));
         } else {
             if (verbose > 1)
                 setlogmask(LOG_UPTO(LOG_DEBUG));
             else
                 setlogmask(LOG_UPTO(LOG_INFO));
         }
     }

     if ((logmask & LF_LOGFILE) && logfile) {
         if ((ofp = fopen(logfile, "a+")) == NULL) {
             fprintf(stderr, "Fatal Error: unable to open and append  
to logfile '%s'.\n", logfile);
             terminate(EX_CANTCREAT);
         }
     } else if (debug) {
         ofp = stdout;
     }
}

/* output a message to syslog and/or the logfile/stdout */
void
logdebug(char *message) {
     if (message == NULL)
         message = strerror(errno);
     if (logmask & LF_SYSLOG)
         syslog((fac | LOG_DEBUG), "%s", message);
     if (ofp) {
         fputs(message, ofp);
         fflush(ofp);
     }
}

[ ...repeat for loginfo(), logwarn(), etc... ]

The above is triggered off of getopt() parsing flags and setting  
enable_syslog and/or logfile variables, but you could check whether a  
syslogd socket is available to scribble to or not, and decide for  
yourself to do your own logging to a file or not.

Come to think of it, are you familiar with sending LOG_CONS to  
openlog()?  Perhaps that would be a reasonable compromise, as you  
wouldn't need to move over to logging via a wrapper rather than  
calling syslog() directly....

Regards,
-- 
-Chuck



More information about the freebsd-current mailing list