gwenhywfar 5.14.1
logger.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Sun Dec 05 2003
3 copyright : (C) 2025 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * *
8 * This library is free software; you can redistribute it and/or *
9 * modify it under the terms of the GNU Lesser General Public *
10 * License as published by the Free Software Foundation; either *
11 * version 2.1 of the License, or (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16 * Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 * *
23 ***************************************************************************/
24
25
26#ifdef HAVE_CONFIG_H
27# include <config.h>
28#endif
29
30#include <gwenhywfar/gwenhywfarapi.h>
31#include <gwenhywfar/misc.h>
32#include <gwenhywfar/buffer.h>
33#include <gwenhywfar/gui.h>
34
35#include "logger_p.h"
36
37#include <stdlib.h>
38#include <stdio.h>
39#include <errno.h>
40#ifdef HAVE_SYSLOG_H
41# include <syslog.h>
42#endif
43#include <string.h>
44#ifdef HAVE_STRINGS_H
45# include <strings.h>
46#endif
47
48#include <time.h>
49#ifdef HAVE_UNISTD_H
50# include <unistd.h>
51#endif
52
53
54
55/* ------------------------------------------------------------------------------------------------
56 * forward declarations
57 * ------------------------------------------------------------------------------------------------
58 */
59
60static GWEN_LOGGER_DOMAIN *_loggerDomain_new(const char *name);
61static void _loggerDomain_free(GWEN_LOGGER_DOMAIN *ld);
62static GWEN_LOGGER_DOMAIN *_loggerDomain_Find(const char *name);
63static void _loggerDomain_Add(GWEN_LOGGER_DOMAIN *ld);
64static void _loggerDomain_Del(GWEN_LOGGER_DOMAIN *ld);
65static GWEN_LOGGER *_loggerDomain_GetLogger(const char *name);
66
67static int _createMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf);
68static int _logMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s);
69static int _logMessageToFile(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s);
70static int _logMessageToFunction(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s);
71static int _logMessageToConsole(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s);
72#ifdef HAVE_SYSLOG_H
73static int _logMessageToSyslog(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s);
74#endif
75
76static GWEN_LOGGER *GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain);
77static void GWEN_Logger_free(GWEN_LOGGER *lg);
78/* static void GWEN_Logger_Attach(GWEN_LOGGER *lg); */
79
80
81#ifndef NO_DEPRECATED_SYMBOLS
87GWENHYWFAR_API void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger) GWEN_DEPRECATED;
88#endif // ifndef NO_DEPRECATED_SYMBOLS
89
90
91#ifndef NO_DEPRECATED_SYMBOLS
98#endif // ifndef NO_DEPRECATED_SYMBOLS
99
100
101
102/* ------------------------------------------------------------------------------------------------
103 * global vars
104 * ------------------------------------------------------------------------------------------------
105 */
106
107static GWEN_LOGGER_DOMAIN *gwen_loggerdomains=NULL;
108
109
110
111/* ------------------------------------------------------------------------------------------------
112 * implementations
113 * ------------------------------------------------------------------------------------------------
114 */
115
117{
118 const char *s;
120
122 s=getenv("GWEN_LOGLEVEL");
123 if (s) {
127 }
129 return 0;
130}
131
132
133
135{
136 GWEN_LOGGER_DOMAIN *ld;
137
138 while ((ld=gwen_loggerdomains)) {
141 }
142 return 0;
143}
144
145
146
147GWEN_LOGGER_DOMAIN *_loggerDomain_new(const char *name)
148{
149 GWEN_LOGGER_DOMAIN *ld;
150
151 assert(name);
152 GWEN_NEW_OBJECT(GWEN_LOGGER_DOMAIN, ld);
153 ld->name=strdup(name);
154 return ld;
155}
156
157
158
159void _loggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
160{
161 if (ld) {
162 free(ld->name);
163 GWEN_Logger_free(ld->logger);
165 }
166}
167
168
169GWEN_LOGGER_DOMAIN *_loggerDomain_Find(const char *name)
170{
171 GWEN_LOGGER_DOMAIN *ld;
172
173 assert(name);
175 while (ld) {
176 if (strcasecmp(ld->name, name)==0)
177 break;
178 ld=ld->next;
179 }
180
181 return ld;
182}
183
184
185
186void _loggerDomain_Add(GWEN_LOGGER_DOMAIN *ld)
187{
188 assert(ld);
189 GWEN_LIST_INSERT(GWEN_LOGGER_DOMAIN, ld, &gwen_loggerdomains);
190}
191
192
193
194void _loggerDomain_Del(GWEN_LOGGER_DOMAIN *ld)
195{
196 assert(ld);
197 GWEN_LIST_DEL(GWEN_LOGGER_DOMAIN, ld, &gwen_loggerdomains);
198}
199
200
201
202GWEN_LOGGER *_loggerDomain_GetLogger(const char *name)
203{
204 GWEN_LOGGER_DOMAIN *ld;
205
206 if (!name)
207 name="default";
208
209 ld=_loggerDomain_Find(name);
210 if (ld) {
211 return ld->logger;
212 }
213 ld=_loggerDomain_new(name);
214 ld->logger=GWEN_Logger_new(ld);
215
217 return ld->logger;
218}
219
220
221
222GWEN_LOGGER *GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain)
223{
224 GWEN_LOGGER *lg;
225
226 GWEN_NEW_OBJECT(GWEN_LOGGER, lg);
227 lg->usage=1;
228 lg->enabled=1;
229 lg->logType=GWEN_LoggerType_Console;
230 lg->logLevel=GWEN_LoggerLevel_Error;
231 lg->domain=domain;
232 return lg;
233}
234
235
236
237void GWEN_Logger_free(GWEN_LOGGER *lg)
238{
239 if (lg) {
240 assert(lg->usage);
241 if (--(lg->usage)==0) {
242 free(lg->logFile);
243 free(lg->logIdent);
245 }
246 }
247}
248
249
250
251/*
252void GWEN_Logger_Attach(GWEN_LOGGER *lg)
253{
254 assert(lg);
255 lg->usage++;
256}
257*/
258
259
260#ifndef NO_DEPRECATED_SYMBOLS
261void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger)
262{
263 assert(newLogger);
264
265 assert(oldLogger);
266 GWEN_LIST_ADD(GWEN_LOGGER, newLogger, &(oldLogger->next));
267}
268#endif
269
270
271
272#ifndef NO_DEPRECATED_SYMBOLS
274{
275 fprintf(stderr, "GWEN_Logger_SetDefaultLogger: Deprecated function\n");
276}
277#endif // ifndef NO_DEPRECATED_SYMBOLS
278
279
280
281int GWEN_Logger_Open(const char *logDomain,
282 const char *ident,
283 const char *file,
284 GWEN_LOGGER_LOGTYPE logtype,
285 GWEN_LOGGER_FACILITY facility)
286{
287 GWEN_LOGGER *lg;
288
289 lg=_loggerDomain_GetLogger(logDomain);
290 assert(lg);
291
292 if (lg->open) {
293 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "Already open");
294 return 0;
295 }
296
297 lg->logType=logtype;
298
299 GWEN_Logger_SetIdent(logDomain, ident);
300 GWEN_Logger_SetFilename(logDomain, file);
301
302 if (logtype==GWEN_LoggerType_File) {
303 /* logging to a file */
304 if (file==0) {
305 lg->logType=GWEN_LoggerType_Console;
306 lg->enabled=1;
307 fprintf(stderr, "LOGGER: No filename given, will log to console.\n");
308 }
309 else {
310 lg->logType=GWEN_LoggerType_File;
311 lg->enabled=1;
312 }
313 }
314#ifdef HAVE_SYSLOG_H
315 else if (logtype==GWEN_LoggerType_Syslog) {
316 /* caller wants to log via syslog */
317 int fac;
318
319 switch (facility) {
321 fac=LOG_AUTH;
322 break;
324 fac=LOG_DAEMON;
325 break;
327 fac=LOG_MAIL;
328 break;
330 fac=LOG_NEWS;
331 break;
334 default:
335 fac=LOG_USER;
336 break;
337 }
338
339 openlog(ident, LOG_CONS | LOG_PID, fac);
340 lg->enabled=1;
341 } /* if syslog */
342#endif /* ifdef HAVE_SYSLOG_H */
343
344 else {
345 /* console or function */
346 lg->enabled=1;
347 }
348
349 lg->open=1;
350
351 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "started");
352 return 0;
353}
354
355
356
357void GWEN_Logger_Close(const char *logDomain)
358{
359 GWEN_LOGGER *lg;
360
361 lg=_loggerDomain_GetLogger(logDomain);
362 assert(lg);
363 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "stopped");
364 lg->logType=GWEN_LoggerType_Console;
365 lg->enabled=0;
366#ifdef HAVE_SYSLOG_H
367 closelog();
368#endif
369 lg->open=0;
370 /* remove logdomain after it has been closed */
371 _loggerDomain_Del(lg->domain);
372 _loggerDomain_free(lg->domain);
373}
374
375
376
377int GWEN_Logger_IsOpen(const char *logDomain)
378{
379 GWEN_LOGGER_DOMAIN *ld;
380
381 if (!logDomain)
382 logDomain="default";
383 ld=_loggerDomain_Find(logDomain);
384 return ld?(ld->logger->open):0;
385}
386
387
388
389int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
390{
391 GWEN_LOGGER *lg;
392
393 lg=_loggerDomain_GetLogger(logDomain);
394 assert(lg);
395
396 return _createMessage(lg, priority, s, mbuf);
397}
398
399
400
401void GWEN_Logger_Log(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
402{
403 if (s) {
404 GWEN_LOGGER *lg;
405
406 lg=_loggerDomain_GetLogger(logDomain);
407 assert(lg);
408
409 if (lg->enabled) {
410 if (!GWEN_Gui_LogHook(logDomain, priority, s)) {
411 if (priority<=lg->logLevel) {
412 const char *p;
413 int slen;
414 unsigned int i;
415 GWEN_BUFFER *mbuf;
416
417 /* temporarily disable logging to avoid endless loops */
418 lg->enabled=0;
419 slen=strlen(s);
420 /* copy buffer, exchange all newlines by 0 */
421 mbuf=GWEN_Buffer_new(0, slen+1, 0, 1);
422 for (i=0; i<slen+1; i++) {
423 if (s[i]=='\n') {
424 GWEN_Buffer_AppendByte(mbuf, 0);
425 }
426 else
427 GWEN_Buffer_AppendByte(mbuf, s[i]);
428 }
429
430 /* now log each line */
431 /*rv=0;*/
432 p=GWEN_Buffer_GetStart(mbuf);
433 while (*p) {
434 _logMessage(lg, priority, p);
435 while (*p)
436 p++;
437 p++;
438 }
439 GWEN_Buffer_free(mbuf);
440 /* reenable logging */
441 lg->enabled=1;
442 }
443 }
444 }
445 }
446}
447
448
449
450void GWEN_Logger_Enable(const char *logDomain, int f)
451{
452 GWEN_LOGGER *lg;
453
454 lg=_loggerDomain_GetLogger(logDomain);
455 assert(lg);
456 lg->enabled=f;
457}
458
459
460
461int GWEN_Logger_IsEnabled(const char *logDomain)
462{
463 GWEN_LOGGER *lg;
464
465 lg=_loggerDomain_GetLogger(logDomain);
466 assert(lg);
467 return lg->enabled;
468}
469
470
471
472void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
473{
474 GWEN_LOGGER *lg;
475
476 lg=_loggerDomain_GetLogger(logDomain);
477 assert(lg);
478 lg->logLevel=l;
479}
480
481
482
483int GWEN_Logger_GetLevel(const char *logDomain)
484{
485 GWEN_LOGGER *lg;
486
487 lg=_loggerDomain_GetLogger(logDomain);
488 assert(lg);
489
490 return lg->logLevel;
491}
492
493
494
495void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
496{
497 GWEN_LOGGER *lg;
498
499 lg=_loggerDomain_GetLogger(logDomain);
500 assert(lg);
501
502 free(lg->logIdent);
503 if (id)
504 lg->logIdent=strdup(id);
505 else
506 lg->logIdent=strdup("No ident, please adjust your program");
507}
508
509
510
511void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
512{
513 GWEN_LOGGER *lg;
514
515 lg=_loggerDomain_GetLogger(logDomain);
516 assert(lg);
517
518 free(lg->logFile);
519 if (name)
520 lg->logFile=strdup(name);
521 else
522 lg->logFile=strdup("");
523}
524
525
526
529{
530 GWEN_LOGGER *lg;
532
533 lg=_loggerDomain_GetLogger(logDomain);
534 assert(lg);
535 oldFn=lg->logFunction;
536 lg->logFunction=fn;
537 return oldFn;
538}
539
540
541
543{
544 if (strcasecmp(name, "emergency")==0)
546 else if (strcasecmp(name, "alert")==0)
548 else if (strcasecmp(name, "critical")==0)
550 else if (strcasecmp(name, "error")==0)
552 else if (strcasecmp(name, "warning")==0)
554 else if (strcasecmp(name, "notice")==0)
556 else if (strcasecmp(name, "info")==0)
558 else if (strcasecmp(name, "debug")==0)
560 else if (strcasecmp(name, "verbous")==0 || strcasecmp(name, "verbose")==0)
562 else {
564 }
565}
566
567
568
570{
571 const char *s;
572
573 switch (level) {
575 s="emergency";
576 break;
578 s="alert";
579 break;
581 s="critical";
582 break;
584 s="error";
585 break;
587 s="warning";
588 break;
590 s="notice";
591 break;
593 s="info";
594 break;
596 s="debug";
597 break;
599 /* yes, we know the spelling is wrong. But it's a historic bug, fixing it would make Gwen incompatible with previous versions. */
600 s="verbous";
601 break;
603 default:
604 s="unknown";
605 break;
606 } /* switch */
607 return s;
608}
609
610
611
613{
614 if (strcasecmp(name, "console")==0)
616 else if (strcasecmp(name, "file")==0)
618 else if (strcasecmp(name, "syslog")==0)
620 else if (strcasecmp(name, "function")==0)
622 else {
624 }
625}
626
627
628
630{
631 const char *s;
632
633 switch (lt) {
635 s="console";
636 break;
638 s="file";
639 break;
641 s="syslog";
642 break;
644 s="function";
645 break;
647 default:
648 s="unknown";
649 break;
650 } /* switch */
651 return s;
652}
653
654
655
656int GWEN_Logger_Exists(const char *logDomain)
657{
658 assert(logDomain);
659 return (_loggerDomain_Find(logDomain)!=0);
660}
661
662
663
664
665
666
667int _logMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
668{
669 while (lg) {
670 if (priority<=lg->logLevel) {
671 int rv;
672
673 switch (lg->logType) {
674#ifdef HAVE_SYSLOG_H
675 case GWEN_LoggerType_Syslog: rv=_logMessageToSyslog(lg, priority, s); break;
676#endif /* HAVE_SYSLOG_H */
677 case GWEN_LoggerType_File: rv=_logMessageToFile(lg, priority, s); break;
678 case GWEN_LoggerType_Function: rv=_logMessageToFunction(lg, priority, s); break;
681 default: rv=_logMessageToConsole(lg, priority, s); break;
682 break;
683 } /* switch */
684 if (rv<0) {
685 lg->logType=GWEN_LoggerType_Console;
686 }
687 }
688 lg=lg->next;
689 } /* while lg */
690 return 0;
691}
692
693
694
695int _logMessageToFile(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
696{
697 FILE *f;
698 GWEN_BUFFER *mbuf;
699 int rv;
700
701 mbuf=GWEN_Buffer_new(0, 256, 0, 1);
702 rv=_createMessage(lg, priority, s, mbuf);
703 if (rv) {
704 GWEN_Buffer_free(mbuf);
705 return rv;
706 }
707
708 f=fopen(lg->logFile, "a+");
709 if (f==0) {
710 fprintf(stderr, "LOGGER: Unable to open file \"%s\" (%s)\n", lg->logFile, strerror(errno));
711 lg->logType=GWEN_LoggerType_Console;
712 GWEN_Buffer_free(mbuf);
713 return GWEN_ERROR_IO;
714 }
715
716 if (fwrite(GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf), 1, f)!=1) {
717 fprintf(stderr, "LOGGER: Unable to write to file \"%s\" (%s)\n", lg->logFile, strerror(errno));
718 fclose(f);
719 lg->logType=GWEN_LoggerType_Console;
720 GWEN_Buffer_free(mbuf);
721 return GWEN_ERROR_IO;
722 }
723 if (fclose(f)) {
724 fprintf(stderr, "LOGGER: Unable to close file \"%s\" (%s)\n", lg->logFile, strerror(errno));
725 lg->logType=GWEN_LoggerType_Console;
726 GWEN_Buffer_free(mbuf);
727 return GWEN_ERROR_IO;
728 }
729 GWEN_Buffer_free(mbuf);
730
731 return 0;
732}
733
734
735
736int _logMessageToConsole(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
737{
738 GWEN_BUFFER *mbuf;
739 int rv;
740
741 mbuf=GWEN_Buffer_new(0, 256, 0, 1);
742 rv=_createMessage(lg, priority, s, mbuf);
743 if (rv) {
744 GWEN_Buffer_free(mbuf);
745 return rv;
746 }
747 fprintf(stderr, "%s", GWEN_Buffer_GetStart(mbuf));
748 GWEN_Buffer_free(mbuf);
749
750 return 0;
751}
752
753
754
755#ifdef HAVE_SYSLOG_H
756int _logMessageToSyslog(GWEN_UNUSED GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
757{
758 int pri;
759
760 switch (priority) {
762 pri=LOG_EMERG;
763 break;
765 pri=LOG_ALERT;
766 break;
768 pri=LOG_CRIT;
769 break;
771 pri=LOG_ERR;
772 break;
774 pri=LOG_WARNING;
775 break;
777 pri=LOG_NOTICE;
778 break;
780 pri=LOG_NOTICE;
781 break;
782
786 default:
787 pri=LOG_DEBUG;
788 break;
789 } /* switch */
790 syslog(pri, "%s", s);
791
792 return 0;
793}
794#endif
795
796
797
798
799int _logMessageToFunction(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
800{
801 GWEN_BUFFER *mbuf;
802 int rv;
803
804 mbuf=GWEN_Buffer_new(0, 256, 0, 1);
805 rv=_createMessage(lg, priority, s, mbuf);
806 if (rv) {
807 GWEN_Buffer_free(mbuf);
808 return rv;
809 }
810
811 if (lg->logFunction==0) {
812 fprintf(stderr, "LOGGER: Logtype is \"Function\", but no function is set.\n");
813 GWEN_Buffer_free(mbuf);
815 }
816 rv=_createMessage(lg, priority, s, mbuf);
817 if (rv) {
818 GWEN_Buffer_free(mbuf);
819 return rv;
820 }
821 (lg->logFunction)(GWEN_Buffer_GetStart(mbuf));
822 GWEN_Buffer_free(mbuf);
823 return 0;
824}
825
826
827
828int _createMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
829{
830 struct tm *t;
831 time_t tt;
832
833 tt=time(0);
834 t=localtime(&tt);
835
836 /* priority and timestamp */
838 "%d:%04d/%02d/%02d %02d-%02d-%02d:",
839 priority, t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
840 GWEN_Buffer_AppendString(mbuf, (lg->logIdent)?(lg->logIdent):"<empty>");
841#ifdef HAVE_GETPID
842 GWEN_Buffer_AppendArgs(mbuf, "(%d)", (int)getpid());
843#else
844 GWEN_Buffer_AppendArgs(mbuf, "(%d)", 0);
845#endif
846 GWEN_Buffer_AppendByte(mbuf, ':');
847
848 GWEN_Buffer_AppendString(mbuf, s?s:"<no msg>");
849 GWEN_Buffer_AppendByte(mbuf, '\n');
850 return 0;
851}
852
853
854
855
856
857
858
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition buffer.c:1087
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition error.h:108
#define GWEN_ERROR_IO
Definition error.h:123
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
GWENHYWFAR_API int GWEN_Gui_LogHook(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
#define GWENHYWFAR_API
#define GWEN_UNUSED
#define GWEN_DEPRECATED
static int _logMessageToFunction(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:799
static int _logMessageToFile(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:695
const char * GWEN_Logger_Logtype2Name(GWEN_LOGGER_LOGTYPE lt)
Definition logger.c:629
GWENHYWFAR_API void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger) GWEN_DEPRECATED
Definition logger.c:261
static int _logMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:667
const char * GWEN_Logger_Level2Name(GWEN_LOGGER_LEVEL level)
Definition logger.c:569
GWENHYWFAR_API void GWEN_Logger_SetDefaultLogger(GWEN_LOGGER *lg) GWEN_DEPRECATED
void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
Definition logger.c:495
GWEN_LOGGER_LOGTYPE GWEN_Logger_Name2Logtype(const char *name)
Definition logger.c:612
int GWEN_Logger_ModuleFini(void)
Definition logger.c:134
static void _loggerDomain_Add(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:186
GWEN_LOGGER_LEVEL GWEN_Logger_Name2Level(const char *name)
Definition logger.c:542
static void _loggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:159
void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
Definition logger.c:511
int GWEN_Logger_IsEnabled(const char *logDomain)
Definition logger.c:461
static int _logMessageToConsole(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:736
static void GWEN_Logger_free(GWEN_LOGGER *lg)
Definition logger.c:237
static void _loggerDomain_Del(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:194
static GWEN_LOGGER_DOMAIN * _loggerDomain_new(const char *name)
Definition logger.c:147
static GWEN_LOGGER_DOMAIN * gwen_loggerdomains
Definition logger.c:107
GWEN_LOGGERFUNCTIONLOG GWEN_Logger_SetLogFunction(const char *logDomain, GWEN_LOGGERFUNCTIONLOG fn)
Definition logger.c:527
int GWEN_Logger_ModuleInit(void)
Definition logger.c:116
int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition logger.c:389
void GWEN_Logger_Log(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:401
int GWEN_Logger_GetLevel(const char *logDomain)
Definition logger.c:483
void GWEN_Logger_Enable(const char *logDomain, int f)
Definition logger.c:450
int GWEN_Logger_Exists(const char *logDomain)
Definition logger.c:656
int GWEN_Logger_Open(const char *logDomain, const char *ident, const char *file, GWEN_LOGGER_LOGTYPE logtype, GWEN_LOGGER_FACILITY facility)
Definition logger.c:281
static GWEN_LOGGER_DOMAIN * _loggerDomain_Find(const char *name)
Definition logger.c:169
static GWEN_LOGGER * _loggerDomain_GetLogger(const char *name)
Definition logger.c:202
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition logger.c:472
int GWEN_Logger_IsOpen(const char *logDomain)
Definition logger.c:377
static int _createMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition logger.c:828
void GWEN_Logger_Close(const char *logDomain)
Definition logger.c:357
static GWEN_LOGGER * GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain)
Definition logger.c:222
#define GWEN_LOGDOMAIN
Definition logger.h:32
GWEN_LOGGER_LOGTYPE
Definition logger.h:40
@ GWEN_LoggerType_File
Definition logger.h:42
@ GWEN_LoggerType_Console
Definition logger.h:41
@ GWEN_LoggerType_Syslog
Definition logger.h:43
@ GWEN_LoggerType_Unknown
Definition logger.h:46
@ GWEN_LoggerType_Function
Definition logger.h:44
GWEN_LOGGER_FACILITY
Definition logger.h:50
@ GWEN_LoggerFacility_Mail
Definition logger.h:53
@ GWEN_LoggerFacility_Unknown
Definition logger.h:57
@ GWEN_LoggerFacility_News
Definition logger.h:54
@ GWEN_LoggerFacility_Daemon
Definition logger.h:52
@ GWEN_LoggerFacility_Auth
Definition logger.h:51
@ GWEN_LoggerFacility_User
Definition logger.h:55
GWEN_LOGGER_LEVEL
Definition logger.h:61
@ GWEN_LoggerLevel_Alert
Definition logger.h:63
@ GWEN_LoggerLevel_Emergency
Definition logger.h:62
@ GWEN_LoggerLevel_Unknown
Definition logger.h:72
@ GWEN_LoggerLevel_Warning
Definition logger.h:66
@ GWEN_LoggerLevel_Notice
Definition logger.h:67
@ GWEN_LoggerLevel_Debug
Definition logger.h:69
@ GWEN_LoggerLevel_Critical
Definition logger.h:64
@ GWEN_LoggerLevel_Verbous
Definition logger.h:70
@ GWEN_LoggerLevel_Info
Definition logger.h:68
@ GWEN_LoggerLevel_Error
Definition logger.h:65
void GWENHYWFAR_CB(* GWEN_LOGGERFUNCTIONLOG)(const char *s)
Definition logger.h:38
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
#define GWEN_LIST_ADD(typ, sr, head)
Definition misc.h:82
#define GWEN_LIST_INSERT(typ, sr, head)
Definition misc.h:100
#define GWEN_LIST_DEL(typ, sr, head)
Definition misc.h:116