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_MAX))
53 return level <= 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)
122 if(ul_log_cutoff_level) {
123 if((level & UL_LOGL_MASK) > ul_log_cutoff_level) return;
125 if(ul_log_output==NULL) {
126 ul_log_output=ul_log_fnc_default;
128 if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
129 ul_log_default_file=fopen(log_fname,"a");
131 if(ul_log_default_file==NULL)
132 ul_log_default_file=stderr;
133 if(!ul_debug_flg&&((s=getenv("UL_DEBUG_FLG"))!=NULL)){
134 ul_debug_flg=atoi(s);
136 if((s = getenv("UL_LOG_CUTTOFF")) != NULL) {
137 ul_log_cutoff_level = atoi(s);
141 (*ul_log_output)(domain,level,format,ap);
145 * ul_log_redir - redirects default log output function
146 * @log_fnc: new log output function. Value NULL resets
147 * to default function
148 * @add_flags: some more flags
152 ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags)
154 if(log_fnc==NULL) log_fnc=ul_log_fnc_default;
155 ul_log_output=log_fnc;
160 ul_log_fnc_default(ul_log_domain_t *domain, int level,
161 const char *format, va_list ap)
163 if(!(level&UL_LOGL_CONT)) {
166 fprintf(ul_log_default_file,"<%d>",level);
167 if(domain && domain->name)
168 fprintf(ul_log_default_file,"%s: ",domain->name);
170 vfprintf(ul_log_default_file, format, ap);
171 fflush(ul_log_default_file);
177 ul_log_fnc_default(ul_log_domain_t *domain, int level,
178 const char *format, va_list ap)
180 if(!(level&UL_LOGL_CONT)) {
183 rtl_printf("<%d>",level);
184 if(domain && domain->name)
185 rtl_printf("%s: ",domain->name);
187 rtl_vprintf(format, ap);