]> git.stg.codes - stg.git/blob - stglibs/logger.lib/logger.cpp
6289618e9b1895cf662c5c0381151e8bb0e2c1f5
[stg.git] / stglibs / logger.lib / logger.cpp
1 #include <stdio.h>
2 #include <stdarg.h>
3 #include <syslog.h>
4
5 #include "stg/logger.h"
6
7 #ifdef STG_TIME
8 extern const volatile time_t stgTime;
9 #endif
10 //-----------------------------------------------------------------------------
11 STG_LOGGER & GetStgLogger()
12 {
13 static STG_LOGGER logger;
14 return logger;
15 }
16 //-----------------------------------------------------------------------------
17 STG_LOGGER::STG_LOGGER()
18     : fileName(),
19       mutex()
20 {
21 pthread_mutex_init(&mutex, NULL);
22 }
23 //-----------------------------------------------------------------------------
24 STG_LOGGER::~STG_LOGGER()
25 {
26 pthread_mutex_destroy(&mutex);
27 }
28 //-----------------------------------------------------------------------------
29 void STG_LOGGER::SetLogFileName(const std::string & fn)
30 {
31 STG_LOGGER_LOCKER lock(&mutex);
32 fileName = fn;
33 }
34 //-----------------------------------------------------------------------------
35 void STG_LOGGER::operator()(const char * fmt, ...) const
36 {
37 STG_LOGGER_LOCKER lock(&mutex);
38
39 char buff[2048];
40
41 va_list vl;
42 va_start(vl, fmt);
43 vsnprintf(buff, sizeof(buff), fmt, vl);
44 va_end(vl);
45
46 LogString(buff);
47 }
48 //-----------------------------------------------------------------------------
49 const char * STG_LOGGER::LogDate(time_t t) const
50 {
51 static char s[32];
52 if (t == 0)
53     t = time(NULL);
54
55 struct tm * tt = localtime(&t);
56
57 snprintf(s, 32, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
58          tt->tm_year + 1900,
59          tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
60          tt->tm_mday    < 10 ? "0" : "", tt->tm_mday,
61          tt->tm_hour    < 10 ? "0" : "", tt->tm_hour,
62          tt->tm_min     < 10 ? "0" : "", tt->tm_min,
63          tt->tm_sec     < 10 ? "0" : "", tt->tm_sec);
64
65 return s;
66 }
67 //-----------------------------------------------------------------------------
68 void STG_LOGGER::LogString(const char * str) const
69 {
70 if (!fileName.empty())
71     {
72     FILE * f = fopen(fileName.c_str(), "at");
73     if (f)
74         {
75         #ifdef STG_TIME
76         fprintf(f, "%s", LogDate(stgTime));
77         #else
78         fprintf(f, "%s", LogDate(time(NULL)));
79         #endif
80         fprintf(f, " -- ");
81         fprintf(f, "%s", str);
82         fprintf(f, "\n");
83         fclose(f);
84         }
85     else
86         {
87         openlog("stg", LOG_NDELAY, LOG_USER);
88         syslog(LOG_CRIT, "%s", str);
89         closelog();
90         }
91     }
92 else
93     {
94     openlog("stg", LOG_NDELAY, LOG_USER);
95     syslog(LOG_CRIT, "%s", str);
96     closelog();
97     }
98 }
99 //-----------------------------------------------------------------------------
100 PLUGIN_LOGGER::PLUGIN_LOGGER(const STG_LOGGER & logger, const std::string & pn)
101     : STG_LOGGER(),
102       pluginName(pn)
103 {
104     SetLogFileName(logger.fileName);
105 }
106 //-----------------------------------------------------------------------------
107 PLUGIN_LOGGER::PLUGIN_LOGGER(const PLUGIN_LOGGER & rhs)
108     : STG_LOGGER(),
109       pluginName(rhs.pluginName)
110 {
111     SetLogFileName(fileName);
112 }
113 //-----------------------------------------------------------------------------
114 void PLUGIN_LOGGER::operator()(const char * fmt, ...) const
115 {
116 char buff[2029];
117
118 va_list vl;
119 va_start(vl, fmt);
120 vsnprintf(buff, sizeof(buff), fmt, vl);
121 va_end(vl);
122
123 STG_LOGGER::operator()("[%s] %s", pluginName.c_str(), buff);
124 }
125 //-----------------------------------------------------------------------------
126 void PLUGIN_LOGGER::operator()(const std::string & line) const
127 {
128 STG_LOGGER::operator()("[%s] %s", pluginName.c_str(), line.c_str());
129 }
130 //-----------------------------------------------------------------------------
131 PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER & logger, const std::string & pluginName)
132 {
133 return PLUGIN_LOGGER(logger, pluginName);
134 }
135 //-----------------------------------------------------------------------------