00001
00002
00003
00004
00005
00006
00007
00008 #include "wvsyslog.h"
00009 #include "strutils.h"
00010 #include <time.h>
00011 #include <syslog.h>
00012
00013 WvSyslog::WvSyslog(const WvString &_prefix, bool _include_appname,
00014 WvLog::LogLevel _first_debug,
00015 WvLog::LogLevel _max_level)
00016 : WvLogRcv(_max_level), syslog_prefix(_prefix)
00017 {
00018 first_debug = _first_debug;
00019 include_appname = _include_appname;
00020 openlog(syslog_prefix, 0, LOG_DAEMON);
00021 }
00022
00023
00024 WvSyslog::~WvSyslog()
00025 {
00026 end_line();
00027 closelog();
00028 }
00029
00030
00031 void WvSyslog::_begin_line()
00032 {
00033 if (include_appname)
00034 current.put(prefix, prelen);
00035 }
00036
00037
00038 void WvSyslog::_mid_line(const char *str, size_t len)
00039 {
00040 current.put(str, len);
00041 }
00042
00043
00044 void WvSyslog::_end_line()
00045 {
00046 int lev, count;
00047 struct LevMap
00048 {
00049 int wvlog_lvl;
00050 int syslog_lvl;
00051 };
00052
00053 static LevMap levmap[] = {
00054 {WvLog::Critical, LOG_CRIT},
00055 {WvLog::Error, LOG_ERR},
00056 {WvLog::Warning, LOG_WARNING},
00057 {WvLog::Notice, LOG_NOTICE},
00058 {WvLog::Info, LOG_INFO},
00059 {WvLog::Debug, LOG_DEBUG},
00060 {WvLog::Debug2, -1},
00061 {-1, -1}
00062 };
00063
00064 if (current.used())
00065 {
00066 lev = -1;
00067
00068 for (count = 0; levmap[count].wvlog_lvl >= 0; count++)
00069 {
00070 if (last_level >= levmap[count].wvlog_lvl)
00071 lev = levmap[count].syslog_lvl;
00072 }
00073
00074 if (last_level < first_debug && lev == LOG_DEBUG)
00075 lev = LOG_INFO;
00076
00077 if (lev >= 0)
00078 {
00079 current.put("", 1);
00080 syslog(lev, "%s", current.get(current.used()));
00081 }
00082 else
00083 current.zap();
00084 }
00085 }
00086