fix FSCORE-156

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8997 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-07-11 14:35:08 +00:00
parent 9229cfdf24
commit 0f873e692b
9 changed files with 102 additions and 18 deletions

View File

@ -16,6 +16,8 @@
</cli-keybindings> </cli-keybindings>
<settings> <settings>
<!--Colorize the Console -->
<param name="colorize-console" value="true"/>
<!--Most channels to allow at once --> <!--Most channels to allow at once -->
<param name="max-sessions" value="1000"/> <param name="max-sessions" value="1000"/>
<!--Most channels to create per second --> <!--Most channels to create per second -->

View File

@ -195,6 +195,7 @@ struct switch_runtime {
uint32_t default_dtmf_duration; uint32_t default_dtmf_duration;
switch_frame_t dummy_cng_frame; switch_frame_t dummy_cng_frame;
char dummy_data[5]; char dummy_data[5];
switch_bool_t colorize_console;
}; };
extern struct switch_runtime runtime; extern struct switch_runtime runtime;

View File

@ -74,7 +74,7 @@ typedef switch_status_t (*switch_log_function_t) (const switch_log_node_t *node,
\param pool the memory pool to use \param pool the memory pool to use
\note to be called at application startup by the core \note to be called at application startup by the core
*/ */
SWITCH_DECLARE(switch_status_t) switch_log_init(_In_ switch_memory_pool_t *pool); SWITCH_DECLARE(switch_status_t) switch_log_init(_In_ switch_memory_pool_t *pool, _In_ switch_bool_t colorize);
/*! /*!
\brief Shut down the logging engine \brief Shut down the logging engine
@ -104,7 +104,8 @@ SWITCH_DECLARE(void) switch_log_printf(_In_ switch_text_channel_t channel, _In_z
\brief Shut down the logging engine \brief Shut down the logging engine
\note to be called at application termination by the core \note to be called at application termination by the core
*/ */
SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(_In_ switch_log_function_t function, _In_ switch_log_level_t level); SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(_In_ switch_log_function_t function, _In_ switch_log_level_t level, _In_ switch_bool_t is_console);
SWITCH_DECLARE(switch_status_t) switch_log_unbind_logger(_In_ switch_log_function_t function);
/*! /*!
\brief Return the name of the specified log level \brief Return the name of the specified log level

View File

@ -323,6 +323,8 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_event_socket_shutdown)
prefs.done = 1; prefs.done = 1;
switch_log_unbind_logger(socket_logger);
close_socket(&listen_list.sock); close_socket(&listen_list.sock);
while (prefs.threads) { while (prefs.threads) {
@ -1368,7 +1370,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_event_socket_runtime)
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
} }
switch_log_bind_logger(socket_logger, SWITCH_LOG_DEBUG); switch_log_bind_logger(socket_logger, SWITCH_LOG_DEBUG, SWITCH_FALSE);
for (;;) { for (;;) {

View File

@ -42,7 +42,7 @@ static int COLORIZE = 0;
static HANDLE hStdout; static HANDLE hStdout;
static WORD wOldColorAttrs; static WORD wOldColorAttrs;
static CONSOLE_SCREEN_BUFFER_INFO csbiInfo; static CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
static WORD COLORS[] = { FOREGROUND_RED | FOREGROUND_INTENSITY, static WORD COLORS[] = { FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY, FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY, FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY, FOREGROUND_RED | FOREGROUND_INTENSITY,
@ -53,7 +53,7 @@ static WORD COLORS[] = { FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_GREEN | FOREGROUND_INTENSITY FOREGROUND_GREEN | FOREGROUND_INTENSITY
}; };
#else #else
static const char *COLORS[] = { SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FMAGEN, SWITCH_SEQ_FCYAN, static const char *COLORS[] = { SWITCH_SEQ_FWHITE, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FMAGEN, SWITCH_SEQ_FCYAN,
SWITCH_SEQ_FGREEN, SWITCH_SEQ_FYELLOW, "" SWITCH_SEQ_FGREEN, SWITCH_SEQ_FYELLOW, ""
}; };
#endif #endif
@ -338,7 +338,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_console_load)
/* setup my logger function */ /* setup my logger function */
switch_log_bind_logger(switch_console_logger, SWITCH_LOG_DEBUG); switch_log_bind_logger(switch_console_logger, SWITCH_LOG_DEBUG, SWITCH_TRUE);
config_logger(); config_logger();
RUNNING = 1; RUNNING = 1;
@ -348,10 +348,12 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_console_load)
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_console_shutdown) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_console_shutdown)
{ {
//switch_core_hash_destroy(&log_hash);
//switch_core_hash_destroy(&name_hash); switch_log_unbind_logger(switch_console_logger);
switch_core_hash_destroy(&log_hash);
RUNNING = 0; RUNNING = 0;
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_UNLOAD;
} }
/* For Emacs: /* For Emacs:

View File

@ -374,9 +374,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_logfile_load)
switch_xml_free(xml); switch_xml_free(xml);
} }
switch_log_bind_logger(mod_logfile_logger, SWITCH_LOG_DEBUG); switch_log_bind_logger(mod_logfile_logger, SWITCH_LOG_DEBUG, SWITCH_FALSE);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_NOUNLOAD;
} }
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_logfile_shutdown) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_logfile_shutdown)

View File

@ -152,7 +152,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_syslog_load)
openlog(globals.ident, LOG_PID, LOG_USER); openlog(globals.ident, LOG_PID, LOG_USER);
switch_log_bind_logger(mod_syslog_logger, SWITCH_LOG_DEBUG); switch_log_bind_logger(mod_syslog_logger, SWITCH_LOG_DEBUG, SWITCH_FALSE);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
@ -160,6 +160,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_syslog_load)
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_syslog_shutdown) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_syslog_shutdown)
{ {
closelog(); closelog();
switch_log_unbind_logger(mod_syslog_logger);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }

View File

@ -896,7 +896,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
switch_core_set_variable("local_ip_v6", guess_ip); switch_core_set_variable("local_ip_v6", guess_ip);
switch_core_set_variable("base_dir", SWITCH_GLOBAL_dirs.base_dir); switch_core_set_variable("base_dir", SWITCH_GLOBAL_dirs.base_dir);
switch_log_init(runtime.memory_pool);
switch_event_init(runtime.memory_pool); switch_event_init(runtime.memory_pool);
if (switch_xml_init(runtime.memory_pool, err) != SWITCH_STATUS_SUCCESS) { if (switch_xml_init(runtime.memory_pool, err) != SWITCH_STATUS_SUCCESS) {
@ -935,6 +935,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
rlp.rlim_max = RLIM_INFINITY; rlp.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &rlp); setrlimit(RLIMIT_CORE, &rlp);
#endif #endif
} else if (!strcasecmp(var, "colorize-console") && switch_true(val)) {
runtime.colorize_console = SWITCH_TRUE;
} else if (!strcasecmp(var, "mailer-app")) { } else if (!strcasecmp(var, "mailer-app")) {
runtime.mailer_app = switch_core_strdup(runtime.memory_pool, val); runtime.mailer_app = switch_core_strdup(runtime.memory_pool, val);
} else if (!strcasecmp(var, "mailer-app-args")) { } else if (!strcasecmp(var, "mailer-app-args")) {
@ -978,6 +980,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
switch_xml_free(xml); switch_xml_free(xml);
} }
switch_log_init(runtime.memory_pool, runtime.colorize_console);
switch_core_state_machine_init(runtime.memory_pool); switch_core_state_machine_init(runtime.memory_pool);
*err = NULL; *err = NULL;

View File

@ -48,6 +48,7 @@ static const char *LEVELS[] = {
struct switch_log_binding { struct switch_log_binding {
switch_log_function_t function; switch_log_function_t function;
switch_log_level_t level; switch_log_level_t level;
int is_console;
struct switch_log_binding *next; struct switch_log_binding *next;
}; };
@ -60,6 +61,29 @@ static switch_queue_t *LOG_QUEUE = NULL;
static switch_queue_t *LOG_RECYCLE_QUEUE = NULL; static switch_queue_t *LOG_RECYCLE_QUEUE = NULL;
static int8_t THREAD_RUNNING = 0; static int8_t THREAD_RUNNING = 0;
static uint8_t MAX_LEVEL = 0; static uint8_t MAX_LEVEL = 0;
static int mods_loaded = 0;
static switch_bool_t COLORIZE = SWITCH_FALSE;
#ifdef WIN32
static HANDLE hStdout;
static WORD wOldColorAttrs;
static CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
static WORD COLORS[] = { FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_RED | FOREGROUND_INTENSITY,
FOREGROUND_BLUE | FOREGROUND_INTENSITY,
FOREGROUND_BLUE | FOREGROUND_INTENSITY,
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
FOREGROUND_GREEN | FOREGROUND_INTENSITY
};
#else
static const char *COLORS[] = { SWITCH_SEQ_FWHITE, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FRED, SWITCH_SEQ_FMAGEN, SWITCH_SEQ_FCYAN,
SWITCH_SEQ_FGREEN, SWITCH_SEQ_FYELLOW, ""
};
#endif
SWITCH_DECLARE(const char *) switch_log_level2str(switch_log_level_t level) SWITCH_DECLARE(const char *) switch_log_level2str(switch_log_level_t level)
{ {
@ -116,7 +140,33 @@ SWITCH_DECLARE(switch_log_level_t) switch_log_str2level(const char *str)
return level; return level;
} }
SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(switch_log_function_t function, switch_log_level_t level) SWITCH_DECLARE(switch_status_t) switch_log_unbind_logger(switch_log_function_t function)
{
switch_log_binding_t *ptr = NULL, *last = NULL;
switch_status_t status = SWITCH_STATUS_FALSE;
switch_mutex_lock(BINDLOCK);
for (ptr = BINDINGS; ptr; ptr = ptr->next) {
if (ptr->function == function) {
if (last) {
last->next = ptr->next;
} else {
BINDINGS = ptr->next;
}
status = SWITCH_STATUS_SUCCESS;
if (ptr->is_console) {
mods_loaded--;
}
break;
}
last = ptr;
}
switch_mutex_unlock(BINDLOCK);
return status;
}
SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(switch_log_function_t function, switch_log_level_t level, switch_bool_t is_console)
{ {
switch_log_binding_t *binding = NULL, *ptr = NULL; switch_log_binding_t *binding = NULL, *ptr = NULL;
switch_assert(function != NULL); switch_assert(function != NULL);
@ -131,6 +181,7 @@ SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(switch_log_function_t fun
binding->function = function; binding->function = function;
binding->level = level; binding->level = level;
binding->is_console = is_console;
switch_mutex_lock(BINDLOCK); switch_mutex_lock(BINDLOCK);
for (ptr = BINDINGS; ptr && ptr->next; ptr = ptr->next); for (ptr = BINDINGS; ptr && ptr->next; ptr = ptr->next);
@ -140,6 +191,9 @@ SWITCH_DECLARE(switch_status_t) switch_log_bind_logger(switch_log_function_t fun
} else { } else {
BINDINGS = binding; BINDINGS = binding;
} }
if (is_console) {
mods_loaded++;
}
switch_mutex_unlock(BINDLOCK); switch_mutex_unlock(BINDLOCK);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
@ -255,7 +309,7 @@ SWITCH_DECLARE(void) switch_log_printf(switch_text_channel_t channel, const char
goto end; goto end;
} }
if (level == SWITCH_LOG_CONSOLE || !LOG_QUEUE || !THREAD_RUNNING) { if (level == SWITCH_LOG_CONSOLE || mods_loaded == 0 || !LOG_QUEUE || !THREAD_RUNNING) {
if (handle) { if (handle) {
int aok = 1; int aok = 1;
#ifndef WIN32 #ifndef WIN32
@ -276,9 +330,13 @@ SWITCH_DECLARE(void) switch_log_printf(switch_text_channel_t channel, const char
} }
#endif #endif
if (aok) { if (aok) {
if (COLORIZE) {
fprintf(handle, "%s%s%s", COLORS[level], data, SWITCH_SEQ_DEFAULT_COLOR);
} else {
fprintf(handle, "%s", data); fprintf(handle, "%s", data);
} }
} }
}
} else if (level <= MAX_LEVEL) { } else if (level <= MAX_LEVEL) {
switch_log_node_t *node; switch_log_node_t *node;
void *pop = NULL; void *pop = NULL;
@ -318,7 +376,7 @@ SWITCH_DECLARE(void) switch_log_printf(switch_text_channel_t channel, const char
} }
} }
SWITCH_DECLARE(switch_status_t) switch_log_init(switch_memory_pool_t *pool) SWITCH_DECLARE(switch_status_t) switch_log_init(switch_memory_pool_t *pool, switch_bool_t colorize)
{ {
switch_thread_t *thread; switch_thread_t *thread;
switch_threadattr_t *thd_attr;; switch_threadattr_t *thd_attr;;
@ -340,6 +398,20 @@ SWITCH_DECLARE(switch_status_t) switch_log_init(switch_memory_pool_t *pool)
while (!THREAD_RUNNING) { while (!THREAD_RUNNING) {
switch_yield(1000); switch_yield(1000);
} }
if (colorize) {
#ifdef WIN32
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (switch_core_get_console() == stdout && hStdout != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) {
wOldColorAttrs = csbiInfo.wAttributes;
COLORIZE = SWITCH_TRUE;
}
#else
COLORIZE = SWITCH_TRUE;
#endif
}
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }