diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-06-28 21:27:10 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-06-28 21:54:53 +0200 |
commit | 7e26ff3c2631a232ea3bc20ed842c47cc5db7526 (patch) | |
tree | e1edcffaa20237d7eb12ab77b73f53e9a983d0ff /client/application.cpp | |
parent | b08b80d13ff8a6822364e792391473dc53913dca (diff) |
Replace log4cpp with custom log function
Also prints a simpler error to stderr for WARN or above so that
we print something on the commandline if something go wrong.
Diffstat (limited to 'client/application.cpp')
-rw-r--r-- | client/application.cpp | 91 |
1 files changed, 72 insertions, 19 deletions
diff --git a/client/application.cpp b/client/application.cpp index f32943e..8d2c34f 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -43,10 +43,9 @@ #include "tunnel_channel.h" #include "rect.h" #include "gui/gui.h" - -#include <log4cpp/BasicConfigurator.hh> -#include <log4cpp/FileAppender.hh> -#include <log4cpp/RollingFileAppender.hh> +#include <stdarg.h> +#include <stdio.h> +#include <time.h> #define STICKY_KEY_PIXMAP ALT_IMAGE_RES_ID #define STICKY_KEY_TIMEOUT 750 @@ -2096,30 +2095,84 @@ bool Application::process_cmd_line(int argc, char** argv) return true; } +#ifdef RED_DEBUG +static unsigned int log_level = LOG_DEBUG; +#else +static unsigned int log_level = LOG_INFO; +#endif + +static FILE *log_file = NULL; + +void spice_log_cleanup(void) +{ + if (log_file) { + fclose(log_file); + log_file = NULL; + } +} + +static inline std::string function_to_func_name(const std::string& f_name) +{ +#ifdef __GNUC__ + std::string name(f_name); + std::string::size_type end_pos = f_name.find('('); + if (end_pos == std::string::npos) { + return f_name; + } + std::string::size_type start = f_name.rfind(' ', end_pos); + if (start == std::string::npos) { + return name.substr(0, end_pos); + } + end_pos -= ++start; + return name.substr(start, end_pos); +#else + return f_name; +#endif +} + +void spice_log(unsigned int type, const char *function, const char *format, ...) +{ + std::string formated_message; + va_list ap; + const char *type_as_char[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; + const char *type_as_nice_char[] = { "Debug", "Info", "Warning", "Error", "Fatal error" }; + + if (type < log_level) { + return; + } + + assert(type <= LOG_FATAL); + + va_start(ap, format); + string_vprintf(formated_message, format, ap); + va_end(ap); + + if (type >= log_level && log_file != NULL) { + fprintf(log_file, "%ld %s [%llu:%llu] %s: %s\n", (long)time(NULL), type_as_char[type], + (long long int)Platform::get_process_id(), (long long int)Platform::get_thread_id(), + function_to_func_name(function).c_str(), + formated_message.c_str()); + fflush(log_file); + } + + if (type >= LOG_WARN) { + fprintf(stderr, "%s: %s\n", type_as_nice_char[type], formated_message.c_str()); + } +} + void Application::init_logger() { std::string log_file_name; + Platform::get_app_data_dir(log_file_name, app_name); Platform::path_append(log_file_name, "spicec.log"); - int fd = ::open(log_file_name.c_str(), O_CREAT | O_APPEND | O_WRONLY, 0644); + log_file = ::fopen(log_file_name.c_str(), "a"); - if (fd == -1) { - log4cpp::BasicConfigurator::configure(); + if (log_file == NULL) { + fprintf(stderr, "Failed to open log file %s\n", log_file_name.c_str()); return; } - - log4cpp::Category& root = log4cpp::Category::getRoot(); -#ifdef RED_DEBUG - root.setPriority(log4cpp::Priority::DEBUG); - root.removeAllAppenders(); - root.addAppender(new log4cpp::FileAppender("_", fd)); -#else - root.setPriority(log4cpp::Priority::INFO); - root.removeAllAppenders(); - ::close(fd); - root.addAppender(new log4cpp::RollingFileAppender("_", log_file_name)); -#endif } void Application::init_globals() |