--- freem/src/log.c 2025/04/15 02:24:43 1.9 +++ freem/src/log.c 2025/04/15 14:39:06 1.10 @@ -1,5 +1,5 @@ /* - * $Id: log.c,v 1.9 2025/04/15 02:24:43 snw Exp $ + * $Id: log.c,v 1.10 2025/04/15 14:39:06 snw Exp $ * freem error logging * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: log.c,v $ + * Revision 1.10 2025/04/15 14:39:06 snw + * Further improvements to logging + * * Revision 1.9 2025/04/15 02:24:43 snw * Improve FreeM logging capabilities * @@ -63,35 +66,89 @@ #include "mpsdef.h" +short log_threshold_file; +short log_threshold_syslog; +short log_threshold_stderr; + + +void init_log(void) +{ + log_threshold_file = LOG_INFO; + log_threshold_syslog = LOG_INFO; + log_threshold_stderr = LOG_WARNING; +} -void m_log (int level, const char *msg) +void log_level_to_text(int level, char *buf) +{ + switch (level) { + + case LOG_DEBUG: + sprintf (buf, "DEBUG"); + break; + + case LOG_INFO: + sprintf (buf, "INFO"); + break; + + case LOG_WARNING: + sprintf (buf, "WARNING"); + break; + + case LOG_ERROR: + sprintf (buf, "ERROR"); + break; + + case LOG_FATAL: + sprintf (buf, "FATAL"); + break; + + default: + sprintf (buf, "LEVEL %d", level); + break; + + } +} + +void m_log(int level, const char *msg) { FILE *fp; time_t unix_epoch; char timeval[255]; char filename[4096]; + char lvl[20]; struct tm *logtime; - snprintf (filename, sizeof (filename) - 1, "/var/log/freem/%s.log", shm_env); + log_level_to_text (level, lvl); - if ((fp = fopen (filename, "a+")) != NULL) { - unix_epoch = time (0L); - logtime = localtime (&unix_epoch); - strftime (timeval, sizeof (timeval) - 1, "%F %T", logtime); - fprintf (fp, "%s [LEVEL %d PID %ld]: %s\n", timeval, level, pid, msg); - fclose (fp); + if (level >= log_threshold_file) { + snprintf (filename, sizeof (filename) - 1, "/var/log/freem/%s.log", shm_env); + + if ((fp = fopen (filename, "a+")) != NULL) { + unix_epoch = time (0L); + logtime = localtime (&unix_epoch); + strftime (timeval, sizeof (timeval) - 1, "%F %T", logtime); + fprintf (fp, "%s [LEVEL %s PID %ld]: %s\n", timeval, lvl, pid, msg); + fclose (fp); + } } #if defined(__linux__) | defined(__FreeBSD__) | defined(__sun__) - syslog (level, "%s", msg); + if (level >= log_threshold_syslog) { + syslog (level, "%s", msg); + } #endif + + if (level >= log_threshold_stderr) fprintf (stderr, "%s\r\n", msg); + + if (level >= LOG_FATAL) { + cleanup (); + exit (LOG_FATAL); + } - return; - + return; } - void logprintf(int level, char *fmt, ...) { va_list ptr;