d43619d5fde6ff84b7084921874effd529ff5a4a
[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_ERR, _("Cannot open log file: %s"), path);
39 }
40
41 void log_close()
42 {
43         if (!file)
44                 return ;
45
46         fclose(file);
47
48         file = NULL;
49 }
50
51
52 #define LOG_BUFFER 4096
53 static void vlogf(int lvl, const char *fmt, va_list ap)
54 {
55         struct timeval tv;
56         char buffer[1 + LOG_BUFFER];
57         char *lvl_str;
58         FILE *stdf;
59
60         if (lvl > LOG_INFO && (!file || lvl > log_level))
61                 return ;
62
63         vsnprintf(buffer, LOG_BUFFER, fmt, ap);
64         buffer[LOG_BUFFER] = '\0';
65
66         if (gettimeofday(&tv, NULL) != 0)
67                 timerclear(&tv);
68
69         switch (lvl) {
70         case LOG_WARN:
71                 lvl_str = "[WARN]";
72                 break;
73         case LOG_ERR:
74                 lvl_str = "[ERR]";
75                 break;
76         case LOG_DEBUG:
77                 lvl_str = "[DEBUG]";
78                 break;
79         case LOG_INFO:
80                 lvl_str = "[INFO]";
81                 break;
82         default:
83                 lvl_str = "[??]";
84         }
85
86         if (file && lvl <= log_level) {
87                 fprintf(file, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer);
88                 fflush(file);
89         }
90
91         if (lvl <= LOG_INFO) {
92                 if (lvl == LOG_WARN || lvl == LOG_ERR)
93                         stdf = stderr;
94                 else
95                         stdf = stdout;
96
97                 fprintf(stdf, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer);
98         }
99 }
100
101 void log_printf(int lvl, const char *fmt, ...)
102 {
103         va_list ap;
104
105         va_start(ap, fmt);
106         vlogf(lvl, fmt, ap);
107         va_end(ap);
108 }
109
110 void log_debug(const char *fmt, ...)
111 {
112         va_list ap;
113
114         if (log_level < LOG_DEBUG)
115                 return ;
116
117         va_start(ap, fmt);
118         vlogf(LOG_DEBUG, fmt, ap);
119         va_end(ap);
120 }