8
const char * const severity_map[] = {
15
static void format_string(pst_logger* log, const char* fmt, va_list args)
17
log->mStringLen += vsnprintf(log->mString + log->mStringLen, log->mStringSize - log->mStringLen, fmt, args);
20
static void format_prefix(pst_logger* log, SC_LogSeverity severity)
25
timeinfo = gmtime(&rawTime);
27
log->mStringLen += strftime(log->mString, sizeof(log->mString), "%d-%m-%Y %H:%M:%S", timeinfo);
28
log->mStringLen += snprintf(log->mString + log->mStringLen, sizeof(log->mString) - log->mStringLen, "%s", severity_map[(int)severity]);
31
static void format_postfix(pst_logger* log)
33
if((log->mStringLen + 2) < log->mStringSize) {
34
log->mString[log->mStringLen++] = '\n';
35
log->mString[log->mStringLen++] = 0;
40
static void log_base(pst_logger* log, SC_LogSeverity severity, const char* fmt, ...)
42
if (severity < log->mCurrentSeverity)
45
pthread_mutex_lock(&log->mLock);
47
if(!log->is_opened(log)) {
52
format_prefix(log, severity);
55
format_string(log, fmt, args);
58
log->send_message(log, severity);
60
pthread_mutex_unlock(&log->mLock);
63
static void log_init_base(pst_logger* plog, const char* source)
71
plog->mpSource = strdup(source);
74
plog->mStringSize = sizeof(plog->mString);
76
plog->mCurrentSeverity = SEVERITY_DEBUG;
77
pthread_mutex_init(&plog->mLock, NULL);
81
void pst_log_fini(pst_logger* log)
83
pthread_mutex_destroy(&log->mLock);
96
#define GREEN "\e[0;32m"
97
#define YELLOW "\e[1;33m"
101
static void send_msg_console(pst_logger* log, SC_LogSeverity severity)
103
const char* color = NC;
114
case SEVERITY_WARNING:
122
fprintf(stderr, "%s%s%s", color, log->mString, NC);
125
static void close_console(pst_logger* log) {
129
static bool open_console(pst_logger* log) {
133
static bool is_opened_console(pst_logger* log) {
137
void pst_log_init_console(pst_logger* log)
139
log_init_base(log, NULL);
140
log->close = close_console;
141
log->open = open_console;
142
log->is_opened = is_opened_console;
143
log->send_message = send_msg_console;
150
typedef struct _file_spec {
159
static bool open_file(pst_logger* log)
161
file_spec* fsp = (file_spec*)log->child;
163
fprintf(stderr, "Wrong initialization of File-based logger\n");
169
uint32_t namelen = strlen(log->mpSource);
171
const char* ptr = strrchr(log->mpSource, '/');
172
uint32_t pathlen = 0;
174
pathlen = ptr - log->mpSource + 1;
175
namelen -= pathlen + 1;
178
fsp->dir = strndup(log->mpSource, pathlen);
179
fsp->fname = strndup(log->mpSource + pathlen, namelen);
182
fsp->fd = fopen(log->mpSource, "a+");
186
return (fsp->fd != 0);
189
static void close_file(pst_logger* log)
191
file_spec* fsp = (file_spec*)log->child;
193
fprintf(stderr, "Wrong initialization of File-based logger while close\n");
205
static bool is_file_opened(pst_logger* log)
207
file_spec* fsp = (file_spec*)log->child;
209
fprintf(stderr, "Wrong initialization of File-based logger while check open\n");
212
return (fsp->fd != 0);
215
static void send_msg_file(pst_logger* log, SC_LogSeverity severity)
217
file_spec* fsp = (file_spec*)log->child;
219
fprintf(stderr, "Wrong initialization of File-based logger while check send message\n");
222
if(fsp->fd && fsp->num_bytes < fsp->max_bytes) {
223
if(fputs(log->mString, fsp->fd) >= 0) {
225
fsp->num_bytes += log->mStringLen;
233
void pst_log_init_file(pst_logger* log, const char* path, uint64_t max_bytes)
235
log_init_base(log, path);
236
file_spec* fsp = (file_spec*)malloc(sizeof(file_spec));
238
fsp->max_bytes = max_bytes;
242
log->close = close_file;
243
log->open = open_file;
244
log->is_opened = is_file_opened;
245
log->send_message = send_msg_file;