From d8f0f1a1d360c08af9bdfae8c637e38cdf779237 Mon Sep 17 00:00:00 2001 From: mpc <mpc> Date: Sat, 3 Jul 2004 21:53:10 +0000 Subject: [PATCH] Added test for Logger and debugged it --- apps/enclave/libsockthread/src/logger.cpp | 60 +++++++++++++++++------ apps/enclave/libsockthread/src/logger.hpp | 50 +++++++++++++++---- apps/enclave/libsockthread/src/time.cpp | 2 +- 3 files changed, 87 insertions(+), 25 deletions(-) diff --git a/apps/enclave/libsockthread/src/logger.cpp b/apps/enclave/libsockthread/src/logger.cpp index c894978bde..99460bd595 100644 --- a/apps/enclave/libsockthread/src/logger.cpp +++ b/apps/enclave/libsockthread/src/logger.cpp @@ -28,12 +28,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <cassert> #include <cstdarg> #include <cstdio> #include <iostream> #include <string> using namespace std; +#include "mutex.hpp" #include "time.hpp" #include "logger.hpp" using namespace Libsockthread; @@ -91,19 +91,27 @@ void Logger::log(priority_t priority, const char* format, ...) string s; Time t; logger_m.lock(); - assert(logf != 0); - fprintf(logf, "%c@%s: ", ll, t.utc(s).c_str()); - vfprintf(logf, format, ap); - fputc('\n', logf); + if (logf != 0) { + /* + * Remember! If you change the format here, change it in the else too + */ + fprintf(logf, "%c %s ", ll, t.utc(s).c_str()); + vfprintf(logf, format, ap); + fputc('\n', logf); + if (fflush(logf) == EOF) { + cerr_m.lock(); + cerr << "fflush() failed: " << strerror(errno) << '\n'; + cerr_m.unlock(); + } + } else { + // if they don't have an open log file, just use stderr + fprintf(stderr, "%c %s ", ll, t.utc(s).c_str()); + vfprintf(stderr, format, ap); + fputc('\n', stderr); + } va_end(ap); - - if (fflush(logf) == EOF) { - cerr_m.lock(); - cerr << "fflush() failed: " << strerror(errno) << '\n'; - cerr_m.unlock(); - } logger_m.unlock(); return; @@ -115,16 +123,40 @@ void Logger::log(priority_t priority, const char* format, ...) * * file - file location to open */ -void Logger::open(const string& file) +bool Logger::open(const string& file) { close(); logger_m.lock(); logf = fopen(file.c_str(), "a"); logger_m.unlock(); - if (logf == NULL) { + if (logf != NULL) { + return true; + } else { cerr_m.lock(); cerr << "fopen() failed (" << file << "): " << strerror(errno) << '\n'; cerr_m.unlock(); - throw Logger_error("Error opening log file"); + return false; } } + +#ifdef UNIT_TEST +// g++ -Wall -c thread.cpp -o thread.o +// g++ -Wall -c mutex.cpp -o mutex.o +// g++ -Wall -c time.cpp -o time.o +// g++ -Wall -DUNIT_TEST -c logger.cpp -o logger.o +// g++ -Wall -DUNIT_TEST logger.o mutex.o thread.o time.o -o logger -lpthread +int main(void) +{ + Logger logger; + + logger.open("delete.me"); + logger.set_loglevel(Logger::MINOR); + logger.close(); + LWARNS("This should appear on stderr"); + logger.open("delete.me.also"); + LINFO("%s\n", "hey it works"); + LDEBUGS("This shouldn't be saved in the file."); + + return 0; +} +#endif // UNIT_TEST diff --git a/apps/enclave/libsockthread/src/logger.hpp b/apps/enclave/libsockthread/src/logger.hpp index a51f1b150d..47c26064be 100644 --- a/apps/enclave/libsockthread/src/logger.hpp +++ b/apps/enclave/libsockthread/src/logger.hpp @@ -31,6 +31,41 @@ #ifndef LIBSOCKTHREAD_LOGGER_HPP #define LIBSOCKTHREAD_LOGGER_HPP +/* + * Some helpful macros: + * + * LDEBUG - debugging messages + * LMINOR - unimportant messages + * LINFO - informational messages + * LWARN - errors we automatically recover from + * LERROR - major, important errors + * + * Obviously, these only work if your Logger object is called "logger" and is + * global + */ +// Prints out the file name, function name, and line number before the message +#define LDEBUG(format, ...) logger.log(Logger::DEBUG, "%s:%s:%d:" \ + format, __FILE__, __func__, __LINE__, __VA_ARGS__) +// This is the same as above, except it doesn't accept varargs +#define LDEBUGS(str) logger.log(Logger::DEBUG, "%s:%s:%d:" \ + str, __FILE__, __func__, __LINE__); +#define LMINOR(format, ...) logger.log(Logger::MINOR, "%s:%s:%d:" \ + format, __FILE__, __func__, __LINE__, __VA_ARGS__) +#define LMINORS(str) logger.log(Logger::MINOR, "%s:%s:%d:" \ + str, __FILE__, __func__, __LINE__); +#define LINFO(format, ...) logger.log(Logger::INFO, "%s:%s:%d:" \ + format, __FILE__, __func__, __LINE__, __VA_ARGS__) +#define LINFOS(str) logger.log(Logger::INFO, "%s:%s:%d:" \ + str, __FILE__, __func__, __LINE__); +#define LWARN(format, ...) logger.log(Logger::WARN, "%s:%s:%d:" \ + format, __FILE__, __func__, __LINE__, __VA_ARGS__) +#define LWARNS(str) logger.log(Logger::WARN, "%s:%s:%d:" \ + str, __FILE__, __func__, __LINE__); +#define LERROR(format, ...) logger.log(Logger::ERROR, "%s:%s:%d:" \ + format, __FILE__, __func__, __LINE__, __VA_ARGS__) +#define LERRORS(str) logger.log(Logger::ERROR, "%s:%s:%d:" \ + str, __FILE__, __func__, __LINE__); + namespace Libsockthread { class Logger { public: @@ -43,23 +78,18 @@ namespace Libsockthread { void close(void); void log(priority_t priority, const char* format, ...); - priority_t get_loglevel(void) const - { mutex.lock(); priority_t ll = loglevel; mutex.unlock(); return ll; } - void open(const string& file); // throws Logger_error + priority_t get_loglevel(void) + { logger_m.lock(); priority_t ll = loglevel; logger_m.unlock(); + return ll; } + bool open(const string& file); void set_loglevel(priority_t priority) - { mutex.lock(); loglevel = priority; mutex.unlock(); } + { logger_m.lock(); loglevel = priority; logger_m.unlock(); } private: Mutex cerr_m; FILE* logf; priority_t loglevel; Mutex logger_m; }; - - class Logger_error : public runtime_error { - public: - Logger_error(const string& s) - : runtime_error(s) { } - }; } #endif // LIBSOCKTHREAD_LOGGER_HPP diff --git a/apps/enclave/libsockthread/src/time.cpp b/apps/enclave/libsockthread/src/time.cpp index e67793261e..50927307ce 100644 --- a/apps/enclave/libsockthread/src/time.cpp +++ b/apps/enclave/libsockthread/src/time.cpp @@ -44,7 +44,7 @@ string& Time::utc(string &s) const tm = gmtime(&unixtime); char t[21]; - strftime(t, sizeof t, "%Y-%m-%d %H:%M:%SZ", tm); + strftime(t, sizeof t, "%Y-%m-%dT%H:%M:%SZ", tm); return s = t; } -- GitLab