]> git.stg.codes - stg.git/blob - libs/logger/logger.cpp
Port to CMake, get rid of os_int.h.
[stg.git] / libs / logger / logger.cpp
1 #include "stg/logger.h"
2
3 #include <stdio.h>
4 #include <stdarg.h>
5 #include <syslog.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     : m_parent(logger),
102       m_pluginName(pn)
103 {
104 }
105 //-----------------------------------------------------------------------------
106 void PLUGIN_LOGGER::operator()(const char * fmt, ...) const
107 {
108 char buff[2029];
109
110 va_list vl;
111 va_start(vl, fmt);
112 vsnprintf(buff, sizeof(buff), fmt, vl);
113 va_end(vl);
114
115 m_parent("[%s] %s", m_pluginName.c_str(), buff);
116 }
117 //-----------------------------------------------------------------------------
118 void PLUGIN_LOGGER::operator()(const std::string & line) const
119 {
120 m_parent("[%s] %s", m_pluginName.c_str(), line.c_str());
121 }
122 //-----------------------------------------------------------------------------
123 PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER & logger, const std::string & pluginName)
124 {
125 return PLUGIN_LOGGER(logger, pluginName);
126 }
127 //-----------------------------------------------------------------------------