diff --git a/common/log.h b/common/log.h index d0d5495af..9f45a1f37 100644 --- a/common/log.h +++ b/common/log.h @@ -115,19 +115,27 @@ inline std::string log_get_pid() } // Utility function for generating log file names with unique id based on thread id. -// invocation with LOG_FILENAME_GENERATOR( "llama", "log" ) creates a string "llama..log" +// invocation with log_filename_generator( "llama", "log" ) creates a string "llama..log" // where the number is a runtime id of the current thread. -#define LOG_FILENAME_GENERATOR(log_file_basename, log_file_extension) _log_filename_generator(log_file_basename, log_file_extension) +#define log_filename_generator(log_file_basename, log_file_extension) _log_filename_generator(log_file_basename, log_file_extension) // INTERNAL, DO NOT USE inline std::string _log_filename_generator(const std::string & log_file_basename, const std::string & log_file_extension) { - return std::string().append(log_file_basename).append(".").append(log_get_pid()).append(".").append(log_file_extension); + std::stringstream buf; + + buf << log_file_basename; + buf << "."; + buf << log_get_pid(); + buf << "."; + buf << log_file_extension; + + return buf.str(); } #ifndef LOG_DEFAULT_FILE_NAME -/**/#define LOG_DEFAULT_FILE_NAME LOG_FILENAME_GENERATOR("llama", "log") +/**/#define LOG_DEFAULT_FILE_NAME log_filename_generator("llama", "log") #endif // Utility for turning #define values into string literals @@ -412,7 +420,7 @@ inline FILE *_log_handler2(bool change = false, LogTriState disable = LogTriStat // Disables logs entirely at runtime. // Makes LOG() and LOG_TEE() produce no output, // untill enabled back. -#define LOG_DISABLE() _log_disable() +#define log_disable() _log_disable() // INTERNAL, DO NOT USE inline FILE *_log_disable() @@ -421,7 +429,7 @@ inline FILE *_log_disable() } // Enables logs at runtime. -#define LOG_ENABLE() _log_enable() +#define log_enable() _log_enable() // INTERNAL, DO NOT USE inline FILE *_log_enable() @@ -430,7 +438,7 @@ inline FILE *_log_enable() } // Sets target fir logs, either by a file name or FILE* pointer (stdout, stderr, or any valid FILE*) -#define LOG_SET_TARGET(target) _log_set_target(target) +#define log_set_target(target) _log_set_target(target) // INTERNAL, DO NOT USE inline FILE *_log_set_target(const std::string & filename) { return _log_handler1(true, LogTriStateSame, filename); } @@ -441,32 +449,32 @@ inline FILE *log_handler() { return _log_handler1(); } inline void log_test() { - LOG_DISABLE(); + log_disable(); LOG("01 Hello World to nobody, because logs are disabled!\n") - LOG_ENABLE(); + log_enable(); LOG("02 Hello World to default output, which is \"%s\" ( Yaaay, arguments! )!\n", LOG_STRINGIZE(LOG_TARGET)) LOG_TEE("03 Hello World to **both** default output and " LOG_TEE_TARGET_STRING "!\n") - LOG_SET_TARGET(stderr); + log_set_target(stderr); LOG("04 Hello World to stderr!\n") LOG_TEE("05 Hello World TEE with double printing to stderr prevented!\n") - LOG_SET_TARGET(LOG_DEFAULT_FILE_NAME); + log_set_target(LOG_DEFAULT_FILE_NAME); LOG("06 Hello World to default log file!\n") - LOG_SET_TARGET(stdout); + log_set_target(stdout); LOG("07 Hello World to stdout!\n") - LOG_SET_TARGET(LOG_DEFAULT_FILE_NAME); + log_set_target(LOG_DEFAULT_FILE_NAME); LOG("08 Hello World to default log file again!\n") - LOG_DISABLE(); + log_disable(); LOG("09 Hello World _1_ into the void!\n") - LOG_ENABLE(); + log_enable(); LOG("10 Hello World back from the void ( you should not see _1_ in the log or the output )!\n") - LOG_DISABLE(); - LOG_SET_TARGET("llama.anotherlog.log"); + log_disable(); + log_set_target("llama.anotherlog.log"); LOG("11 Hello World _2_ to nobody, new target was selected but logs are still disabled!\n") - LOG_ENABLE(); + log_enable(); LOG("12 Hello World this time in a new file ( you should not see _2_ in the log or the output )?\n") - LOG_SET_TARGET("llama.yetanotherlog.log"); + log_set_target("llama.yetanotherlog.log"); LOG("13 Hello World this time in yet new file?\n") - LOG_SET_TARGET(LOG_FILENAME_GENERATOR("llama_autonamed", "log")); + log_set_target(log_filename_generator("llama_autonamed", "log")); LOG("14 Hello World in log with generated filename!\n") #ifdef _WIN32 LOG_TEE("15 Hello msvc TEE without arguments\n") @@ -489,12 +497,12 @@ inline bool log_param_single_parse(const std::string & param) } else if (std::string("--log-disable") == param) // NOLINT { - LOG_DISABLE(); + log_disable(); return true; } else if (std::string("--log-enable") == param) { - LOG_ENABLE(); + log_enable(); return true; } @@ -509,7 +517,7 @@ inline bool log_param_pair_parse(bool check_but_dont_parse, const std::string & { return true; } - LOG_SET_TARGET(LOG_FILENAME_GENERATOR(next.empty() ? "unnamed" : next, "log")); + log_set_target(log_filename_generator(next.empty() ? "unnamed" : next, "log")); return true; } @@ -530,27 +538,27 @@ inline void log_print_usage() fprintf(stdout, " Log file will be tagged with unique ID and written as \"..log\"\n"); /* */ } -#define LOG_DUMP_CMDLINE(argc, argv) _log_dump_cmdline(argc, argv) +#define log_dump_cmdline(argc, argv) _log_dump_cmdline(argc, argv) // INTERNAL, DO NOT USE inline void _log_dump_cmdline(int argc, char **argv) { - std::string buf; + std::stringstream buf; for (int i = 0; i < argc; ++i) { if (std::string(argv[i]).find(' ') != std::string::npos) { - buf.append(" \"").append(argv[i]).append("\""); + buf << " \"" << argv[i] <<"\""; } else { - buf.append(" ").append(argv[i]); + buf << " " << argv[i]; } } - LOGLN("Cmd:%s", buf.c_str()) + LOGLN("Cmd:%s", buf.str().c_str()) } -#define LOG_TOSTR(var) _log_var_to_string(var).c_str() +#define log_tostr(var) _log_var_to_string(var).c_str() inline std::string _log_var_to_string(bool var) { @@ -564,8 +572,8 @@ inline std::string _log_var_to_string(std::string var) inline std::string _log_var_to_string(const std::vector & var) { - std::string buf; - buf.append("[ "); + std::stringstream buf; + buf << "[ "; bool first = true; for (auto e : var) { @@ -575,24 +583,26 @@ inline std::string _log_var_to_string(const std::vector & var) } else { - buf.append(", "); + buf << ", "; } - buf.append(std::to_string(e)); + buf << std::to_string(e); } - buf.append(" ]"); + buf << " ]"; - return buf; + return buf.str(); } #define LOG_TOKENS_TOSTR_PRETTY(ctx, tokens) \ [&tokens, &ctx]() \ { \ - std::string buf("[ "); \ + std::stringstream buf; \ + buf << "[ "; \ + \ bool first = true; \ for (const auto &token : tokens) \ { \ if (!first) \ - buf.append(", "); \ + buf << ", "; \ else \ first = false; \ \ @@ -606,13 +616,12 @@ inline std::string _log_var_to_string(const std::vector & var) detokenized.end()); \ \ buf \ - .append("'") \ - .append(detokenized) \ - .append("'") \ - .append(":") \ - .append(std::to_string(token)); \ + << "'" << detokenized << "'" \ + << ":" << std::to_string(token); \ } \ - return buf.append(" ]"); \ + buf << " ]"; \ + \ + return buf.str(); \ }() \ .c_str() diff --git a/examples/main/main.cpp b/examples/main/main.cpp index 436eeb717..7117db4b0 100644 --- a/examples/main/main.cpp +++ b/examples/main/main.cpp @@ -114,9 +114,9 @@ int main(int argc, char ** argv) { } #ifndef LOG_DISABLE_LOGS - LOG_SET_TARGET(LOG_FILENAME_GENERATOR("main", "log")); + log_set_target(log_filename_generator("main", "log")); LOG_TEE("Log start\n"); - LOG_DUMP_CMDLINE(argc,argv); + log_dump_cmdline(argc,argv); #endif // LOG_DISABLE_LOGS // TODO: Dump params ? @@ -266,7 +266,7 @@ int main(int argc, char ** argv) { embd_inp = session_tokens; } - LOG("prompt: \"%s\"\n", LOG_TOSTR(params.prompt)); + LOG("prompt: \"%s\"\n", log_tostr(params.prompt)); LOG("tokens: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd_inp)); // Should not run without any tokens @@ -280,7 +280,7 @@ int main(int argc, char ** argv) { int guidance_offset = 0; int original_prompt_len = 0; if (ctx_guidance) { - LOG("cfg_negative_prompt: \"%s\"\n", LOG_TOSTR(params.cfg_negative_prompt)); + LOG("cfg_negative_prompt: \"%s\"\n", log_tostr(params.cfg_negative_prompt)); guidance_inp = ::llama_tokenize(ctx_guidance, params.cfg_negative_prompt, add_bos); LOG("guidance_inp tokenized: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx_guidance, guidance_inp)); @@ -290,8 +290,8 @@ int main(int argc, char ** argv) { original_prompt_len = original_inp.size(); guidance_offset = (int)guidance_inp.size() - original_prompt_len; - LOG("original_prompt_len: %s", LOG_TOSTR(original_prompt_len)); - LOG("guidance_offset: %s", LOG_TOSTR(guidance_offset)); + LOG("original_prompt_len: %s", log_tostr(original_prompt_len)); + LOG("guidance_offset: %s", log_tostr(guidance_offset)); } const int n_ctx = llama_n_ctx(ctx); @@ -326,7 +326,7 @@ int main(int argc, char ** argv) { LOGLN( "recalculate the cached logits (check): embd_inp.empty() %s, n_matching_session_tokens %zu, embd_inp.size() %zu, session_tokens.size() %zu, embd_inp.size() %zu", - LOG_TOSTR(embd_inp.empty()), n_matching_session_tokens, embd_inp.size(), session_tokens.size(), embd_inp.size()); + log_tostr(embd_inp.empty()), n_matching_session_tokens, embd_inp.size(), session_tokens.size(), embd_inp.size()); // if we will use the cache for the full prompt without reaching the end of the cache, force // reevaluation of the last token token to recalculate the cached logits