xref: /illumos-gate/usr/src/cmd/hal/hald/logger.c (revision 55fea89d)
118c2aff7Sartem /***************************************************************************
218c2aff7Sartem  * CVSID: $Id$
318c2aff7Sartem  *
4*55fea89dSDan Cross  * logger.c : Logging
518c2aff7Sartem  *
618c2aff7Sartem  * Copyright (C) 2003 David Zeuthen, <david@fubar.dk>
718c2aff7Sartem  * Copyright (C) 2006 Danny Kukawka, <danny.kukawka@web.de>
818c2aff7Sartem  *
918c2aff7Sartem  * Licensed under the Academic Free License version 2.1
1018c2aff7Sartem  *
1118c2aff7Sartem  * This program is free software; you can redistribute it and/or modify
1218c2aff7Sartem  * it under the terms of the GNU General Public License as published by
1318c2aff7Sartem  * the Free Software Foundation; either version 2 of the License, or
1418c2aff7Sartem  * (at your option) any later version.
1518c2aff7Sartem  *
1618c2aff7Sartem  * This program is distributed in the hope that it will be useful,
1718c2aff7Sartem  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1818c2aff7Sartem  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1918c2aff7Sartem  * GNU General Public License for more details.
2018c2aff7Sartem  *
2118c2aff7Sartem  * You should have received a copy of the GNU General Public License
2218c2aff7Sartem  * along with this program; if not, write to the Free Software
2318c2aff7Sartem  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
2418c2aff7Sartem  *
2518c2aff7Sartem  **************************************************************************/
2618c2aff7Sartem 
2718c2aff7Sartem #ifdef HAVE_CONFIG_H
2818c2aff7Sartem #  include <config.h>
2918c2aff7Sartem #endif
3018c2aff7Sartem 
3118c2aff7Sartem #include <stdio.h>
3218c2aff7Sartem #include <stdlib.h>
3318c2aff7Sartem #include <string.h>
3418c2aff7Sartem #include <stdarg.h>
3518c2aff7Sartem #include <time.h>
3618c2aff7Sartem #include <sys/time.h>
3718c2aff7Sartem #include <syslog.h>
3818c2aff7Sartem #include <unistd.h>
3918c2aff7Sartem 
4018c2aff7Sartem #include "logger.h"
4118c2aff7Sartem 
4218c2aff7Sartem /**
4318c2aff7Sartem  * @defgroup HalDaemonLogging Logging system
4418c2aff7Sartem  * @ingroup HalDaemon
4518c2aff7Sartem  * @brief Logging system for the HAL daemon
4618c2aff7Sartem  * @{
4718c2aff7Sartem  */
4818c2aff7Sartem 
4918c2aff7Sartem 
5018c2aff7Sartem static int priority;
5118c2aff7Sartem static const char *file;
5218c2aff7Sartem static int line;
5318c2aff7Sartem static const char *function;
5418c2aff7Sartem 
5518c2aff7Sartem static int log_pid  = 0;
5618c2aff7Sartem static int is_enabled = 1;
5718c2aff7Sartem static int syslog_enabled = 0;
5818c2aff7Sartem 
5918c2aff7Sartem 
6018c2aff7Sartem /** Disable all logging
6118c2aff7Sartem  *
6218c2aff7Sartem  */
63*55fea89dSDan Cross void
logger_disable(void)6418c2aff7Sartem logger_disable (void)
6518c2aff7Sartem {
6618c2aff7Sartem 	is_enabled = 0;
6718c2aff7Sartem }
6818c2aff7Sartem 
6918c2aff7Sartem /** Enable all logging
7018c2aff7Sartem  *
7118c2aff7Sartem  */
72*55fea89dSDan Cross void
logger_enable(void)7318c2aff7Sartem logger_enable (void)
7418c2aff7Sartem {
7518c2aff7Sartem 	is_enabled = 1;
7618c2aff7Sartem }
7718c2aff7Sartem 
78*55fea89dSDan Cross /** enable usage of syslog for logging
7918c2aff7Sartem  *
8018c2aff7Sartem  */
81*55fea89dSDan Cross void
logger_enable_syslog(void)8218c2aff7Sartem logger_enable_syslog (void)
8318c2aff7Sartem {
8418c2aff7Sartem 	syslog_enabled = 1;
8518c2aff7Sartem }
8618c2aff7Sartem 
87*55fea89dSDan Cross /** disable usage of syslog for logging
8818c2aff7Sartem  *
8918c2aff7Sartem  */
90*55fea89dSDan Cross void
logger_disable_syslog(void)9118c2aff7Sartem logger_disable_syslog (void)
9218c2aff7Sartem {
9318c2aff7Sartem 	syslog_enabled = 0;
9418c2aff7Sartem }
9518c2aff7Sartem 
96*55fea89dSDan Cross /** allow setup logger from a addon/prober via the env
9718c2aff7Sartem  *
9818c2aff7Sartem  */
9918c2aff7Sartem void
setup_logger(void)10018c2aff7Sartem setup_logger (void)
10118c2aff7Sartem {
10218c2aff7Sartem         if ((getenv ("HALD_VERBOSE")) != NULL) {
10318c2aff7Sartem                 is_enabled = 1;
10418c2aff7Sartem 		log_pid = 1;
10518c2aff7Sartem 	}
10618c2aff7Sartem         else
10718c2aff7Sartem                 is_enabled = 0;
10818c2aff7Sartem 
10918c2aff7Sartem         if ((getenv ("HALD_USE_SYSLOG")) != NULL)
11018c2aff7Sartem 		syslog_enabled = 1;
11118c2aff7Sartem         else
11218c2aff7Sartem                 syslog_enabled = 0;
11318c2aff7Sartem }
11418c2aff7Sartem 
11518c2aff7Sartem /** Setup logging entry
11618c2aff7Sartem  *
11718c2aff7Sartem  *  @param  priority            Logging priority, one of HAL_LOGPRI_*
11818c2aff7Sartem  *  @param  file                Name of file where the log entry originated
11918c2aff7Sartem  *  @param  line                Line number of file
12018c2aff7Sartem  *  @param  function            Name of function
12118c2aff7Sartem  */
12218c2aff7Sartem void
logger_setup(int _priority,const char * _file,int _line,const char * _function)12318c2aff7Sartem logger_setup (int _priority, const char *_file, int _line, const char *_function)
12418c2aff7Sartem {
12518c2aff7Sartem 	priority = _priority;
12618c2aff7Sartem 	file = _file;
12718c2aff7Sartem 	line = _line;
12818c2aff7Sartem 	function = _function;
12918c2aff7Sartem }
13018c2aff7Sartem 
13118c2aff7Sartem /** Emit logging entry
13218c2aff7Sartem  *
13318c2aff7Sartem  *  @param  format              Message format string, printf style
13418c2aff7Sartem  *  @param  ...                 Parameters for message, printf style
13518c2aff7Sartem  */
13618c2aff7Sartem void
logger_emit(const char * format,...)13718c2aff7Sartem logger_emit (const char *format, ...)
13818c2aff7Sartem {
13918c2aff7Sartem 	va_list args;
14018c2aff7Sartem 	char buf[512];
14118c2aff7Sartem 	char *pri;
14218c2aff7Sartem 	char tbuf[256];
14318c2aff7Sartem 	char logmsg[1024];
14418c2aff7Sartem 	struct timeval tnow;
14518c2aff7Sartem 	struct tm *tlocaltime;
14618c2aff7Sartem 	struct timezone tzone;
14718c2aff7Sartem 	static pid_t pid = -1;
14818c2aff7Sartem 
14918c2aff7Sartem 	if (!is_enabled)
15018c2aff7Sartem 		return;
15118c2aff7Sartem 
15218c2aff7Sartem 	va_start (args, format);
15318c2aff7Sartem 	vsnprintf (buf, sizeof (buf), format, args);
15418c2aff7Sartem 
15518c2aff7Sartem 	switch (priority) {
15618c2aff7Sartem 		case HAL_LOGPRI_TRACE:
15718c2aff7Sartem 			pri = "[T]";
15818c2aff7Sartem 			break;
15918c2aff7Sartem 		case HAL_LOGPRI_DEBUG:
16018c2aff7Sartem 			pri = "[D]";
16118c2aff7Sartem 			break;
16218c2aff7Sartem 		case HAL_LOGPRI_INFO:
16318c2aff7Sartem 			pri = "[I]";
16418c2aff7Sartem 			break;
16518c2aff7Sartem 		case HAL_LOGPRI_WARNING:
16618c2aff7Sartem 			pri = "[W]";
16718c2aff7Sartem 			break;
16818c2aff7Sartem 		default:		/* explicit fallthrough */
16918c2aff7Sartem 		case HAL_LOGPRI_ERROR:
17018c2aff7Sartem 			pri = "[E]";
17118c2aff7Sartem 			break;
17218c2aff7Sartem 	}
17318c2aff7Sartem 
17418c2aff7Sartem 	gettimeofday (&tnow, &tzone);
17518c2aff7Sartem 	tlocaltime = localtime (&tnow.tv_sec);
17618c2aff7Sartem 	strftime (tbuf, sizeof (tbuf), "%H:%M:%S", tlocaltime);
17718c2aff7Sartem 
17818c2aff7Sartem 	if (log_pid) {
17918c2aff7Sartem         	if ((int) pid == -1)
18018c2aff7Sartem                 	pid = getpid ();
18118c2aff7Sartem 		snprintf (logmsg, sizeof(logmsg), "[%d]: %s.%03d %s %s:%d: %s\n", pid, tbuf, (int)(tnow.tv_usec/1000), pri, file, line, buf);
18218c2aff7Sartem 	} else {
18318c2aff7Sartem 		snprintf (logmsg, sizeof(logmsg), "%s.%03d %s %s:%d: %s\n", tbuf, (int)(tnow.tv_usec/1000), pri, file, line, buf);
18418c2aff7Sartem 	}
185*55fea89dSDan Cross 
18618c2aff7Sartem 	/** @todo Make programmatic interface to logging */
18718c2aff7Sartem 	if (priority != HAL_LOGPRI_TRACE && !syslog_enabled ) {
18818c2aff7Sartem 		fprintf (stderr, "%s", logmsg );
189*55fea89dSDan Cross 	} else if (priority != HAL_LOGPRI_TRACE && syslog_enabled ) {
19018c2aff7Sartem 		/* use syslog for debug/log messages if HAL started as daemon */
19118c2aff7Sartem 		switch (priority) {
19218c2aff7Sartem 			case HAL_LOGPRI_DEBUG:
19318c2aff7Sartem 			case HAL_LOGPRI_INFO:
19418c2aff7Sartem 				syslog(LOG_INFO, "%s", logmsg );
19518c2aff7Sartem 				break;
19618c2aff7Sartem 			case HAL_LOGPRI_WARNING:
19718c2aff7Sartem 				syslog(LOG_WARNING, "%s", logmsg );
19818c2aff7Sartem 				break;
19918c2aff7Sartem 			default:		 /* explicit fallthrough */
20018c2aff7Sartem 			case HAL_LOGPRI_ERROR:
20118c2aff7Sartem 				syslog(LOG_ERR, "%s", logmsg );
20218c2aff7Sartem 				break;
20318c2aff7Sartem 		}
20418c2aff7Sartem 	}
20518c2aff7Sartem 
20618c2aff7Sartem 	va_end (args);
20718c2aff7Sartem }
20818c2aff7Sartem 
20918c2aff7Sartem void
logger_forward_debug(const char * format,...)21018c2aff7Sartem logger_forward_debug (const char *format, ...)
21118c2aff7Sartem {
21218c2aff7Sartem 	va_list args;
21318c2aff7Sartem         char buf[512];
21418c2aff7Sartem         char tbuf[256];
21518c2aff7Sartem         struct timeval tnow;
21618c2aff7Sartem         struct tm *tlocaltime;
21718c2aff7Sartem         struct timezone tzone;
21818c2aff7Sartem         static pid_t pid = -1;
21918c2aff7Sartem 
22018c2aff7Sartem         if (!is_enabled)
22118c2aff7Sartem                 return;
22218c2aff7Sartem 
22318c2aff7Sartem         if ((int) pid == -1)
22418c2aff7Sartem                 pid = getpid ();
22518c2aff7Sartem 
22618c2aff7Sartem 	va_start (args, format);
22718c2aff7Sartem         vsnprintf (buf, sizeof (buf), format, args);
22818c2aff7Sartem 
22918c2aff7Sartem         gettimeofday (&tnow, &tzone);
23018c2aff7Sartem         tlocaltime = localtime (&tnow.tv_sec);
23118c2aff7Sartem         strftime (tbuf, sizeof (tbuf), "%H:%M:%S", tlocaltime);
23218c2aff7Sartem 
23318c2aff7Sartem         if (syslog_enabled)
23418c2aff7Sartem                 syslog (LOG_INFO, "%d: %s.%03d: %s", pid, tbuf, (int)(tnow.tv_usec/1000), buf);
23518c2aff7Sartem         else
23618c2aff7Sartem                 fprintf (stderr, "%d: %s.%03d: %s", pid, tbuf, (int)(tnow.tv_usec/1000), buf);
23718c2aff7Sartem 
23818c2aff7Sartem         va_end (args);
23918c2aff7Sartem }
24018c2aff7Sartem 
24118c2aff7Sartem /** @} */
242