/*
* Sherlock Library -- Logging
*
- * (c) 1997 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
+ * (c) 1997--2001 Martin Mares <mj@ucw.cz>
*/
+#include "lib/lib.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
-#include "lib.h"
-
-static byte *progname = "???";
-static pid_t pid;
+static byte *log_progname;
+static pid_t log_pid;
static void
-logit(int level, byte *msg, va_list args)
+vlog(unsigned int cat, byte *msg, va_list args)
{
- time_t tim;
- struct tm *tm;
+ time_t tim = time(NULL);
+ struct tm *tm = localtime(&tim);
char buf[32];
- tim = time(NULL);
- tm = localtime(&tim);
- strftime(buf, sizeof(buf), "%d-%m-%y %H:%M:%S", tm);
- fprintf(stderr, "%s %s [%d] <%d> ", buf, progname, pid, level);
+ if (!log_pid)
+ log_pid = getpid();
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
+ fprintf(stderr, "%c %s ", cat, buf);
+ if (log_progname)
+ fprintf(stderr, "[%s (%d)] ", log_progname, log_pid);
vfprintf(stderr, msg, args);
fputc('\n', stderr);
fflush(stderr);
}
void
-log(byte *msg, ...)
+log(unsigned int cat, byte *msg, ...)
{
- int level = 2;
va_list args;
va_start(args, msg);
- if (msg[0] == '<' && msg[1] >= '0' && msg[1] <= '9' && msg[2] == '>')
- {
- level = msg[1] - '0';
- msg += 3;
- }
- logit(level, msg, args);
+ vlog(cat, msg, args);
va_end(args);
}
va_list args;
va_start(args, msg);
- logit(9, msg, args);
+ vlog(L_FATAL, msg, args);
va_end(args);
- exit(99);
+ exit(1);
}
static byte *
}
void
-initlog(byte *argv0)
+log_init(byte *argv0)
+{
+ if (argv0)
+ log_progname = basename(argv0);
+}
+
+void
+log_file(byte *name)
{
- progname = basename(argv0);
- pid = getpid();
+ if (name)
+ {
+ int fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666);
+ if (fd < 0)
+ die("Unable to open log file %s: %m", name);
+ close(2);
+ dup(fd);
+ close(fd);
+ }
}