You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
1.4KB

  1. #include <chrono>
  2. #include "logger.hpp"
  3. #include "asset.hpp"
  4. namespace rack {
  5. namespace logger {
  6. static FILE *outputFile = NULL;
  7. static std::chrono::high_resolution_clock::time_point startTime;
  8. void init(bool devMode) {
  9. startTime = std::chrono::high_resolution_clock::now();
  10. if (devMode) {
  11. outputFile = stderr;
  12. }
  13. else {
  14. std::string logFilename = asset::local("log.txt");
  15. outputFile = fopen(logFilename.c_str(), "w");
  16. }
  17. }
  18. void destroy() {
  19. if (outputFile != stderr) {
  20. fclose(outputFile);
  21. }
  22. }
  23. static const char* const levelLabels[] = {
  24. "debug",
  25. "info",
  26. "warn",
  27. "fatal"
  28. };
  29. static const int levelColors[] = {
  30. 35,
  31. 34,
  32. 33,
  33. 31
  34. };
  35. static void logVa(Level level, const char *filename, int line, const char *format, va_list args) {
  36. auto nowTime = std::chrono::high_resolution_clock::now();
  37. int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - startTime).count();
  38. if (outputFile == stderr)
  39. fprintf(outputFile, "\x1B[%dm", levelColors[level]);
  40. fprintf(outputFile, "[%.03f %s %s:%d] ", duration / 1000.0, levelLabels[level], filename, line);
  41. if (outputFile == stderr)
  42. fprintf(outputFile, "\x1B[0m");
  43. vfprintf(outputFile, format, args);
  44. fprintf(outputFile, "\n");
  45. fflush(outputFile);
  46. }
  47. void log(Level level, const char *filename, int line, const char *format, ...) {
  48. va_list args;
  49. va_start(args, format);
  50. logVa(level, filename, line, format, args);
  51. va_end(args);
  52. }
  53. } // namespace logger
  54. } // namespace rack