1 /*******************************************************************
2 uLan Utilities Library - C library of basic reusable constructions
4 ul_logbase.c - base of standard logging facility
6 (C) Copyright 2003 by Pavel Pisa - Originator
8 The uLan utilities library can be used, copied and modified under
10 - GPL - GNU General Public License
11 - LGPL - GNU Lesser General Public License
12 - MPL - Mozilla Public License
13 - and other licenses added by project originators
14 Code can be modified and re-distributed under any combination
15 of the above listed licenses. If contributor does not agree with
16 some of the licenses, he/she can delete appropriate line.
17 Warning, if you delete all lines, you are not allowed to
18 distribute source code and/or binaries utilizing code.
20 See files COPYING and README for details.
22 *******************************************************************/
28 #include <sys/types.h>
36 #include <posix/unistd.h>
40 #include "ul_utdefs.h"
41 #include "ul_logbase.h"
45 int ul_log_cutoff_level;
47 #ifdef UL_LOG_NOINLINE
49 int ul_log_cond(ul_log_domain_t *domain, int level)
51 if(!domain || ((level&UL_LOGL_MASK) > UL_LOGL_MAX))
53 return (level&UL_LOGL_MASK) <= domain->level;
56 void ul_vlog(ul_log_domain_t *domain, int level,
57 const char *format, va_list ap)
59 if(!ul_log_cond(domain,level))
61 ul_vlog1(domain, level, format, ap);
64 void ul_log(ul_log_domain_t *domain, int level,
65 const char *format, ...)
69 if(!ul_log_cond(domain,level))
71 va_start (ap, format);
72 ul_vlog1(domain, level, format, ap);
76 #endif /*UL_LOG_NOINLINE*/
80 ul_log_fnc_default(ul_log_domain_t *domain, int level,
81 const char *format, va_list ap);
83 ul_log_fnc_t *ul_log_output;
85 FILE *ul_log_default_file;
89 * ul_log - generic logging facility for ULUT library
90 * @domain: pointer to domain of debugging messages
91 * @level: severity level
92 * @format: printf style format followed by arguments
94 * This functions is used for logging of various events.
95 * If not overridden by application, logged messages goes to the stderr.
96 * Environment variable %UL_LOG_FILENAME can be used to redirect
97 * output to file. Environment variable %UL_DEBUG_FLG can be used
98 * to select different set of logged events through ul_debug_flg.
100 * Note: There is a global variable %ul_log_cutoff_level.
101 * Only the messages with %level <= %ul_log_cutoff_level will be logged.
105 ul_log1(ul_log_domain_t *domain, int level,
106 const char *format, ...)
109 va_start(ap, format);
110 ul_vlog1(domain,level,format,ap);
115 ul_vlog1(ul_log_domain_t *domain, int level,
116 const char *format, va_list ap)
118 if(ul_log_cutoff_level) {
119 if((level & UL_LOGL_MASK) > ul_log_cutoff_level) return;
121 if(ul_log_output==NULL) {
122 ul_log_check_default_output();
125 (*ul_log_output)(domain,level,format,ap);
129 * ul_log_redir - redirects default log output function
130 * @log_fnc: new log output function. Value NULL resets
131 * to default function
132 * @add_flags: some more flags
136 ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags)
138 if(log_fnc==NULL) log_fnc=ul_log_fnc_default;
139 ul_log_output=log_fnc;
144 ul_log_fnc_default(ul_log_domain_t *domain, int level,
145 const char *format, va_list ap)
147 if(!(level&UL_LOGL_CONT)) {
150 fprintf(ul_log_default_file,"<%d>",level);
151 if(domain && domain->name)
152 fprintf(ul_log_default_file,"%s: ",domain->name);
154 vfprintf(ul_log_default_file, format, ap);
155 fflush(ul_log_default_file);
161 ul_log_fnc_default(ul_log_domain_t *domain, int level,
162 const char *format, va_list ap)
164 if(!(level&UL_LOGL_CONT)) {
167 rtl_printf("<%d>",level);
168 if(domain && domain->name)
169 rtl_printf("%s: ",domain->name);
171 rtl_vprintf(format, ap);
177 ul_log_check_default_output(void)
184 if(ul_log_output!=NULL)
187 ul_log_output=ul_log_fnc_default;
189 if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
190 ul_log_default_file=fopen(log_fname,"a");
192 if(ul_log_default_file==NULL)
193 ul_log_default_file=stderr;
194 if(!ul_debug_flg&&((s=getenv("UL_DEBUG_FLG"))!=NULL)){
195 ul_debug_flg=atoi(s);
197 if((s = getenv("UL_LOG_CUTTOFF")) != NULL) {
198 ul_log_cutoff_level = atoi(s);