libwebsockets
Lightweight C library for HTML5 websockets
Loading...
Searching...
No Matches
lws-logs.h
Go to the documentation of this file.
1/*
2 * libwebsockets - small server side websockets and web server implementation
3 *
4 * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
23 */
24
39
40#define LLL_ERR (1 << 0)
41#define LLL_WARN (1 << 1)
42#define LLL_NOTICE (1 << 2)
43#define LLL_INFO (1 << 3)
44#define LLL_DEBUG (1 << 4)
45#define LLL_PARSER (1 << 5)
46#define LLL_HEADER (1 << 6)
47#define LLL_EXT (1 << 7)
48#define LLL_CLIENT (1 << 8)
49#define LLL_LATENCY (1 << 9)
50#define LLL_USER (1 << 10)
51#define LLL_THREAD (1 << 11)
52
53#define LLL_COUNT (12) /* set to count of valid flags */
54
55#define LLLF_SECRECY_PII (1 << 16)
57#define LLLF_SECRECY_BEARER (1 << 17)
59
60#define LLLF_LOG_TIMESTAMP (1 << 18)
62#define LLLF_LOG_SPEW_OFF (1 << 19)
67
68#define LLLF_LOG_CONTEXT_AWARE (1 << 30)
71
72struct lws_log_cx;
73
74typedef void (*lws_log_emit_t)(int level, const char *line);
75typedef void (*lws_log_emit_cx_t)(struct lws_log_cx *cx, int level,
76 const char *line, size_t len);
77typedef void (*lws_log_prepend_cx_t)(struct lws_log_cx *cx, void *obj,
78 char **p, char *e);
79typedef void (*lws_log_use_cx_t)(struct lws_log_cx *cx, int _new);
80
81/*
82 * This is the logging context
83 */
84
85typedef struct lws_log_cx {
86 union {
87/* Apparently Qt likes to leave 'emit' defined at the preprocessor */
88#if defined(emit)
89#undef emit
90#endif
91 lws_log_emit_t emit; /* legacy emit function */
92 lws_log_emit_cx_t emit_cx; /* LLLF_LOG_CONTEXT_AWARE */
93 } u;
94
95#if LWS_MAX_SMP > 1
96 pthread_mutex_t refcount_lock;
97#endif
98
108 void *opaque;
110 void *stg;
114 int32_t refcount;
116#if LWS_MAX_SMP > 1
117 char inited;
118#endif
120
131lwsl_timestamp(int level, char *p, size_t len);
132
137
138#define LWS_RATELIMIT_DEFINE_STATIC(_name) \
139 static lws_log_ratelimit_t _name = { 0, 0 }
140
143
145_lws_log_rl(int filter, uint32_t dropped, const char *format, ...) LWS_FORMAT(3);
146
149 int filter, uint32_t dropped, const char *_fun, const char *format, ...) LWS_FORMAT(7);
150
151#if defined(LWS_PLAT_OPTEE) && !defined(LWS_WITH_NETWORK)
152#define _lws_log(aaa, ...) SMSG(__VA_ARGS__)
153#else
155_lws_log(int filter, const char *format, ...) LWS_FORMAT(2);
157_lws_logv(int filter, const char *format, va_list vl);
158#endif
159
160struct lws_vhost;
161struct lws;
162
164lwsl_context_get_cx(struct lws_context *cx);
166lwsl_vhost_get_cx(struct lws_vhost *vh);
168lwsl_wsi_get_cx(struct lws *wsi);
169#if defined(LWS_WITH_SECURE_STREAMS)
170struct lws_ss_handle;
172lwsl_ss_get_cx(struct lws_ss_handle *ss);
173#endif
174#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
175struct lws_sspc_handle;
177lwsl_sspc_get_cx(struct lws_sspc_handle *ss);
178#endif
179
180
182lws_log_emit_cx_file(struct lws_log_cx *cx, int level, const char *line,
183 size_t len);
184
186lws_log_use_cx_file(struct lws_log_cx *cx, int _new);
187
189lws_log_prepend_context(struct lws_log_cx *cx, void *obj, char **p, char *e);
191lws_log_prepend_vhost(struct lws_log_cx *cx, void *obj, char **p, char *e);
193lws_log_prepend_wsi(struct lws_log_cx *cx, void *obj, char **p, char *e);
194#if defined(LWS_WITH_SECURE_STREAMS)
196lws_log_prepend_ss(struct lws_log_cx *cx, void *obj, char **p, char *e);
197#endif
198#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
200lws_log_prepend_sspc(struct lws_log_cx *cx, void *obj, char **p, char *e);
201#endif
202
205 int filter, const char *_fun, const char *format, ...) LWS_FORMAT(6);
206
207#define lwsl_cx(_c, _fil, ...) \
208 _lws_log_cx(lwsl_context_get_cx(_c), lws_log_prepend_context, \
209 _c, _fil, __func__, __VA_ARGS__)
210#define lwsl_vhost(_v, _fil, ...) \
211 _lws_log_cx(lwsl_vhost_get_cx(_v), lws_log_prepend_vhost, _v, \
212 _fil, __func__, __VA_ARGS__)
213#define lwsl_wsi(_w, _fil, ...) \
214 _lws_log_cx(lwsl_wsi_get_cx(_w), lws_log_prepend_wsi, _w, \
215 _fil, __func__, __VA_ARGS__)
216#define lwsl_ss(_h, _fil, ...) \
217 _lws_log_cx(lwsl_ss_get_cx(_h), lws_log_prepend_ss, _h, \
218 _fil, __func__, __VA_ARGS__)
219
220#define lwsl_hexdump_context(_c, _fil, _buf, _len) \
221 lwsl_hexdump_level_cx(lwsl_context_get_cx(_c), \
222 lws_log_prepend_context, \
223 _c, _fil, _buf, _len)
224#define lwsl_hexdump_vhost(_v, _fil, _buf, _len) \
225 lwsl_hexdump_level_cx(lwsl_vhost_get_cx(_v), \
226 lws_log_prepend_vhost, \
227 _v, _fil, _buf, _len)
228#define lwsl_hexdump_wsi(_w, _fil, _buf, _len) \
229 lwsl_hexdump_level_cx(lwsl_wsi_get_cx(_w), \
230 lws_log_prepend_wsi, \
231 _w, _fil, _buf, _len)
232#define lwsl_hexdump_ss(_h, _fil, _buf, _len) \
233 lwsl_hexdump_level_cx(lwsl_ss_get_cx(_h), \
234 lws_log_prepend_ss, \
235 _h, _fil, _buf, _len)
236
237/*
238 * Figure out which logs to build in or not
239 */
240
241#if defined(_DEBUG)
242 /*
243 * In DEBUG build, select all logs unless NO_LOGS
244 */
245 #if defined(LWS_WITH_NO_LOGS)
246 #define _LWS_LINIT (LLL_ERR | LLL_USER)
247 #else
248 #define _LWS_LINIT ((1 << LLL_COUNT) - 1)
249 #endif
250#else /* not _DEBUG */
251#if defined(LWS_WITH_NO_LOGS)
252#define _LWS_LINIT (LLL_ERR | LLL_USER)
253#else
254 #define _LWS_LINIT (LLL_ERR | LLL_USER | LLL_WARN | LLL_NOTICE)
255#endif
256#endif /* _DEBUG */
257
258/*
259 * Create either empty overrides or the ones forced at build-time.
260 * These overrides have the final say... any bits set in
261 * LWS_LOGGING_BITFIELD_SET force the build of those logs, any bits
262 * set in LWS_LOGGING_BITFIELD_CLEAR disable the build of those logs.
263 *
264 * If not defined lws decides based on CMAKE_BUILD_TYPE=DEBUG or not
265 */
266
267#if defined(LWS_LOGGING_BITFIELD_SET)
268 #define _LWS_LBS (LWS_LOGGING_BITFIELD_SET)
269#else
270 #define _LWS_LBS 0
271#endif
272
273#if defined(LWS_LOGGING_BITFIELD_CLEAR)
274 #define _LWS_LBC (LWS_LOGGING_BITFIELD_CLEAR)
275#else
276 #define _LWS_LBC 0
277#endif
278
279/*
280 * Compute the final active logging bitfield for build
281 */
282#define _LWS_ENABLED_LOGS (((_LWS_LINIT) | (_LWS_LBS)) & ~(_LWS_LBC))
283
284/*
285 * Individually enable or disable log levels for build
286 * depending on what was computed
287 */
288
289/*
290 * Process scope logs
291 */
292
293#if (_LWS_ENABLED_LOGS & LLL_ERR)
294#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
295#else
296#define lwsl_err(...) do {} while(0)
297#endif
298
299#if (_LWS_ENABLED_LOGS & LLL_WARN)
300#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
301#else
302#define lwsl_warn(...) do {} while(0)
303#endif
304
305#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
306#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
307#else
308#define lwsl_notice(...) do {} while(0)
309#endif
310
311#if (_LWS_ENABLED_LOGS & LLL_INFO)
312#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
313#else
314#define lwsl_info(...) do {} while(0)
315#endif
316
317#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
318#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
319#else
320#define lwsl_debug(...) do {} while(0)
321#endif
322
323#if (_LWS_ENABLED_LOGS & LLL_PARSER)
324#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
325#else
326#define lwsl_parser(...) do {} while(0)
327#endif
328
329#if (_LWS_ENABLED_LOGS & LLL_HEADER)
330#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
331#else
332#define lwsl_header(...) do {} while(0)
333#endif
334
335#if (_LWS_ENABLED_LOGS & LLL_EXT)
336#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
337#else
338#define lwsl_ext(...) do {} while(0)
339#endif
340
341#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
342#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
343#else
344#define lwsl_client(...) do {} while(0)
345#endif
346
347#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
348#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
349#else
350#define lwsl_latency(...) do {} while(0)
351#endif
352
353#if (_LWS_ENABLED_LOGS & LLL_THREAD)
354#define lwsl_thread(...) _lws_log(LLL_THREAD, __VA_ARGS__)
355#else
356#define lwsl_thread(...) do {} while(0)
357#endif
358
359#if (_LWS_ENABLED_LOGS & LLL_USER)
360#define lwsl_user(...) _lws_log(LLL_USER, __VA_ARGS__)
361#else
362#define lwsl_user(...) do {} while(0)
363#endif
364
365#define lwsl_hexdump_user(...) lwsl_hexdump_level(LLL_USER, __VA_ARGS__)
366#define lwsl_hexdump_err(...) lwsl_hexdump_level(LLL_ERR, __VA_ARGS__)
367#define lwsl_hexdump_warn(...) lwsl_hexdump_level(LLL_WARN, __VA_ARGS__)
368#define lwsl_hexdump_notice(...) lwsl_hexdump_level(LLL_NOTICE, __VA_ARGS__)
369#define lwsl_hexdump_info(...) lwsl_hexdump_level(LLL_INFO, __VA_ARGS__)
370#define lwsl_hexdump_debug(...) lwsl_hexdump_level(LLL_DEBUG, __VA_ARGS__)
371
372/*
373 * lws_context scope logs
374 */
375
376#if (_LWS_ENABLED_LOGS & LLL_ERR)
377#define lwsl_cx_err(_c, ...) lwsl_cx(_c, LLL_ERR, __VA_ARGS__)
378#else
379#define lwsl_cx_err(_c, ...) do {} while(0)
380#endif
381
382#if (_LWS_ENABLED_LOGS & LLL_WARN)
383#define lwsl_cx_warn(_c, ...) lwsl_cx(_c, LLL_WARN, __VA_ARGS__)
384#else
385#define lwsl_cx_warn(_c, ...) do {} while(0)
386#endif
387
388#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
389#define lwsl_cx_notice(_c, ...) lwsl_cx(_c, LLL_NOTICE, __VA_ARGS__)
390#else
391#define lwsl_cx_notice(_c, ...) do {} while(0)
392#endif
393
394#if (_LWS_ENABLED_LOGS & LLL_INFO)
395#define lwsl_cx_info(_c, ...) lwsl_cx(_c, LLL_INFO, __VA_ARGS__)
396#else
397#define lwsl_cx_info(_c, ...) do {} while(0)
398#endif
399
400#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
401#define lwsl_cx_debug(_c, ...) lwsl_cx(_c, LLL_DEBUG, __VA_ARGS__)
402#else
403#define lwsl_cx_debug(_c, ...) do {} while(0)
404#endif
405
406#if (_LWS_ENABLED_LOGS & LLL_PARSER)
407#define lwsl_cx_parser(_c, ...) lwsl_cx(_c, LLL_PARSER, __VA_ARGS__)
408#else
409#define lwsl_cx_parser(_c, ...) do {} while(0)
410#endif
411
412#if (_LWS_ENABLED_LOGS & LLL_HEADER)
413#define lwsl_cx_header(_c, ...) lwsl_cx(_c, LLL_HEADER, __VA_ARGS__)
414#else
415#define lwsl_cx_header(_c, ...) do {} while(0)
416#endif
417
418#if (_LWS_ENABLED_LOGS & LLL_EXT)
419#define lwsl_cx_ext(_c, ...) lwsl_cx(_c, LLL_EXT, __VA_ARGS__)
420#else
421#define lwsl_cx_ext(_c, ...) do {} while(0)
422#endif
423
424#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
425#define lwsl_cx_client(_c, ...) lwsl_cx(_c, LLL_CLIENT, __VA_ARGS__)
426#else
427#define lwsl_cx_client(_c, ...) do {} while(0)
428#endif
429
430#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
431#define lwsl_cx_latency(_c, ...) lwsl_cx(_c, LLL_LATENCY, __VA_ARGS__)
432#else
433#define lwsl_cx_latency(_c, ...) do {} while(0)
434#endif
435
436#if (_LWS_ENABLED_LOGS & LLL_THREAD)
437#define lwsl_cx_thread(_c, ...) lwsl_cx(_c, LLL_THREAD, __VA_ARGS__)
438#else
439#define lwsl_cx_thread(_c, ...) do {} while(0)
440#endif
441
442#if (_LWS_ENABLED_LOGS & LLL_USER)
443#define lwsl_cx_user(_c, ...) lwsl_cx(_c, LLL_USER, __VA_ARGS__)
444#else
445#define lwsl_cx_user(_c, ...) do {} while(0)
446#endif
447
448#define lwsl_hexdump_cx_err(_c, ...) lwsl_hexdump_context(_c, LLL_ERR, __VA_ARGS__)
449#define lwsl_hexdump_cx_warn(_c, ...) lwsl_hexdump_context(_c, LLL_WARN, __VA_ARGS__)
450#define lwsl_hexdump_cx_notice(_c, ...) lwsl_hexdump_context(_c, LLL_NOTICE, __VA_ARGS__)
451#define lwsl_hexdump_cx_info(_c, ...) lwsl_hexdump_context(_c, LLL_INFO, __VA_ARGS__)
452#define lwsl_hexdump_cx_debug(_c, ...) lwsl_hexdump_context(_c, LLL_DEBUG, __VA_ARGS__)
453
454/*
455 * lws_vhost
456 */
457
458#if (_LWS_ENABLED_LOGS & LLL_ERR)
459#define lwsl_vhost_err(_v, ...) lwsl_vhost(_v, LLL_ERR, __VA_ARGS__)
460#else
461#define lwsl_vhost_err(_v, ...) do {} while(0)
462#endif
463
464#if (_LWS_ENABLED_LOGS & LLL_WARN)
465#define lwsl_vhost_warn(_v, ...) lwsl_vhost(_v, LLL_WARN, __VA_ARGS__)
466#else
467#define lwsl_vhost_warn(_v, ...) do {} while(0)
468#endif
469
470#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
471#define lwsl_vhost_notice(_v, ...) lwsl_vhost(_v, LLL_NOTICE, __VA_ARGS__)
472#else
473#define lwsl_vhost_notice(_v, ...) do {} while(0)
474#endif
475
476#if (_LWS_ENABLED_LOGS & LLL_INFO)
477#define lwsl_vhost_info(_v, ...) lwsl_vhost(_v, LLL_INFO, __VA_ARGS__)
478#else
479#define lwsl_vhost_info(_v, ...) do {} while(0)
480#endif
481
482#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
483#define lwsl_vhost_debug(_v, ...) lwsl_vhost(_v, LLL_DEBUG, __VA_ARGS__)
484#else
485#define lwsl_vhost_debug(_v, ...) do {} while(0)
486#endif
487
488#if (_LWS_ENABLED_LOGS & LLL_PARSER)
489#define lwsl_vhost_parser(_v, ...) lwsl_vhost(_v, LLL_PARSER, __VA_ARGS__)
490#else
491#define lwsl_vhost_parser(_v, ...) do {} while(0)
492#endif
493
494#if (_LWS_ENABLED_LOGS & LLL_HEADER)
495#define lwsl_vhost_header(_v, ...) lwsl_vhost(_v, LLL_HEADER, __VA_ARGS__)
496#else
497#define lwsl_vhost_header(_v, ...) do {} while(0)
498#endif
499
500#if (_LWS_ENABLED_LOGS & LLL_EXT)
501#define lwsl_vhost_ext(_v, ...) lwsl_vhost(_v, LLL_EXT, __VA_ARGS__)
502#else
503#define lwsl_vhost_ext(_v, ...) do {} while(0)
504#endif
505
506#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
507#define lwsl_vhost_client(_v, ...) lwsl_vhost(_v, LLL_CLIENT, __VA_ARGS__)
508#else
509#define lwsl_vhost_client(_v, ...) do {} while(0)
510#endif
511
512#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
513#define lwsl_vhost_latency(_v, ...) lwsl_vhost(_v, LLL_LATENCY, __VA_ARGS__)
514#else
515#define lwsl_vhost_latency(_v, ...) do {} while(0)
516#endif
517
518#if (_LWS_ENABLED_LOGS & LLL_THREAD)
519#define lwsl_vhost_thread(_v, ...) lwsl_vhost(_v, LLL_THREAD, __VA_ARGS__)
520#else
521#define lwsl_vhost_thread(_v, ...) do {} while(0)
522#endif
523
524#if (_LWS_ENABLED_LOGS & LLL_USER)
525#define lwsl_vhost_user(_v, ...) lwsl_vhost(_v, LLL_USER, __VA_ARGS__)
526#else
527#define lwsl_vhost_user(_v, ...) do {} while(0)
528#endif
529
530#define lwsl_hexdump_vhost_err(_v, ...) lwsl_hexdump_vhost(_v, LLL_ERR, __VA_ARGS__)
531#define lwsl_hexdump_vhost_warn(_v, ...) lwsl_hexdump_vhost(_v, LLL_WARN, __VA_ARGS__)
532#define lwsl_hexdump_vhost_notice(_v, ...) lwsl_hexdump_vhost(_v, LLL_NOTICE, __VA_ARGS__)
533#define lwsl_hexdump_vhost_info(_v, ...) lwsl_hexdump_vhost(_v, LLL_INFO, __VA_ARGS__)
534#define lwsl_hexdump_vhost_debug(_v, ...) lwsl_hexdump_vhost(_v, LLL_DEBUG, __VA_ARGS__)
535
536
537/*
538 * lws_wsi
539 */
540
541#if (_LWS_ENABLED_LOGS & LLL_ERR)
542#define lwsl_wsi_err(_w, ...) lwsl_wsi(_w, LLL_ERR, __VA_ARGS__)
543#else
544#define lwsl_wsi_err(_w, ...) do {} while(0)
545#endif
546
547#if (_LWS_ENABLED_LOGS & LLL_WARN)
548#define lwsl_wsi_warn(_w, ...) lwsl_wsi(_w, LLL_WARN, __VA_ARGS__)
549#else
550#define lwsl_wsi_warn(_w, ...) do {} while(0)
551#endif
552
553#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
554#define lwsl_wsi_notice(_w, ...) lwsl_wsi(_w, LLL_NOTICE, __VA_ARGS__)
555#else
556#define lwsl_wsi_notice(_w, ...) do {} while(0)
557#endif
558
559#if (_LWS_ENABLED_LOGS & LLL_INFO)
560#define lwsl_wsi_info(_w, ...) lwsl_wsi(_w, LLL_INFO, __VA_ARGS__)
561#else
562#define lwsl_wsi_info(_w, ...) do {} while(0)
563#endif
564
565#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
566#define lwsl_wsi_debug(_w, ...) lwsl_wsi(_w, LLL_DEBUG, __VA_ARGS__)
567#else
568#define lwsl_wsi_debug(_w, ...) do {} while(0)
569#endif
570
571#if (_LWS_ENABLED_LOGS & LLL_PARSER)
572#define lwsl_wsi_parser(_w, ...) lwsl_wsi(_w, LLL_PARSER, __VA_ARGS__)
573#else
574#define lwsl_wsi_parser(_w, ...) do {} while(0)
575#endif
576
577#if (_LWS_ENABLED_LOGS & LLL_HEADER)
578#define lwsl_wsi_header(_w, ...) lwsl_wsi(_w, LLL_HEADER, __VA_ARGS__)
579#else
580#define lwsl_wsi_header(_w, ...) do {} while(0)
581#endif
582
583#if (_LWS_ENABLED_LOGS & LLL_EXT)
584#define lwsl_wsi_ext(_w, ...) lwsl_wsi(_w, LLL_EXT, __VA_ARGS__)
585#else
586#define lwsl_wsi_ext(_w, ...) do {} while(0)
587#endif
588
589#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
590#define lwsl_wsi_client(_w, ...) lwsl_wsi(_w, LLL_CLIENT, __VA_ARGS__)
591#else
592#define lwsl_wsi_client(_w, ...) do {} while(0)
593#endif
594
595#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
596#define lwsl_wsi_latency(_w, ...) lwsl_wsi(_w, LLL_LATENCY, __VA_ARGS__)
597#else
598#define lwsl_wsi_latency(_w, ...) do {} while(0)
599#endif
600
601#if (_LWS_ENABLED_LOGS & LLL_THREAD)
602#define lwsl_wsi_thread(_w, ...) lwsl_wsi(_w, LLL_THREAD, __VA_ARGS__)
603#else
604#define lwsl_wsi_thread(_w, ...) do {} while(0)
605#endif
606
607#if (_LWS_ENABLED_LOGS & LLL_USER)
608#define lwsl_wsi_user(_w, ...) lwsl_wsi(_w, LLL_USER, __VA_ARGS__)
609#else
610#define lwsl_wsi_user(_w, ...) do {} while(0)
611#endif
612
613#define lwsl_hexdump_wsi_err(_v, ...) lwsl_hexdump_wsi(_v, LLL_ERR, __VA_ARGS__)
614#define lwsl_hexdump_wsi_warn(_v, ...) lwsl_hexdump_wsi(_v, LLL_WARN, __VA_ARGS__)
615#define lwsl_hexdump_wsi_notice(_v, ...) lwsl_hexdump_wsi(_v, LLL_NOTICE, __VA_ARGS__)
616#define lwsl_hexdump_wsi_info(_v, ...) lwsl_hexdump_wsi(_v, LLL_INFO, __VA_ARGS__)
617#define lwsl_hexdump_wsi_debug(_v, ...) lwsl_hexdump_wsi(_v, LLL_DEBUG, __VA_ARGS__)
618#define lwsl_hexdump_wsi_user(_v, ...) lwsl_hexdump_wsi(_v, LLL_USER, __VA_ARGS__)
619
620
621
622/*
623 * lwsl_ss
624 */
625
626#if (_LWS_ENABLED_LOGS & LLL_ERR)
627#define lwsl_ss_err(_w, ...) lwsl_ss(_w, LLL_ERR, __VA_ARGS__)
628#else
629#define lwsl_ss_err(_w, ...) do {} while(0)
630#endif
631
632#if (_LWS_ENABLED_LOGS & LLL_WARN)
633#define lwsl_ss_warn(_w, ...) lwsl_ss(_w, LLL_WARN, __VA_ARGS__)
634#else
635#define lwsl_ss_warn(_w, ...) do {} while(0)
636#endif
637
638#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
639#define lwsl_ss_notice(_w, ...) lwsl_ss(_w, LLL_NOTICE, __VA_ARGS__)
640#else
641#define lwsl_ss_notice(_w, ...) do {} while(0)
642#endif
643
644#if (_LWS_ENABLED_LOGS & LLL_INFO)
645#define lwsl_ss_info(_w, ...) lwsl_ss(_w, LLL_INFO, __VA_ARGS__)
646#else
647#define lwsl_ss_info(_w, ...) do {} while(0)
648#endif
649
650#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
651#define lwsl_ss_debug(_w, ...) lwsl_ss(_w, LLL_DEBUG, __VA_ARGS__)
652#else
653#define lwsl_ss_debug(_w, ...) do {} while(0)
654#endif
655
656#if (_LWS_ENABLED_LOGS & LLL_PARSER)
657#define lwsl_ss_parser(_w, ...) lwsl_ss(_w, LLL_PARSER, __VA_ARGS__)
658#else
659#define lwsl_ss_parser(_w, ...) do {} while(0)
660#endif
661
662#if (_LWS_ENABLED_LOGS & LLL_HEADER)
663#define lwsl_ss_header(_w, ...) lwsl_ss(_w, LLL_HEADER, __VA_ARGS__)
664#else
665#define lwsl_ss_header(_w, ...) do {} while(0)
666#endif
667
668#if (_LWS_ENABLED_LOGS & LLL_EXT)
669#define lwsl_ss_ext(_w, ...) lwsl_ss(_w, LLL_EXT, __VA_ARGS__)
670#else
671#define lwsl_ss_ext(_w, ...) do {} while(0)
672#endif
673
674#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
675#define lwsl_ss_client(_w, ...) lwsl_ss(_w, LLL_CLIENT, __VA_ARGS__)
676#else
677#define lwsl_ss_client(_w, ...) do {} while(0)
678#endif
679
680#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
681#define lwsl_ss_latency(_w, ...) lwsl_ss(_w, LLL_LATENCY, __VA_ARGS__)
682#else
683#define lwsl_ss_latency(_w, ...) do {} while(0)
684#endif
685
686#if (_LWS_ENABLED_LOGS & LLL_THREAD)
687#define lwsl_ss_thread(_w, ...) lwsl_ss(_w, LLL_THREAD, __VA_ARGS__)
688#else
689#define lwsl_ss_thread(_w, ...) do {} while(0)
690#endif
691
692#if (_LWS_ENABLED_LOGS & LLL_USER)
693#define lwsl_ss_user(_w, ...) lwsl_ss(_w, LLL_USER, __VA_ARGS__)
694#else
695#define lwsl_ss_user(_w, ...) do {} while(0)
696#endif
697
698#define lwsl_hexdump_ss_err(_v, ...) lwsl_hexdump_ss(_v, LLL_ERR, __VA_ARGS__)
699#define lwsl_hexdump_ss_warn(_v, ...) lwsl_hexdump_ss(_v, LLL_WARN, __VA_ARGS__)
700#define lwsl_hexdump_ss_notice(_v, ...) lwsl_hexdump_ss(_v, LLL_NOTICE, __VA_ARGS__)
701#define lwsl_hexdump_ss_info(_v, ...) lwsl_hexdump_ss(_v, LLL_INFO, __VA_ARGS__)
702#define lwsl_hexdump_ss_debug(_v, ...) lwsl_hexdump_ss(_v, LLL_DEBUG, __VA_ARGS__)
703
704
705
717lwsl_hexdump_level(int level, const void *vbuf, size_t len);
718
721 int hexdump_level, const void *vbuf, size_t len);
722
734lwsl_hexdump(const void *buf, size_t len);
735
739static LWS_INLINE int lws_is_be(void) {
740 const int probe = ~0xff;
741
742 return *(const char *)&probe;
743}
744
765lws_set_log_level(int level, lws_log_emit_t log_emit_function);
766
787lws_log_spew_tail_lines(unsigned int lines);
788
799lwsl_emit_syslog(int level, const char *line);
800
815lwsl_emit_stderr(int level, const char *line);
816
829lwsl_emit_stderr_notimestamp(int level, const char *line);
830
841lwsl_visible(int level);
842
843struct lws;
844
845LWS_VISIBLE LWS_EXTERN const char *
846lws_wsi_tag(struct lws *wsi);
847
850
852
853/*
854 * Ratelimited process scope logs
855 */
856
857#if (_LWS_ENABLED_LOGS & LLL_ERR)
858#define lwsl_ratelimit_err(_rl, _i, ...) \
859 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
860 _lws_log_rl(LLL_ERR, _c, __VA_ARGS__); } while(0)
861#else
862#define lwsl_ratelimit_err(_rl, _i, ...) do {} while(0)
863#endif
864
865#if (_LWS_ENABLED_LOGS & LLL_WARN)
866#define lwsl_ratelimit_warn(_rl, _i, ...) \
867 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
868 _lws_log_rl(LLL_WARN, _c, __VA_ARGS__); } while(0)
869#else
870#define lwsl_ratelimit_warn(_rl, _i, ...) do {} while(0)
871#endif
872
873#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
874#define lwsl_ratelimit_notice(_rl, _i, ...) \
875 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
876 _lws_log_rl(LLL_NOTICE, _c, __VA_ARGS__); } while(0)
877#else
878#define lwsl_ratelimit_notice(_rl, _i, ...) do {} while(0)
879#endif
880
881#if (_LWS_ENABLED_LOGS & LLL_INFO)
882#define lwsl_ratelimit_info(_rl, _i, ...) \
883 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
884 _lws_log_rl(LLL_INFO, _c, __VA_ARGS__); } while(0)
885#else
886#define lwsl_ratelimit_info(_rl, _i, ...) do {} while(0)
887#endif
888
889#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
890#define lwsl_ratelimit_debug(_rl, _i, ...) \
891 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
892 _lws_log_rl(LLL_DEBUG, _c, __VA_ARGS__); } while(0)
893#else
894#define lwsl_ratelimit_debug(_rl, _i, ...) do {} while(0)
895#endif
896
897#if (_LWS_ENABLED_LOGS & LLL_PARSER)
898#define lwsl_ratelimit_parser(_rl, _i, ...) \
899 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
900 _lws_log_rl(LLL_PARSER, _c, __VA_ARGS__); } while(0)
901#else
902#define lwsl_ratelimit_parser(_rl, _i, ...) do {} while(0)
903#endif
904
905#if (_LWS_ENABLED_LOGS & LLL_HEADER)
906#define lwsl_ratelimit_header(_rl, _i, ...) \
907 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
908 _lws_log_rl(LLL_HEADER, _c, __VA_ARGS__); } while(0)
909#else
910#define lwsl_ratelimit_header(_rl, _i, ...) do {} while(0)
911#endif
912
913#if (_LWS_ENABLED_LOGS & LLL_EXT)
914#define lwsl_ratelimit_ext(_rl, _i, ...) \
915 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
916 _lws_log_rl(LLL_EXT, _c, __VA_ARGS__); } while(0)
917#else
918#define lwsl_ratelimit_ext(_rl, _i, ...) do {} while(0)
919#endif
920
921#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
922#define lwsl_ratelimit_client(_rl, _i, ...) \
923 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
924 _lws_log_rl(LLL_CLIENT, _c, __VA_ARGS__); } while(0)
925#else
926#define lwsl_ratelimit_client(_rl, _i, ...) do {} while(0)
927#endif
928
929#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
930#define lwsl_ratelimit_latency(_rl, _i, ...) \
931 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
932 _lws_log_rl(LLL_LATENCY, _c, __VA_ARGS__); } while(0)
933#else
934#define lwsl_ratelimit_latency(_rl, _i, ...) do {} while(0)
935#endif
936
937#if (_LWS_ENABLED_LOGS & LLL_THREAD)
938#define lwsl_ratelimit_thread(_rl, _i, ...) \
939 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
940 _lws_log_rl(LLL_THREAD, _c, __VA_ARGS__); } while(0)
941#else
942#define lwsl_ratelimit_thread(_rl, _i, ...) do {} while(0)
943#endif
944
945#if (_LWS_ENABLED_LOGS & LLL_USER)
946#define lwsl_ratelimit_user(_rl, _i, ...) \
947 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
948 _lws_log_rl(LLL_USER, _c, __VA_ARGS__); } while(0)
949#else
950#define lwsl_ratelimit_user(_rl, _i, ...) do {} while(0)
951#endif
952
953/*
954 * Ratelimited lws_context scope logs
955 */
956
957#if (_LWS_ENABLED_LOGS & LLL_ERR)
958#define lwsl_ratelimit_cx_err(_rl, _i, _o, ...) \
959 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
960 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_ERR, _c, __func__, __VA_ARGS__); } while(0)
961#else
962#define lwsl_ratelimit_cx_err(_rl, _i, _o, ...) do {} while(0)
963#endif
964
965#if (_LWS_ENABLED_LOGS & LLL_WARN)
966#define lwsl_ratelimit_cx_warn(_rl, _i, _o, ...) \
967 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
968 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_WARN, _c, __func__, __VA_ARGS__); } while(0)
969#else
970#define lwsl_ratelimit_cx_warn(_rl, _i, _o, ...) do {} while(0)
971#endif
972
973#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
974#define lwsl_ratelimit_cx_notice(_rl, _i, _o, ...) \
975 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
976 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_NOTICE, _c, __func__, __VA_ARGS__); } while(0)
977#else
978#define lwsl_ratelimit_cx_notice(_rl, _i, _o, ...) do {} while(0)
979#endif
980
981#if (_LWS_ENABLED_LOGS & LLL_INFO)
982#define lwsl_ratelimit_cx_info(_rl, _i, _o, ...) \
983 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
984 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_INFO, _c, __func__, __VA_ARGS__); } while(0)
985#else
986#define lwsl_ratelimit_cx_info(_rl, _i, _o, ...) do {} while(0)
987#endif
988
989#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
990#define lwsl_ratelimit_cx_debug(_rl, _i, _o, ...) \
991 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
992 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_DEBUG, _c, __func__, __VA_ARGS__); } while(0)
993#else
994#define lwsl_ratelimit_cx_debug(_rl, _i, _o, ...) do {} while(0)
995#endif
996
997#if (_LWS_ENABLED_LOGS & LLL_PARSER)
998#define lwsl_ratelimit_cx_parser(_rl, _i, _o, ...) \
999 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1000 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_PARSER, _c, __func__, __VA_ARGS__); } while(0)
1001#else
1002#define lwsl_ratelimit_cx_parser(_rl, _i, _o, ...) do {} while(0)
1003#endif
1004
1005#if (_LWS_ENABLED_LOGS & LLL_HEADER)
1006#define lwsl_ratelimit_cx_header(_rl, _i, _o, ...) \
1007 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1008 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_HEADER, _c, __func__, __VA_ARGS__); } while(0)
1009#else
1010#define lwsl_ratelimit_cx_header(_rl, _i, _o, ...) do {} while(0)
1011#endif
1012
1013#if (_LWS_ENABLED_LOGS & LLL_EXT)
1014#define lwsl_ratelimit_cx_ext(_rl, _i, _o, ...) \
1015 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1016 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_EXT, _c, __func__, __VA_ARGS__); } while(0)
1017#else
1018#define lwsl_ratelimit_cx_ext(_rl, _i, _o, ...) do {} while(0)
1019#endif
1020
1021#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
1022#define lwsl_ratelimit_cx_client(_rl, _i, _o, ...) \
1023 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1024 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_CLIENT, _c, __func__, __VA_ARGS__); } while(0)
1025#else
1026#define lwsl_ratelimit_cx_client(_rl, _i, _o, ...) do {} while(0)
1027#endif
1028
1029#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
1030#define lwsl_ratelimit_cx_latency(_rl, _i, _o, ...) \
1031 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1032 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_LATENCY, _c, __func__, __VA_ARGS__); } while(0)
1033#else
1034#define lwsl_ratelimit_cx_latency(_rl, _i, _o, ...) do {} while(0)
1035#endif
1036
1037#if (_LWS_ENABLED_LOGS & LLL_THREAD)
1038#define lwsl_ratelimit_cx_thread(_rl, _i, _o, ...) \
1039 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1040 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_THREAD, _c, __func__, __VA_ARGS__); } while(0)
1041#else
1042#define lwsl_ratelimit_cx_thread(_rl, _i, _o, ...) do {} while(0)
1043#endif
1044
1045#if (_LWS_ENABLED_LOGS & LLL_USER)
1046#define lwsl_ratelimit_cx_user(_rl, _i, _o, ...) \
1047 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1048 _lws_log_cx_rl(lwsl_context_get_cx(_o), lws_log_prepend_context, _o, LLL_USER, _c, __func__, __VA_ARGS__); } while(0)
1049#else
1050#define lwsl_ratelimit_cx_user(_rl, _i, _o, ...) do {} while(0)
1051#endif
1052
1053/*
1054 * Ratelimited lws_vhost scope logs
1055 */
1056
1057#if (_LWS_ENABLED_LOGS & LLL_ERR)
1058#define lwsl_ratelimit_vhost_err(_rl, _i, _o, ...) \
1059 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1060 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_ERR, _c, __func__, __VA_ARGS__); } while(0)
1061#else
1062#define lwsl_ratelimit_vhost_err(_rl, _i, _o, ...) do {} while(0)
1063#endif
1064
1065#if (_LWS_ENABLED_LOGS & LLL_WARN)
1066#define lwsl_ratelimit_vhost_warn(_rl, _i, _o, ...) \
1067 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1068 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_WARN, _c, __func__, __VA_ARGS__); } while(0)
1069#else
1070#define lwsl_ratelimit_vhost_warn(_rl, _i, _o, ...) do {} while(0)
1071#endif
1072
1073#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
1074#define lwsl_ratelimit_vhost_notice(_rl, _i, _o, ...) \
1075 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1076 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_NOTICE, _c, __func__, __VA_ARGS__); } while(0)
1077#else
1078#define lwsl_ratelimit_vhost_notice(_rl, _i, _o, ...) do {} while(0)
1079#endif
1080
1081#if (_LWS_ENABLED_LOGS & LLL_INFO)
1082#define lwsl_ratelimit_vhost_info(_rl, _i, _o, ...) \
1083 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1084 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_INFO, _c, __func__, __VA_ARGS__); } while(0)
1085#else
1086#define lwsl_ratelimit_vhost_info(_rl, _i, _o, ...) do {} while(0)
1087#endif
1088
1089#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
1090#define lwsl_ratelimit_vhost_debug(_rl, _i, _o, ...) \
1091 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1092 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_DEBUG, _c, __func__, __VA_ARGS__); } while(0)
1093#else
1094#define lwsl_ratelimit_vhost_debug(_rl, _i, _o, ...) do {} while(0)
1095#endif
1096
1097#if (_LWS_ENABLED_LOGS & LLL_PARSER)
1098#define lwsl_ratelimit_vhost_parser(_rl, _i, _o, ...) \
1099 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1100 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_PARSER, _c, __func__, __VA_ARGS__); } while(0)
1101#else
1102#define lwsl_ratelimit_vhost_parser(_rl, _i, _o, ...) do {} while(0)
1103#endif
1104
1105#if (_LWS_ENABLED_LOGS & LLL_HEADER)
1106#define lwsl_ratelimit_vhost_header(_rl, _i, _o, ...) \
1107 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1108 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_HEADER, _c, __func__, __VA_ARGS__); } while(0)
1109#else
1110#define lwsl_ratelimit_vhost_header(_rl, _i, _o, ...) do {} while(0)
1111#endif
1112
1113#if (_LWS_ENABLED_LOGS & LLL_EXT)
1114#define lwsl_ratelimit_vhost_ext(_rl, _i, _o, ...) \
1115 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1116 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_EXT, _c, __func__, __VA_ARGS__); } while(0)
1117#else
1118#define lwsl_ratelimit_vhost_ext(_rl, _i, _o, ...) do {} while(0)
1119#endif
1120
1121#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
1122#define lwsl_ratelimit_vhost_client(_rl, _i, _o, ...) \
1123 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1124 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_CLIENT, _c, __func__, __VA_ARGS__); } while(0)
1125#else
1126#define lwsl_ratelimit_vhost_client(_rl, _i, _o, ...) do {} while(0)
1127#endif
1128
1129#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
1130#define lwsl_ratelimit_vhost_latency(_rl, _i, _o, ...) \
1131 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1132 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_LATENCY, _c, __func__, __VA_ARGS__); } while(0)
1133#else
1134#define lwsl_ratelimit_vhost_latency(_rl, _i, _o, ...) do {} while(0)
1135#endif
1136
1137#if (_LWS_ENABLED_LOGS & LLL_THREAD)
1138#define lwsl_ratelimit_vhost_thread(_rl, _i, _o, ...) \
1139 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1140 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_THREAD, _c, __func__, __VA_ARGS__); } while(0)
1141#else
1142#define lwsl_ratelimit_vhost_thread(_rl, _i, _o, ...) do {} while(0)
1143#endif
1144
1145#if (_LWS_ENABLED_LOGS & LLL_USER)
1146#define lwsl_ratelimit_vhost_user(_rl, _i, _o, ...) \
1147 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1148 _lws_log_cx_rl(lwsl_vhost_get_cx(_o), lws_log_prepend_vhost, _o, LLL_USER, _c, __func__, __VA_ARGS__); } while(0)
1149#else
1150#define lwsl_ratelimit_vhost_user(_rl, _i, _o, ...) do {} while(0)
1151#endif
1152
1153/*
1154 * Ratelimited lws_wsi scope logs
1155 */
1156
1157#if (_LWS_ENABLED_LOGS & LLL_ERR)
1158#define lwsl_ratelimit_wsi_err(_rl, _i, _o, ...) \
1159 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1160 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_ERR, _c, __func__, __VA_ARGS__); } while(0)
1161#else
1162#define lwsl_ratelimit_wsi_err(_rl, _i, _o, ...) do {} while(0)
1163#endif
1164
1165#if (_LWS_ENABLED_LOGS & LLL_WARN)
1166#define lwsl_ratelimit_wsi_warn(_rl, _i, _o, ...) \
1167 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1168 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_WARN, _c, __func__, __VA_ARGS__); } while(0)
1169#else
1170#define lwsl_ratelimit_wsi_warn(_rl, _i, _o, ...) do {} while(0)
1171#endif
1172
1173#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
1174#define lwsl_ratelimit_wsi_notice(_rl, _i, _o, ...) \
1175 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1176 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_NOTICE, _c, __func__, __VA_ARGS__); } while(0)
1177#else
1178#define lwsl_ratelimit_wsi_notice(_rl, _i, _o, ...) do {} while(0)
1179#endif
1180
1181#if (_LWS_ENABLED_LOGS & LLL_INFO)
1182#define lwsl_ratelimit_wsi_info(_rl, _i, _o, ...) \
1183 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1184 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_INFO, _c, __func__, __VA_ARGS__); } while(0)
1185#else
1186#define lwsl_ratelimit_wsi_info(_rl, _i, _o, ...) do {} while(0)
1187#endif
1188
1189#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
1190#define lwsl_ratelimit_wsi_debug(_rl, _i, _o, ...) \
1191 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1192 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_DEBUG, _c, __func__, __VA_ARGS__); } while(0)
1193#else
1194#define lwsl_ratelimit_wsi_debug(_rl, _i, _o, ...) do {} while(0)
1195#endif
1196
1197#if (_LWS_ENABLED_LOGS & LLL_PARSER)
1198#define lwsl_ratelimit_wsi_parser(_rl, _i, _o, ...) \
1199 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1200 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_PARSER, _c, __func__, __VA_ARGS__); } while(0)
1201#else
1202#define lwsl_ratelimit_wsi_parser(_rl, _i, _o, ...) do {} while(0)
1203#endif
1204
1205#if (_LWS_ENABLED_LOGS & LLL_HEADER)
1206#define lwsl_ratelimit_wsi_header(_rl, _i, _o, ...) \
1207 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1208 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_HEADER, _c, __func__, __VA_ARGS__); } while(0)
1209#else
1210#define lwsl_ratelimit_wsi_header(_rl, _i, _o, ...) do {} while(0)
1211#endif
1212
1213#if (_LWS_ENABLED_LOGS & LLL_EXT)
1214#define lwsl_ratelimit_wsi_ext(_rl, _i, _o, ...) \
1215 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1216 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_EXT, _c, __func__, __VA_ARGS__); } while(0)
1217#else
1218#define lwsl_ratelimit_wsi_ext(_rl, _i, _o, ...) do {} while(0)
1219#endif
1220
1221#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
1222#define lwsl_ratelimit_wsi_client(_rl, _i, _o, ...) \
1223 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1224 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_CLIENT, _c, __func__, __VA_ARGS__); } while(0)
1225#else
1226#define lwsl_ratelimit_wsi_client(_rl, _i, _o, ...) do {} while(0)
1227#endif
1228
1229#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
1230#define lwsl_ratelimit_wsi_latency(_rl, _i, _o, ...) \
1231 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1232 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_LATENCY, _c, __func__, __VA_ARGS__); } while(0)
1233#else
1234#define lwsl_ratelimit_wsi_latency(_rl, _i, _o, ...) do {} while(0)
1235#endif
1236
1237#if (_LWS_ENABLED_LOGS & LLL_THREAD)
1238#define lwsl_ratelimit_wsi_thread(_rl, _i, _o, ...) \
1239 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1240 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_THREAD, _c, __func__, __VA_ARGS__); } while(0)
1241#else
1242#define lwsl_ratelimit_wsi_thread(_rl, _i, _o, ...) do {} while(0)
1243#endif
1244
1245#if (_LWS_ENABLED_LOGS & LLL_USER)
1246#define lwsl_ratelimit_wsi_user(_rl, _i, _o, ...) \
1247 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1248 _lws_log_cx_rl(lwsl_wsi_get_cx(_o), lws_log_prepend_wsi, _o, LLL_USER, _c, __func__, __VA_ARGS__); } while(0)
1249#else
1250#define lwsl_ratelimit_wsi_user(_rl, _i, _o, ...) do {} while(0)
1251#endif
1252
1253/*
1254 * Ratelimited lws_ss scope logs
1255 */
1256
1257#if (_LWS_ENABLED_LOGS & LLL_ERR)
1258#define lwsl_ratelimit_ss_err(_rl, _i, _o, ...) \
1259 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1260 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_ERR, _c, __func__, __VA_ARGS__); } while(0)
1261#else
1262#define lwsl_ratelimit_ss_err(_rl, _i, _o, ...) do {} while(0)
1263#endif
1264
1265#if (_LWS_ENABLED_LOGS & LLL_WARN)
1266#define lwsl_ratelimit_ss_warn(_rl, _i, _o, ...) \
1267 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1268 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_WARN, _c, __func__, __VA_ARGS__); } while(0)
1269#else
1270#define lwsl_ratelimit_ss_warn(_rl, _i, _o, ...) do {} while(0)
1271#endif
1272
1273#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
1274#define lwsl_ratelimit_ss_notice(_rl, _i, _o, ...) \
1275 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1276 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_NOTICE, _c, __func__, __VA_ARGS__); } while(0)
1277#else
1278#define lwsl_ratelimit_ss_notice(_rl, _i, _o, ...) do {} while(0)
1279#endif
1280
1281#if (_LWS_ENABLED_LOGS & LLL_INFO)
1282#define lwsl_ratelimit_ss_info(_rl, _i, _o, ...) \
1283 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1284 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_INFO, _c, __func__, __VA_ARGS__); } while(0)
1285#else
1286#define lwsl_ratelimit_ss_info(_rl, _i, _o, ...) do {} while(0)
1287#endif
1288
1289#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
1290#define lwsl_ratelimit_ss_debug(_rl, _i, _o, ...) \
1291 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1292 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_DEBUG, _c, __func__, __VA_ARGS__); } while(0)
1293#else
1294#define lwsl_ratelimit_ss_debug(_rl, _i, _o, ...) do {} while(0)
1295#endif
1296
1297#if (_LWS_ENABLED_LOGS & LLL_PARSER)
1298#define lwsl_ratelimit_ss_parser(_rl, _i, _o, ...) \
1299 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1300 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_PARSER, _c, __func__, __VA_ARGS__); } while(0)
1301#else
1302#define lwsl_ratelimit_ss_parser(_rl, _i, _o, ...) do {} while(0)
1303#endif
1304
1305#if (_LWS_ENABLED_LOGS & LLL_HEADER)
1306#define lwsl_ratelimit_ss_header(_rl, _i, _o, ...) \
1307 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1308 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_HEADER, _c, __func__, __VA_ARGS__); } while(0)
1309#else
1310#define lwsl_ratelimit_ss_header(_rl, _i, _o, ...) do {} while(0)
1311#endif
1312
1313#if (_LWS_ENABLED_LOGS & LLL_EXT)
1314#define lwsl_ratelimit_ss_ext(_rl, _i, _o, ...) \
1315 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1316 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_EXT, _c, __func__, __VA_ARGS__); } while(0)
1317#else
1318#define lwsl_ratelimit_ss_ext(_rl, _i, _o, ...) do {} while(0)
1319#endif
1320
1321#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
1322#define lwsl_ratelimit_ss_client(_rl, _i, _o, ...) \
1323 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1324 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_CLIENT, _c, __func__, __VA_ARGS__); } while(0)
1325#else
1326#define lwsl_ratelimit_ss_client(_rl, _i, _o, ...) do {} while(0)
1327#endif
1328
1329#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
1330#define lwsl_ratelimit_ss_latency(_rl, _i, _o, ...) \
1331 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1332 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_LATENCY, _c, __func__, __VA_ARGS__); } while(0)
1333#else
1334#define lwsl_ratelimit_ss_latency(_rl, _i, _o, ...) do {} while(0)
1335#endif
1336
1337#if (_LWS_ENABLED_LOGS & LLL_THREAD)
1338#define lwsl_ratelimit_ss_thread(_rl, _i, _o, ...) \
1339 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1340 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_THREAD, _c, __func__, __VA_ARGS__); } while(0)
1341#else
1342#define lwsl_ratelimit_ss_thread(_rl, _i, _o, ...) do {} while(0)
1343#endif
1344
1345#if (_LWS_ENABLED_LOGS & LLL_USER)
1346#define lwsl_ratelimit_ss_user(_rl, _i, _o, ...) \
1347 do { uint32_t _c = lws_log_ratelimit_check(_rl, _i); if (_c) \
1348 _lws_log_cx_rl(lwsl_ss_get_cx(_o), lws_log_prepend_ss, _o, LLL_USER, _c, __func__, __VA_ARGS__); } while(0)
1349#else
1350#define lwsl_ratelimit_ss_user(_rl, _i, _o, ...) do {} while(0)
1351#endif
uint32_t dropped
Definition lws-logs.h:135
lws_log_emit_t emit
lws_log_emit_cx_t emit_cx
int64_t next_log_us
Definition lws-logs.h:134
LWS_VISIBLE LWS_EXTERN void lwsl_hexdump_level(int level, const void *vbuf, size_t len)
LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format,...) LWS_FORMAT(2)
LWS_VISIBLE LWS_EXTERN int lwsl_visible(int level)
LWS_VISIBLE LWS_EXTERN void lws_log_prepend_vhost(struct lws_log_cx *cx, void *obj, char **p, char *e)
LWS_VISIBLE LWS_EXTERN void lws_set_log_level(int level, lws_log_emit_t log_emit_function)
LWS_VISIBLE LWS_EXTERN int lwsl_timestamp(int level, char *p, size_t len)
LWS_VISIBLE LWS_EXTERN void lwsl_emit_stderr_notimestamp(int level, const char *line)
LWS_VISIBLE LWS_EXTERN void _lws_log_rl(int filter, uint32_t dropped, const char *format,...) LWS_FORMAT(3)
struct lws_log_cx lws_log_cx_t
LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(const void *buf, size_t len)
LWS_VISIBLE LWS_EXTERN void lws_log_emit_cx_file(struct lws_log_cx *cx, int level, const char *line, size_t len)
LWS_VISIBLE LWS_EXTERN uint32_t lws_log_ratelimit_check(lws_log_ratelimit_t *rl, int64_t interval_us)
LWS_VISIBLE LWS_EXTERN struct lws_log_cx * lwsl_context_get_cx(struct lws_context *cx)
LWS_VISIBLE LWS_EXTERN const char * lws_wsi_tag(struct lws *wsi)
LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl)
LWS_VISIBLE LWS_EXTERN void lwsl_hexdump_level_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj, int hexdump_level, const void *vbuf, size_t len)
LWS_VISIBLE LWS_EXTERN struct lws_log_cx * lwsl_wsi_get_cx(struct lws *wsi)
LWS_VISIBLE LWS_EXTERN void _lws_log_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj, int filter, const char *_fun, const char *format,...) LWS_FORMAT(6)
LWS_VISIBLE LWS_EXTERN void lwsl_emit_stderr(int level, const char *line)
LWS_VISIBLE LWS_EXTERN void lws_log_spew_tail_lines(unsigned int lines)
void(* lws_log_prepend_cx_t)(struct lws_log_cx *cx, void *obj, char **p, char *e)
Definition lws-logs.h:77
LWS_VISIBLE LWS_EXTERN void lwsl_emit_syslog(int level, const char *line)
LWS_VISIBLE LWS_EXTERN void lws_log_prepend_wsi(struct lws_log_cx *cx, void *obj, char **p, char *e)
void(* lws_log_use_cx_t)(struct lws_log_cx *cx, int _new)
Definition lws-logs.h:79
void(* lws_log_emit_t)(int level, const char *line)
Definition lws-logs.h:74
struct lws_log_ratelimit lws_log_ratelimit_t
LWS_VISIBLE LWS_EXTERN void lws_log_use_cx_file(struct lws_log_cx *cx, int _new)
LWS_VISIBLE LWS_EXTERN void lws_log_prepend_context(struct lws_log_cx *cx, void *obj, char **p, char *e)
LWS_VISIBLE LWS_EXTERN void lwsl_refcount_cx(lws_log_cx_t *cx, int _new)
LWS_VISIBLE LWS_EXTERN struct lws_log_cx * lwsl_vhost_get_cx(struct lws_vhost *vh)
void(* lws_log_emit_cx_t)(struct lws_log_cx *cx, int level, const char *line, size_t len)
Definition lws-logs.h:75
LWS_VISIBLE LWS_EXTERN void _lws_log_cx_rl(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj, int filter, uint32_t dropped, const char *_fun, const char *format,...) LWS_FORMAT(7)
unsigned int uint32_t
#define LWS_INLINE
#define LWS_FORMAT(string_index)
#define LWS_EXTERN
#define LWS_VISIBLE
LWS_VISIBLE LWS_EXTERN struct lws_log_cx * lwsl_sspc_get_cx(struct lws_sspc_handle *ss)
LWS_VISIBLE LWS_EXTERN void lws_log_prepend_sspc(struct lws_log_cx *cx, void *obj, char **p, char *e)
union lws_log_cx::@220323100350007171111065354245352002142343167075 u
uint32_t lll_flags
Definition lws-logs.h:112
int32_t refcount
Definition lws-logs.h:114
lws_log_prepend_cx_t prepend
Definition lws-logs.h:103
void * stg
Definition lws-logs.h:110
void * opaque
Definition lws-logs.h:108
lws_log_use_cx_t refcount_cb
Definition lws-logs.h:99
struct lws_log_cx * parent
Definition lws-logs.h:106