2de7037c5c7af67d313aa786925ae41ad79edc8a
[psensor.git] / src / lib / log.c
1 /*
2     Copyright (C) 2010-2011 jeanfi@gmail.com
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17     02110-1301 USA
18 */
19
20 #include <locale.h>
21 #include <libintl.h>
22 #define _(str) gettext(str)
23
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <sys/time.h>
27
28 #include "log.h"
29
30 static FILE *file;
31 int log_level =  LOG_WARN;
32
33 void log_open(const char *path)
34 {
35         file = fopen(path, "a");
36
37         if (file)
38                 log_printf(LOG_INFO, "Start logging");
39         else
40                 log_printf(LOG_ERR, _("Cannot open log file: %s"), path);
41 }
42
43 void log_close()
44 {
45         if (!file)
46                 return ;
47
48         fclose(file);
49
50         file = NULL;
51 }
52
53 #define LOG_BUFFER 4096
54 void log_printf(int lvl, const char *fmt, ...)
55 {
56         struct timeval tv;
57         char buffer[1 + LOG_BUFFER];
58         va_list ap;
59         char *lvl_str;
60         FILE *stdf;
61
62         if (lvl > LOG_INFO && (!file || lvl > log_level))
63                 return ;
64
65         va_start(ap, fmt);
66         vsnprintf(buffer, LOG_BUFFER, fmt, ap);
67         buffer[LOG_BUFFER] = '\0';
68         va_end(ap);
69
70         if (gettimeofday(&tv, NULL) != 0)
71                 timerclear(&tv);
72
73         switch (lvl) {
74         case LOG_WARN:
75                 lvl_str = "[WARN]";
76                 break;
77         case LOG_ERR:
78                 lvl_str = "[ERR]";
79                 break;
80         case LOG_DEBUG:
81                 lvl_str = "[DEBUG]";
82                 break;
83         case LOG_INFO:
84                 lvl_str = "[INFO]";
85                 break;
86         default:
87                 lvl_str = "[??]";
88         }
89
90         if (file && lvl <= log_level) {
91                 fprintf(file, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer);
92                 fflush(file);
93         }
94
95         if (lvl <= LOG_INFO) {
96                 if (lvl == LOG_WARN || lvl == LOG_ERR)
97                         stdf = stderr;
98                 else
99                         stdf = stdout;
100
101                 fprintf(stdf, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer);
102         }
103 }