diff options
Diffstat (limited to 'Source/charon/utils')
-rw-r--r-- | Source/charon/utils/logger.c | 13 | ||||
-rw-r--r-- | Source/charon/utils/logger.h | 10 | ||||
-rw-r--r-- | Source/charon/utils/logger_manager.c | 49 | ||||
-rw-r--r-- | Source/charon/utils/logger_manager.h | 32 |
4 files changed, 88 insertions, 16 deletions
diff --git a/Source/charon/utils/logger.c b/Source/charon/utils/logger.c index 51efa2b8c..c66de481e 100644 --- a/Source/charon/utils/logger.c +++ b/Source/charon/utils/logger.c @@ -192,7 +192,7 @@ static void log_bytes(private_logger_t *this, log_level_t loglevel, char *label, pthread_mutex_lock(&mutex); - format = "%s (%d bytes)"; + format = "%s (%d bytes @%p)"; this->prepend_prefix(this, loglevel, format, buffer); if (this->output == NULL) @@ -201,7 +201,7 @@ static void log_bytes(private_logger_t *this, log_level_t loglevel, char *label, } else { - fprintf(this->output, buffer, label, len); + fprintf(this->output, buffer, label, len, bytes); fprintf(this->output, "\n"); } @@ -294,6 +294,14 @@ static void disable_level(private_logger_t *this, log_level_t log_level) } /** + * Implementation of logger_t.set_output. + */ +static void set_output(private_logger_t *this, FILE * output) +{ + this->output = output; +} + +/** * Implementation of logger_t.get_level. */ static log_level_t get_level(private_logger_t *this) @@ -324,6 +332,7 @@ logger_t *logger_create(char *logger_name, log_level_t log_level, bool log_threa this->public.enable_level = (void(*)(logger_t*,log_level_t))enable_level; this->public.disable_level = (void(*)(logger_t*,log_level_t))disable_level; this->public.get_level = (log_level_t(*)(logger_t*))get_level; + this->public.set_output = (void(*)(logger_t*,FILE*))set_output; this->public.destroy = (void(*)(logger_t*))destroy; /* private functions */ diff --git a/Source/charon/utils/logger.h b/Source/charon/utils/logger.h index bdf5e180e..637915e8b 100644 --- a/Source/charon/utils/logger.h +++ b/Source/charon/utils/logger.h @@ -157,6 +157,16 @@ struct logger_t { void (*disable_level) (logger_t *this, log_level_t log_level); /** + * @brief Set the output of the logger. + * + * Use NULL for syslog. + * + * @param this logger_t object + * @param output file, where log output should be written + */ + void (*set_output) (logger_t *this, FILE *output); + + /** * @brief Get the currently used loglevel. * * @param this logger_t object diff --git a/Source/charon/utils/logger_manager.c b/Source/charon/utils/logger_manager.c index 05824e6bf..f5c71fc82 100644 --- a/Source/charon/utils/logger_manager.c +++ b/Source/charon/utils/logger_manager.c @@ -77,8 +77,8 @@ struct { { "CONFG", ERROR|CONTROL|AUDIT|LEVEL0, TRUE, NULL}, /* CONFIG */ { "ENCPL", ERROR|CONTROL|AUDIT|LEVEL0, TRUE, NULL}, /* ENCRYPTION_PAYLOAD */ { "PAYLD", ERROR|CONTROL|AUDIT|LEVEL0, TRUE, NULL}, /* PAYLOAD */ - { "DERDC", ERROR|CONTROL|AUDIT|RAW|PRIVATE|LEVEL3, TRUE, NULL}, /* DER_DECODER */ - { "DEREC", ERROR|CONTROL|AUDIT|RAW|PRIVATE|LEVEL3, TRUE, NULL}, /* DER_ENCODER */ + { "DERDC", ERROR|CONTROL|AUDIT|LEVEL0, TRUE, NULL}, /* DER_DECODER */ + { "DEREC", ERROR|CONTROL|AUDIT|LEVEL0, TRUE, NULL}, /* DER_ENCODER */ }; @@ -120,16 +120,54 @@ static log_level_t get_log_level (private_logger_manager_t *this, logger_context * Implementation of private_logger_manager_t.enable_log_level. */ static void enable_log_level(private_logger_manager_t *this, logger_context_t context, log_level_t level) -{ - this->loggers[context]->enable_level(this->loggers[context], level); +{ + if (context == ALL_LOGGERS) + { + for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) + { + this->loggers[context]->enable_level(this->loggers[context], level); + } + } + else + { + this->loggers[context]->enable_level(this->loggers[context], level); + } } /** * Implementation of private_logger_manager_t.disable_log_level. */ static void disable_log_level(private_logger_manager_t *this, logger_context_t context, log_level_t level) +{ + if (context == ALL_LOGGERS) + { + for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) + { + this->loggers[context]->disable_level(this->loggers[context], level); + } + } + else + { + this->loggers[context]->disable_level(this->loggers[context], level); + } +} + +/** + * Implementation of private_logger_manager_t.set_output. + */ +static void set_output(private_logger_manager_t *this, logger_context_t context, FILE *output) { - this->loggers[context]->disable_level(this->loggers[context], level); + if (context == ALL_LOGGERS) + { + for (context = 0; context < LOGGER_CONTEXT_ROOF; context++) + { + this->loggers[context]->set_output(this->loggers[context], output); + } + } + else + { + this->loggers[context]->set_output(this->loggers[context], output); + } } @@ -158,6 +196,7 @@ logger_manager_t *logger_manager_create(log_level_t default_log_level) this->public.get_log_level = (log_level_t (*)(logger_manager_t *, logger_context_t)) get_log_level; this->public.enable_log_level = (void (*)(logger_manager_t *, logger_context_t, log_level_t)) enable_log_level; this->public.disable_log_level = (void (*)(logger_manager_t *, logger_context_t, log_level_t)) disable_log_level; + this->public.set_output = (void (*)(logger_manager_t *, logger_context_t, FILE*)) set_output; this->public.destroy = (void(*)(logger_manager_t*))destroy; for (i = 0; i < LOGGER_CONTEXT_ROOF; i++) diff --git a/Source/charon/utils/logger_manager.h b/Source/charon/utils/logger_manager.h index 3614204ce..bc8f0e62f 100644 --- a/Source/charon/utils/logger_manager.h +++ b/Source/charon/utils/logger_manager.h @@ -36,6 +36,7 @@ typedef enum logger_context_t logger_context_t; * @ingroup utils */ enum logger_context_t { + ALL_LOGGERS = -1, PARSER = 0, GENERATOR, IKE_SA, @@ -89,7 +90,7 @@ struct logger_manager_t { logger_t *(*get_logger) (logger_manager_t *this, logger_context_t context); /** - * Returns the set log_level of a specific context or 0. + * @brief Returns the set log_level of a specific context. * * @param this calling object * @param context context to check level @@ -98,29 +99,42 @@ struct logger_manager_t { log_level_t (*get_log_level) (logger_manager_t *this, logger_context_t context); /** - * Enables a logger level of a specific context. + * @brief Enables a logger level of a specific context. + * + * Use context ALL_LOGGERS to manipulate all loggers. * * @param this calling object * @param context context to set level * @param log_level logger level to eanble */ void (*enable_log_level) (logger_manager_t *this, logger_context_t context,log_level_t log_level); - - + /** - * Disables a logger level of a specific context. + * @brief Disables a logger level of a specific context. + * + * Use context ALL_LOGGERS to manipulate all loggers. * * @param this calling object * @param context context to set level - * @param log_level logger level to disable + * @param log_level logger level to disable */ void (*disable_log_level) (logger_manager_t *this, logger_context_t context,log_level_t log_level); - - + + /** + * @brief Sets the output of a logger. + * + * Use context ALL_LOGGERS to redirect all loggers. + * + * @param this calling object + * @param context context to set output + * @param log_level logger level to disable + */ + void (*set_output) (logger_manager_t *this, logger_context_t context, FILE *output); + /** * @brief Destroys a logger_manager_t object. * - * All remaining managed logger_t objects are also destroyed. + * All managed logger_t objects are also destroyed. * * @param this logger_manager_t object */ |