#include "config.h" #include #include #ifndef NO_SYSLOG #include #endif /* NO_SYSLOG */ #ifdef HAVE_STRING_H #include #endif /* HAVE_STRING_H */ #include #include #include "common.h" #include "log.h" #include "token.h" Logger::Logger(char *filename) { fp = 0; append_mode = 0; put_level = -1; if (filename) { setFilename(filename); } else { *default_filename = 0; } } Logger::~Logger() { } #ifndef NO_SYSLOG static struct facility_list_t { char *name; int value; } facility_list[] = { #ifdef LOG_AUTH "LOG_AUTH" , LOG_AUTH, #endif #ifdef LOG_AUTHPRIV "LOG_AUTHPRIV", LOG_AUTHPRIV, #endif #ifdef LOG_CRON "LOG_CRON" , LOG_CRON, #endif #ifdef LOG_DAEMON "LOG_DAEMON" , LOG_DAEMON, #endif #ifdef LOG_FTP "LOG_FTP" , LOG_FTP, #endif #ifdef LOG_KERN "LOG_KERN" , LOG_KERN, #endif #ifdef LOG_LPR "LOG_LPR" , LOG_LPR, #endif #ifdef LOG_MAIL "LOG_MAIL" , LOG_MAIL, #endif #ifdef LOG_NEWS "LOG_NEWS" , LOG_NEWS, #endif #ifdef LOG_SYSLOG "LOG_SYSLOG" , LOG_SYSLOG, #endif #ifdef LOG_USER "LOG_USER" , LOG_USER, #endif #ifdef LOG_UUCP "LOG_UUCP" , LOG_UUCP, #endif #ifdef LOG_LOCAL0 "LOG_LOCAL0" , LOG_LOCAL0, #endif #ifdef LOG_LOCAL1 "LOG_LOCAL1" , LOG_LOCAL1, #endif #ifdef LOG_LOCAL2 "LOG_LOCAL2" , LOG_LOCAL2, #endif #ifdef LOG_LOCAL3 "LOG_LOCAL3" , LOG_LOCAL3, #endif #ifdef LOG_LOCAL4 "LOG_LOCAL4" , LOG_LOCAL4, #endif #ifdef LOG_LOCAL5 "LOG_LOCAL5" , LOG_LOCAL5, #endif #ifdef LOG_LOCAL6 "LOG_LOCAL6" , LOG_LOCAL6, #endif #ifdef LOG_LOCAL7 "LOG_LOCAL7" , LOG_LOCAL7, #endif 0, 0 }; static int syslog_level_list[] = { LOG_ERR, LOG_WARNING, LOG_DEBUG }; #endif /* !NO_SYSLOG */ int Logger::open(char *filename) { char *fmode = "wt"; if (fp) { close(); fmode = "at"; } if (append_mode) fmode = "at"; if (!filename) { if (!*default_filename) { fp = stderr; return TRUE; } filename = default_filename; } else { setFilename(filename); } if (!strncmp(filename, "syslog", 6)) { #ifndef NO_SYSLOG int facility = LOG_LOCAL0; if (filename[6] == ':') { char *p = filename + 7; facility_list_t *flp = facility_list; skipSpace(&p); while (flp->name) { if (!strcmp(p, flp->name)) { facility = flp->value; break; } flp++; } } openlog("bjorb", LOG_PID, facility); fp = (FILE *)-1; return TRUE; #else /* NO_SYSLOG */ fprintf(stderr, "This bjorb is compiled not to use syslog\n"); #endif /* NO_SYSLOG */ } fp = fopen(filename, fmode); if (!fp) return FALSE; return TRUE; } /* -----------------------------------------------------------------* =NAME= put - ログを出力する =SYNOPSIS= void Logger::put(const char *fmt, ...) ... - printf と同じ * ----------------------------------------------------------------- */ void Logger::put(const char *fmt, ...) { int ret; va_list ap; if (!fp) { ret = open(); if (!ret) { fp = stderr; put("WARNING: Can't open log file `%s' : %s\n", default_filename, strerror(errno)); } } va_start(ap, fmt); #ifndef NO_SYSLOG if ((int)fp == -1) { char buf[512]; int level; vsprintf(buf, fmt, ap); if (put_level > 2) { level = LOG_DEBUG; } else { level = syslog_level_list[put_level]; } if (facility) level = facility; syslog(level, buf); } else { #endif /* !NO_SYSLOG */ putLogTime(); if (put_level >= 0) { fprintf(fp, "(%d) ", put_level); #ifdef SAFE put_level = -1; #endif #ifndef NO_SYSLOG } #endif /* !NO_SYSLOG */ vfprintf(fp, fmt, ap); #ifndef DONT_FFLUSH fflush(fp); #endif } va_end(ap); } /* ----------------------------------------------------------------- * =NAME= putLogTime - 時間を出力する =SYNOPSIS= void Logger::putLogTime() * ----------------------------------------------------------------- */ void Logger::putLogTime() { time_t t; char *s; char buf[40]; t = time(0); s = ctime(&t); STRCPY(buf, s); chomp(buf); fprintf(fp, "%s: [%d] ", buf, getpid()); } void Logger::setFilename(char *filename) { STRCPY(default_filename, filename); } void Logger::close() { if (fp && fp != stderr #ifndef NO_SYSLOG && (int)fp != -1 #endif ) { put("Close log file\n"); fclose(fp); fp = 0; } } #ifndef NO_SYSLOG void Logger::setFacilityInfo() { facility = LOG_INFO; } #endif /* !NO_SYSLOG */