Logging: Revamp default behavior and command line arguments

* Modify --log-level to accept error/warning/info/debug string values
* Add --log-show-source, now hidden by default
* Remove --log-show-basename, path is now on own line
* Add --log-show-memory
* Remove --log-show-timestamp, now always shown

Pull Request: https://projects.blender.org/blender/blender/pulls/140244
This commit is contained in:
Brecht Van Lommel
2025-06-12 02:19:59 +02:00
parent 9e0e860835
commit d5f84d0016
2 changed files with 54 additions and 25 deletions

View File

@@ -386,6 +386,10 @@ int main(int argc,
/* Initialize logging. */
CLG_init();
CLG_output_use_timestamp_set(true);
CLG_output_use_memory_set(false);
CLG_output_use_source_set(false);
CLG_output_use_basename_set(false);
CLG_fatal_fn_set(callback_clg_fatal);
C = CTX_create();

View File

@@ -718,9 +718,9 @@ static void print_help(bArgs *ba, bool all)
PRINT("Logging Options:\n");
BLI_args_print_arg_doc(ba, "--log");
BLI_args_print_arg_doc(ba, "--log-level");
BLI_args_print_arg_doc(ba, "--log-show-basename");
BLI_args_print_arg_doc(ba, "--log-show-memory");
BLI_args_print_arg_doc(ba, "--log-show-source");
BLI_args_print_arg_doc(ba, "--log-show-backtrace");
BLI_args_print_arg_doc(ba, "--log-show-timestamp");
BLI_args_print_arg_doc(ba, "--log-file");
PRINT("\n");
@@ -1150,34 +1150,60 @@ static int arg_handle_disable_liboverride_auto_resync(int /*argc*/,
static const char arg_handle_log_level_set_doc[] =
"<level>\n"
"\tSet the logging verbosity level (higher for more details) defaults to 1,\n"
"\tuse -1 to log all levels.";
"\tSet the logging verbosity level.\n"
"\n"
"\tfatal: Fatal errors only\n"
"\terror: Errors only\n"
"\twarning: Warnings and errors\n"
"\tinfo: General information, warnings and errors\n"
"\tdebug: Verbose messages for developers";
static int arg_handle_log_level_set(int argc, const char **argv, void * /*data*/)
{
const char *arg_id = "--log-level";
if (argc > 1) {
const char *err_msg = nullptr;
if (!parse_int_clamp(argv[1], nullptr, -1, INT_MAX, &G.log.level, &err_msg)) {
fprintf(stderr, "\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]);
if (STRCASEEQ(argv[1], "fatal")) {
/* TODO */
G.log.level = 1;
}
else {
else if (STRCASEEQ(argv[1], "error")) {
/* TODO */
G.log.level = 1;
}
else if (STRCASEEQ(argv[1], "warning")) {
/* TODO */
G.log.level = 1;
}
else if (STRCASEEQ(argv[1], "info")) {
G.log.level = 1;
}
else if (STRCASEEQ(argv[1], "debug")) {
G.log.level = 5;
}
else if (parse_int_clamp(argv[1], nullptr, -1, INT_MAX, &G.log.level, &err_msg)) {
if (G.log.level == -1) {
G.log.level = INT_MAX;
}
CLG_level_set(G.log.level);
}
else {
fprintf(stderr, "\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]);
return 1;
}
CLG_level_set(G.log.level);
return 1;
}
fprintf(stderr, "\nError: '%s' no args given.\n", arg_id);
return 0;
}
static const char arg_handle_log_show_basename_set_doc[] =
static const char arg_handle_log_show_source_set_doc[] =
"\n\t"
"Only show file name in output (not the leading path).";
static int arg_handle_log_show_basename_set(int /*argc*/, const char ** /*argv*/, void * /*data*/)
"Show source file and function name in output.";
static int arg_handle_log_show_source_set(int /*argc*/, const char ** /*argv*/, void * /*data*/)
{
CLG_output_use_basename_set(true);
CLG_output_use_source_set(true);
return 0;
}
@@ -1192,12 +1218,12 @@ static int arg_handle_log_show_backtrace_set(int /*argc*/, const char ** /*argv*
return 0;
}
static const char arg_handle_log_show_timestamp_set_doc[] =
static const char arg_handle_log_show_memory_set_doc[] =
"\n\t"
"Show a timestamp for each log message in seconds since start.";
static int arg_handle_log_show_timestamp_set(int /*argc*/, const char ** /*argv*/, void * /*data*/)
"Show memory usage for each log message.";
static int arg_handle_log_show_memory_set(int /*argc*/, const char ** /*argv*/, void * /*data*/)
{
CLG_output_use_timestamp_set(true);
CLG_output_use_memory_set(true);
return 0;
}
@@ -1230,13 +1256,12 @@ static int arg_handle_log_file_set(int argc, const char **argv, void * /*data*/)
static const char arg_handle_log_set_doc[] =
"<match>\n"
"\tEnable logging categories, taking a single comma separated argument.\n"
"\tMultiple categories can be matched using a '.*' suffix,\n"
"\tso '--log \"wm.*\"' logs every kind of window-manager message.\n"
"\tSub-string can be matched using a '*' prefix and suffix,\n"
"\tso '--log \"*undo*\"' logs every kind of undo-related message.\n"
"\tUse \"^\" prefix to ignore, so '--log \"*,^wm.operator.*\"' logs all except for "
"'wm.operators.*'\n"
"\tUse \"*\" to log everything.";
"\n"
"\t--log \"*\": log everything\n"
"\t--log \"event\": logs every category starting with \"event\"\n"
"\t--log \"render,cycles\": log both render and cycles messages\n"
"\t--log \"*mesh*\": log every category containing \"mesh\" substring\n"
"\t--log \"*,^operator\": log everything except operators, with ^prefix to exclude";
static int arg_handle_log_set(int argc, const char **argv, void * /*data*/)
{
const char *arg_id = "--log";
@@ -2681,9 +2706,9 @@ void main_args_setup(bContext *C, bArgs *ba, bool all)
* especially `bpy.appdir` since it's useful to show errors finding paths on startup. */
BLI_args_add(ba, nullptr, "--log", CB(arg_handle_log_set), ba);
BLI_args_add(ba, nullptr, "--log-level", CB(arg_handle_log_level_set), ba);
BLI_args_add(ba, nullptr, "--log-show-basename", CB(arg_handle_log_show_basename_set), ba);
BLI_args_add(ba, nullptr, "--log-show-source", CB(arg_handle_log_show_source_set), ba);
BLI_args_add(ba, nullptr, "--log-show-backtrace", CB(arg_handle_log_show_backtrace_set), ba);
BLI_args_add(ba, nullptr, "--log-show-timestamp", CB(arg_handle_log_show_timestamp_set), ba);
BLI_args_add(ba, nullptr, "--log-show-memory", CB(arg_handle_log_show_memory_set), ba);
BLI_args_add(ba, nullptr, "--log-file", CB(arg_handle_log_file_set), ba);
/* GPU backend selection should be part of #ARG_PASS_ENVIRONMENT for correct GPU context