--- isys/log.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++-------------- isys/log.h | 13 +++++++-- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/isys/log.c b/isys/log.c index 2f921ba..da39c7b 100644 --- a/isys/log.c +++ b/isys/log.c @@ -36,8 +36,11 @@ static FILE * main_log_tty = NULL; static FILE * main_log_file = NULL; +static FILE * program_log_file = NULL; static int minLevel = INFO; -static const char * syslog_facility = "loader"; +static const char * main_tag = "loader"; +static const char * program_tag = "program"; +static const int syslog_facility = LOG_LOCAL0; /* maps our loglevel to syslog loglevel */ static int mapLogLevel(int level) @@ -59,7 +62,7 @@ static int mapLogLevel(int level) } } -static void printLogHeader(int level, FILE *outfile) { +static void printLogHeader(int level, const char *tag, FILE *outfile) { struct timeval current_time; struct tm *t; int msecs; @@ -70,44 +73,63 @@ static void printLogHeader(int level, FILE *outfile) { switch (level) { case DEBUGLVL: fprintf (outfile, "%02d:%02d:%02d,%03d DEBUG %s: ", t->tm_hour, - t->tm_min, t->tm_sec, msecs, syslog_facility); + t->tm_min, t->tm_sec, msecs, tag); break; case INFO: fprintf (outfile, "%02d:%02d:%02d,%03d INFO %s: ", t->tm_hour, - t->tm_min, t->tm_sec, msecs, syslog_facility); + t->tm_min, t->tm_sec, msecs, tag); break; case WARNING: fprintf (outfile, "%02d:%02d:%02d,%03d WARNING %s: ", t->tm_hour, - t->tm_min, t->tm_sec, msecs, syslog_facility); + t->tm_min, t->tm_sec, msecs, tag); break; case ERROR: fprintf (outfile, "%02d:%02d:%02d,%03d ERROR %s: ", t->tm_hour, - t->tm_min, t->tm_sec, msecs, syslog_facility); + t->tm_min, t->tm_sec, msecs, tag); break; case CRITICAL: fprintf (outfile, "%02d:%02d:%02d,%03d CRITICAL %s: ", t->tm_hour, - t->tm_min, t->tm_sec, msecs, syslog_facility); + t->tm_min, t->tm_sec, msecs, tag); break; } } -static void printLogMessage(int level, FILE *outfile, const char *s, va_list ap) { - printLogHeader(level, outfile); +static void printLogMessage(int level, const char *tag, FILE *outfile, const char *s, va_list ap) +{ + printLogHeader(level, tag, outfile); va_list apc; va_copy(apc, ap); - vfprintf(main_log_tty, s, apc); + vfprintf(outfile, s, apc); va_end(apc); fprintf(outfile, "\n"); fflush(outfile); } -void logMessageV(int level, const char * s, va_list ap) { +static void retagSyslog(const char* new_tag) +{ + closelog(); + openlog(new_tag, 0, syslog_facility); +} + +void logMessageV(enum logger_t logger, int level, const char * s, va_list ap) { + FILE *log_tty = main_log_tty; + FILE *log_file = main_log_file; + const char *tag = main_tag; + if (logger == PROGRAM_LOG) { + /* tty output is done directly for programs */ + log_tty = NULL; + log_file = program_log_file; + tag = program_tag; + /* close and reopen syslog so we get the tagging right */ + retagSyslog(tag); + } + va_list apc; /* Log everything into syslog */ va_copy(apc, ap); @@ -115,21 +137,33 @@ void logMessageV(int level, const char * s, va_list ap) { va_end(apc); /* Only log to the screen things that are above the minimum level. */ - if (main_log_tty && level >= minLevel) { - printLogMessage(level, main_log_tty, s, ap); + if (main_log_tty && level >= minLevel && log_tty) { + printLogMessage(level, tag, log_tty, s, ap); } /* But log everything to the file. */ if (main_log_file) { - printLogMessage(level, main_log_file, s, ap); + printLogMessage(level, tag, log_file, s, ap); } + + /* change the syslog tag back to the default again */ + if (logger == PROGRAM_LOG) + retagSyslog(main_tag); } void logMessage(int level, const char * s, ...) { va_list args; va_start(args, s); - logMessageV(level, s, args); + logMessageV(MAIN_LOG, level, s, args); + va_end(args); +} + +void logProgramMessage(int level, const char * s, ...) { + va_list args; + + va_start(args, s); + logMessageV(PROGRAM_LOG, level, s, args); va_end(args); } @@ -139,11 +173,12 @@ int file_logfd = -1; void openLog() { /* init syslog logging (so loader messages can also be forwarded to a remote syslog daemon */ - openlog(syslog_facility, 0, LOG_LOCAL1); + openlog(main_tag, 0, syslog_facility); int flags; - main_log_tty = fopen("/dev/tty3", "w"); - main_log_file = fopen("/tmp/anaconda.log", "w"); + main_log_tty = fopen("/dev/tty3", "a"); + main_log_file = fopen("/tmp/anaconda.log", "a"); + program_log_file = fopen("/tmp/program.log", "a"); if (main_log_tty) { tty_logfd = fileno(main_log_tty); @@ -156,14 +191,23 @@ void openLog() { flags = fcntl(file_logfd, F_GETFD, 0) | FD_CLOEXEC; fcntl(file_logfd, F_SETFD, flags); } + + if (program_log_file) { + int fd; + fd = fileno(program_log_file); + flags = fcntl(fd, F_GETFD, 0) | FD_CLOEXEC; + fcntl(file_logfd, F_SETFD, flags); + } } void closeLog(void) { if (main_log_tty) fclose(main_log_tty); - if (main_log_file) fclose(main_log_file); + if (program_log_file) + fclose(program_log_file); + /* close syslog logger */ closelog(); } diff --git a/isys/log.h b/isys/log.h index 183c0b2..51de2de 100644 --- a/isys/log.h +++ b/isys/log.h @@ -29,10 +29,17 @@ #define ERROR 40 #define CRITICAL 50 -void logMessageV(int level, const char * s, va_list ap) - __attribute__ ((format (printf, 2, 0))); +enum logger_t { + MAIN_LOG = 1, + PROGRAM_LOG = 2 +}; + +void logMessageV(enum logger_t logger, int level, const char * s, va_list ap) + __attribute__ ((format (printf, 3, 0))); void logMessage(int level, const char * s, ...) - __attribute__ ((format (printf, 2, 3))); + __attribute__ ((format (printf, 2, 3))); +void logProgramMessage(int level, const char * s, ...) + __attribute__ ((format (printf, 2, 3))); void openLog(); void closeLog(void); void setLogLevel(int minLevel); -- 1.6.6 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list