~ruther/CTU-FEE-B0B35APO-Semestral-project

ref: 0631e1405d2c7df9ef0d24a9c1bdf3f43128c9c5 CTU-FEE-B0B35APO-Semestral-project/lib-pheripherals/src/logger.c -rw-r--r-- 3.1 KiB
0631e140 — František Boháček refactor: move logger to library 3 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "logger.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <time.h>

logger_t logger_create(LogLevel minimalLevel, FILE *debugFile, FILE *infoFile, FILE *warningFile,
                     FILE *errorFile, logger_t *childLogger) {
  logger_t logger = { debugFile, infoFile, warningFile, errorFile, minimalLevel, childLogger };
  return logger;
}

void print_time(FILE *file) {
  time_t now;
  time(&now);
  struct tm *local = localtime(&now);

  fprintf(file, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec);
}

void logger_log_vaargs(logger_t *logger, LogLevel level, const char *file_name,
                       const char *function, int line,
                       const char *const message, va_list args) {
  if (logger->childLogger != NULL) {
    va_list copy;
    va_copy(copy, args);
    logger_log_vaargs(logger->childLogger, level, file_name, function, line, message, copy);
    va_end(copy);
  }

  if (level < logger->minimalLevel) {
    return;
  }

  FILE *file = NULL;
  const char *prefix;

  switch (level) {
  case LOG_DEBUG:
    file = logger->debugFile;
    prefix = DEBUG_PREFIX;
    break;
  case LOG_INFO:
    file = logger->infoFile;
    prefix = INFO_PREFIX;
    break;
  case LOG_WARN:
    file = logger->warningFile;
    prefix = WARN_PREFIX;
    break;
  case LOG_ERROR:
    file = logger->errorFile;
    prefix = ERROR_PREFIX;
    break;
  default:
    prefix = "UNKN";
    file = logger->errorFile;
    break;
  }

  assert(file != NULL);
  fprintf(file, "[");
  print_time(file);
  fprintf(file, "] %s: ", prefix);
  vfprintf(file, message, args);
  fprintf(file, " (%s/%s:%d)", file_name, function, line);
  fprintf(file, "\r\n");
}

void logger_log(logger_t *logger, LogLevel level, const char *file,
                const char *function, int line,
                const char *const message, ...) {
  va_list args;
  va_start(args, message);
  logger_log_vaargs(logger, level, file, function, line, message, args);
  va_end(args);
}

void logger_debug(logger_t *logger, const char *file, const char *function,
                  int line, const char *const message, ...) {
  va_list args;
  va_start(args, message);
  logger_log_vaargs(logger, LOG_DEBUG, file, function, line, message, args);
  va_end(args);
}

void logger_info(logger_t *logger, const char *file, const char *function,
                 int line, const char *const message, ...) {
  va_list args;
  va_start(args, message);
  logger_log_vaargs(logger, LOG_INFO, file, function, line, message, args);
  va_end(args);
}
void logger_warn(logger_t *logger, const char *file, const char *function,
                 int line, const char *const message, ...) {
  va_list args;
  va_start(args, message);
  logger_log_vaargs(logger, LOG_WARN, file, function, line, message, args);
  va_end(args);
}

void logger_error(logger_t *logger, const char *file, const char *function,
                  int line, const char *const message, ...) {
  va_list args;
  va_start(args, message);
  logger_log_vaargs(logger, LOG_ERROR, file, function, line, message, args);
  va_end(args);
}
Do not follow this link