initial version
[apps/native/gear-racing-car.git] / src / log.c
1 #include <stdio.h>
2 #include <stdarg.h>
3 #include <sys/time.h>
4 #include <time.h>
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <app_common.h>
9 #include "log.h"
10
11 #define MAX_LOG_SIZE 4096
12 #define PATH_MAX 4096
13
14 static FILE *log_fp = NULL;
15 static log_type ltype = LOG_TYPE_DLOG;
16
17 static const char log_prio_name[][DLOG_PRIO_MAX-1] = {
18         "UNKNOWN",
19         "DEFAULT", /**< Default */
20         "VERBOSE", /**< Verbose */
21         "DEBUG", /**< Debug */
22         "INFO", /**< Info */
23         "WARN", /**< Warning */
24         "ERROR", /**< Error */
25         "FATAL", /**< Fatal */
26         "SILENT" /**< Silent */
27 };
28
29 static inline char* getFormattedTime(void)
30 {
31         struct timeval val;
32         struct tm *ptm;
33         static char res_time[40] = {0, };
34
35         gettimeofday(&val, NULL);
36         ptm = localtime(&val.tv_sec);
37
38         // format : YYMMDDhhmmssuuuuuu
39         snprintf(res_time, sizeof(res_time), "%04d-%02d-%02d %02d:%02d:%02d:%06ld"
40                 , ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday
41                 , ptm->tm_hour, ptm->tm_min, ptm->tm_sec
42                 , val.tv_usec);
43
44         return res_time;
45 }
46
47 static int __open_log_file(void)
48 {
49         char buf[PATH_MAX] = {0,};
50         char *prefix = NULL;
51
52         prefix = app_get_data_path();
53
54         if (!prefix)
55                 goto error;
56
57         snprintf(buf, sizeof(buf)-1, "%s%s", prefix, "log.txt");
58         free(prefix);
59
60         log_fp = fopen(buf, "a"); /* append or create new ??? */
61         if (log_fp == NULL) {
62                 dlog_print(DLOG_WARN, LOG_TAG, "%s\n", strerror(errno));
63                 goto error;
64         }
65
66         return 0;
67
68 error:
69         dlog_print(DLOG_WARN, LOG_TAG, "error to use log file, so use dlog as log system\n");
70         ltype = LOG_TYPE_DLOG;
71         return -1;
72 }
73
74 int log_type_set(log_type type)
75 {
76         ltype = type;
77         dlog_print(DLOG_DEBUG, LOG_TAG, "setting log type : [%d]\n", type);
78         switch (type) {
79         case LOG_TYPE_FILE:
80         case LOG_TYPE_ALL:
81                 __open_log_file();
82                 break;
83         case LOG_TYPE_DLOG: /* nothing to do */
84         default:
85                 ltype = LOG_TYPE_DLOG;
86                 break;
87         }
88         return 0;
89 }
90
91 void log_file_close(void)
92 {
93         if (log_fp) {
94                 fclose(log_fp);
95                 log_fp = NULL;
96                 dlog_print(DLOG_DEBUG, LOG_TAG, "close log file\n");
97         }
98
99         log_type_set(LOG_TYPE_DLOG);
100
101         return;
102 }
103
104 int log_print(log_priority prio, const char *tag, const char *fmt, ...)
105 {
106         va_list ap;
107
108         switch (ltype) {
109         case LOG_TYPE_FILE:
110                 if (log_fp) {
111                         va_start(ap, fmt);
112                         fprintf(log_fp, "[%s] [%s]", getFormattedTime(), log_prio_name[prio]);
113                         vfprintf(log_fp, fmt, ap);
114                         va_end(ap);
115                         fflush(log_fp);
116                 }
117                 break;
118         case LOG_TYPE_ALL:
119                 va_start(ap, fmt);
120                 if (log_fp) {
121                         fprintf(log_fp, "[%s] [%s]", getFormattedTime(), log_prio_name[prio]);
122                         vfprintf(log_fp, fmt, ap);
123                 }
124                 dlog_vprint(prio, tag, fmt, ap);
125                 va_end(ap);
126
127                 if (log_fp)
128                         fflush(log_fp);
129                 break;
130         case LOG_TYPE_DLOG:
131         default:
132                 va_start(ap, fmt);
133                 dlog_vprint(prio, tag, fmt, ap);
134                 va_end(ap);
135                 break;
136         }
137         return 0;
138 }