Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2016 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk/log.h"
9 : :
10 : : static const char *const spdk_level_names[] = {
11 : : [SPDK_LOG_ERROR] = "ERROR",
12 : : [SPDK_LOG_WARN] = "WARNING",
13 : : [SPDK_LOG_NOTICE] = "NOTICE",
14 : : [SPDK_LOG_INFO] = "INFO",
15 : : [SPDK_LOG_DEBUG] = "DEBUG",
16 : : };
17 : :
18 : : #define MAX_TMPBUF 1024
19 : :
20 : : static logfunc *g_log = NULL;
21 : : static bool g_log_timestamps = true;
22 : :
23 : : enum spdk_log_level g_spdk_log_level;
24 : : enum spdk_log_level g_spdk_log_print_level;
25 : :
26 : 4051 : SPDK_LOG_REGISTER_COMPONENT(log)
27 : :
28 : : void
29 : 3118 : spdk_log_set_level(enum spdk_log_level level)
30 : : {
31 [ - + ]: 3118 : assert(level >= SPDK_LOG_DISABLED);
32 [ - + ]: 3118 : assert(level <= SPDK_LOG_DEBUG);
33 : 3118 : g_spdk_log_level = level;
34 : 3118 : }
35 : :
36 : : enum spdk_log_level
37 : 41 : spdk_log_get_level(void) {
38 : 41 : return g_spdk_log_level;
39 : : }
40 : :
41 : : void
42 : 3164 : spdk_log_set_print_level(enum spdk_log_level level)
43 : : {
44 [ - + ]: 3164 : assert(level >= SPDK_LOG_DISABLED);
45 [ - + ]: 3164 : assert(level <= SPDK_LOG_DEBUG);
46 : 3164 : g_spdk_log_print_level = level;
47 : 3164 : }
48 : :
49 : : enum spdk_log_level
50 : 20 : spdk_log_get_print_level(void) {
51 : 20 : return g_spdk_log_print_level;
52 : : }
53 : :
54 : : void
55 : 3106 : spdk_log_open(logfunc *logf)
56 : : {
57 [ + + ]: 3106 : if (logf) {
58 : 4 : g_log = logf;
59 : : } else {
60 : 3102 : openlog("spdk", LOG_PID, LOG_LOCAL7);
61 : : }
62 : 3106 : }
63 : :
64 : : void
65 : 3102 : spdk_log_close(void)
66 : : {
67 [ + - ]: 3102 : if (!g_log) {
68 : 3102 : closelog();
69 : : }
70 : 3102 : }
71 : :
72 : : void
73 : 0 : spdk_log_enable_timestamps(bool value)
74 : : {
75 : 0 : g_log_timestamps = value;
76 : 0 : }
77 : :
78 : : static void
79 : 7316973 : get_timestamp_prefix(char *buf, int buf_size)
80 : : {
81 : : struct tm *info;
82 : 31755 : char date[24];
83 : 31755 : struct timespec ts;
84 : : long usec;
85 : :
86 [ - + - + ]: 7316973 : if (!g_log_timestamps) {
87 : 0 : buf[0] = '\0';
88 : 0 : return;
89 : : }
90 : :
91 [ - + ]: 7316973 : clock_gettime(CLOCK_REALTIME, &ts);
92 : 7316973 : info = localtime(&ts.tv_sec);
93 : 7316973 : usec = ts.tv_nsec / 1000;
94 [ - + ]: 7316973 : if (info == NULL) {
95 [ # # ]: 0 : snprintf(buf, buf_size, "[%s.%06ld] ", "unknown date", usec);
96 : 0 : return;
97 : : }
98 : :
99 [ - + ]: 7316973 : strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", info);
100 [ - + ]: 7316973 : snprintf(buf, buf_size, "[%s.%06ld] ", date, usec);
101 : : }
102 : :
103 : : void
104 : 8054922 : spdk_log(enum spdk_log_level level, const char *file, const int line, const char *func,
105 : : const char *format, ...)
106 : : {
107 : 40159 : va_list ap;
108 : :
109 : 8054922 : va_start(ap, format);
110 : 8054922 : spdk_vlog(level, file, line, func, format, ap);
111 : 8054922 : va_end(ap);
112 : 8054922 : }
113 : :
114 : : int
115 : 7316994 : spdk_log_to_syslog_level(enum spdk_log_level level)
116 : : {
117 [ + + + + : 7316994 : switch (level) {
- - ]
118 : 13601 : case SPDK_LOG_DEBUG:
119 : : case SPDK_LOG_INFO:
120 : 13601 : return LOG_INFO;
121 : 6509459 : case SPDK_LOG_NOTICE:
122 : 6509459 : return LOG_NOTICE;
123 : 511 : case SPDK_LOG_WARN:
124 : 511 : return LOG_WARNING;
125 : 793423 : case SPDK_LOG_ERROR:
126 : 793423 : return LOG_ERR;
127 : 0 : case SPDK_LOG_DISABLED:
128 : 0 : return -1;
129 : 0 : default:
130 : 0 : break;
131 : : }
132 : :
133 : 0 : return LOG_INFO;
134 : : }
135 : :
136 : : void
137 : 8056042 : spdk_vlog(enum spdk_log_level level, const char *file, const int line, const char *func,
138 : : const char *format, va_list ap)
139 : : {
140 : 8056042 : int severity = LOG_INFO;
141 : 40159 : char buf[MAX_TMPBUF];
142 : 40159 : char timestamp[64];
143 : :
144 [ + + ]: 8056042 : if (g_log) {
145 : 20 : g_log(level, file, line, func, format, ap);
146 : 730685 : return;
147 : : }
148 : :
149 [ + + + - ]: 8056022 : if (level > g_spdk_log_print_level && level > g_spdk_log_level) {
150 : 739049 : return;
151 : : }
152 : :
153 : 7316973 : severity = spdk_log_to_syslog_level(level);
154 [ - + ]: 7316973 : if (severity < 0) {
155 : 0 : return;
156 : : }
157 : :
158 [ - + ]: 7316973 : vsnprintf(buf, sizeof(buf), format, ap);
159 : :
160 [ + - ]: 7316973 : if (level <= g_spdk_log_print_level) {
161 : 7316973 : get_timestamp_prefix(timestamp, sizeof(timestamp));
162 [ + + ]: 7316973 : if (file) {
163 [ - + - + ]: 7309889 : fprintf(stderr, "%s%s:%4d:%s: *%s*: %s", timestamp, file, line, func, spdk_level_names[level], buf);
164 : : } else {
165 [ - + - + ]: 7084 : fprintf(stderr, "%s%s", timestamp, buf);
166 : : }
167 : : }
168 : :
169 [ + + ]: 7316973 : if (level <= g_spdk_log_level) {
170 [ + + ]: 7302260 : if (file) {
171 : 7296184 : syslog(severity, "%s:%4d:%s: *%s*: %s", file, line, func, spdk_level_names[level], buf);
172 : : } else {
173 : 6076 : syslog(severity, "%s", buf);
174 : : }
175 : : }
176 : : }
177 : :
178 : : void
179 : 0 : spdk_vflog(FILE *fp, const char *file, const int line, const char *func,
180 : : const char *format, va_list ap)
181 : : {
182 : 0 : char buf[MAX_TMPBUF];
183 : 0 : char timestamp[64];
184 : :
185 [ # # ]: 0 : vsnprintf(buf, sizeof(buf), format, ap);
186 : :
187 : 0 : get_timestamp_prefix(timestamp, sizeof(timestamp));
188 : :
189 [ # # ]: 0 : if (file) {
190 [ # # # # ]: 0 : fprintf(fp, "%s%s:%4d:%s: %s", timestamp, file, line, func, buf);
191 : : } else {
192 [ # # # # ]: 0 : fprintf(fp, "%s%s", timestamp, buf);
193 : : }
194 : :
195 : 0 : fflush(fp);
196 : 0 : }
197 : :
198 : : void
199 : 0 : spdk_flog(FILE *fp, const char *file, const int line, const char *func,
200 : : const char *format, ...)
201 : : {
202 : 0 : va_list ap;
203 : :
204 : 0 : va_start(ap, format);
205 : 0 : spdk_vflog(fp, file, line, func, format, ap);
206 : 0 : va_end(ap);
207 : 0 : }
208 : :
209 : : static void
210 : 19 : fdump(FILE *fp, const char *label, const uint8_t *buf, size_t len)
211 : : {
212 : 15 : char tmpbuf[MAX_TMPBUF];
213 : 15 : char buf16[16 + 1];
214 : : size_t total;
215 : : unsigned int idx;
216 : :
217 [ - + ]: 19 : fprintf(fp, "%s\n", label);
218 : :
219 : 19 : memset(buf16, 0, sizeof buf16);
220 : 19 : total = 0;
221 [ + + ]: 406 : for (idx = 0; idx < len; idx++) {
222 [ + + + + ]: 387 : if (idx != 0 && idx % 16 == 0) {
223 : 12 : snprintf(tmpbuf + total, sizeof tmpbuf - total,
224 : : " %s", buf16);
225 : 12 : memset(buf16, 0, sizeof buf16);
226 [ - + ]: 12 : fprintf(fp, "%s\n", tmpbuf);
227 : 12 : total = 0;
228 : : }
229 [ + + ]: 387 : if (idx % 16 == 0) {
230 : 31 : total += snprintf(tmpbuf + total, sizeof tmpbuf - total,
231 : : "%08x ", idx);
232 : : }
233 [ + + ]: 387 : if (idx % 8 == 0) {
234 : 53 : total += snprintf(tmpbuf + total, sizeof tmpbuf - total,
235 : : "%s", " ");
236 : : }
237 : 694 : total += snprintf(tmpbuf + total, sizeof tmpbuf - total,
238 : 387 : "%2.2x ", buf[idx] & 0xff);
239 [ + + ]: 387 : buf16[idx % 16] = isprint(buf[idx]) ? buf[idx] : '.';
240 : : }
241 [ + + ]: 128 : for (; idx % 16 != 0; idx++) {
242 [ + + ]: 109 : if (idx == 8) {
243 : 5 : total += snprintf(tmpbuf + total, sizeof tmpbuf - total,
244 : : " ");
245 : : }
246 : :
247 : 109 : total += snprintf(tmpbuf + total, sizeof tmpbuf - total, " ");
248 : : }
249 : 19 : snprintf(tmpbuf + total, sizeof tmpbuf - total, " %s", buf16);
250 [ - + ]: 19 : fprintf(fp, "%s\n", tmpbuf);
251 : 19 : fflush(fp);
252 : 19 : }
253 : :
254 : : void
255 : 19 : spdk_log_dump(FILE *fp, const char *label, const void *buf, size_t len)
256 : : {
257 : 19 : fdump(fp, label, buf, len);
258 : 19 : }
|