diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index 0f44347f9..89e88d75e 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -30,17 +30,15 @@ Default_File_Logger_Opts :: Options{ File_Console_Logger_Data :: struct { - lowest_level: Level, file_handle: os.Handle, ident : string, } create_file_logger :: proc(h: os.Handle, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "") -> Logger { data := new(File_Console_Logger_Data); - data.lowest_level = lowest; data.file_handle = h; data.ident = ident; - return Logger{file_console_logger_proc, data, opt}; + return Logger{file_console_logger_proc, data, lowest, opt}; } destroy_file_logger ::proc(log : ^Logger) { @@ -52,10 +50,9 @@ destroy_file_logger ::proc(log : ^Logger) { create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logger_Opts, ident := "") -> Logger { data := new(File_Console_Logger_Data); - data.lowest_level = lowest; data.file_handle = os.INVALID_HANDLE; data.ident = ident; - return Logger{file_console_logger_proc, data, opt}; + return Logger{file_console_logger_proc, data, lowest, opt}; } destroy_console_logger ::proc(log : ^Logger) { @@ -65,8 +62,6 @@ destroy_console_logger ::proc(log : ^Logger) { file_console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { data := cast(^File_Console_Logger_Data)logger_data; - if level < data.lowest_level do return; - h : os.Handle; if(data.file_handle != os.INVALID_HANDLE) do h = data.file_handle; else do h = level <= Level.Error ? context.stdout : context.stderr; diff --git a/core/log/log.odin b/core/log/log.odin index e6a22a3a1..899f9274e 100644 --- a/core/log/log.odin +++ b/core/log/log.odin @@ -60,9 +60,10 @@ Logger_Proc :: #type proc(data: rawptr, level: Level, text: string, options: Opt Logger :: runtime.Logger; /* Logger :: struct { - procedure: Logger_Proc, - data: rawptr, - options: Options, + procedure: Logger_Proc, + data: rawptr, + lowest_level: Level, + options: Logger_Options, } */ @@ -74,7 +75,7 @@ create_multi_logger :: proc(logs: ..Logger) -> Logger { data := new(Multi_Logger_Data); data.loggers = make([]Logger, len(logs)); copy(data.loggers, logs); - return Logger{multi_logger_proc, data, nil}; + return Logger{multi_logger_proc, data, Level.Debug, nil}; } destroy_multi_logger :: proc(log : ^Logger) { @@ -98,18 +99,32 @@ nil_logger_proc :: proc(data: rawptr, level: Level, text: string, options: Optio } nil_logger :: proc() -> Logger { - return Logger{nil_logger_proc, nil, nil}; + return Logger{nil_logger_proc, nil, Level.Debug, nil}; } // TODO(bill): Should these be redesigned so that they are do not rely upon `package fmt`? -debug :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Debug, fmt_str=fmt_str, args=args, location=location); -info :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Info, fmt_str=fmt_str, args=args, location=location); -warn :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Warning, fmt_str=fmt_str, args=args, location=location); -error :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Error, fmt_str=fmt_str, args=args, location=location); -fatal :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Fatal, fmt_str=fmt_str, args=args, location=location); +debugf :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Debug, fmt_str=fmt_str, args=args, location=location); +infof :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Info, fmt_str=fmt_str, args=args, location=location); +warnf :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Warning, fmt_str=fmt_str, args=args, location=location); +errorf :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Error, fmt_str=fmt_str, args=args, location=location); +fatalf :: proc(fmt_str : string, args : ..any, location := #caller_location) do logf(level=Level.Fatal, fmt_str=fmt_str, args=args, location=location); + +debug :: proc(args : ..any, location := #caller_location) do log(level=Level.Debug, args=args, location=location); +info :: proc(args : ..any, location := #caller_location) do log(level=Level.Info, args=args, location=location); +warn :: proc(args : ..any, location := #caller_location) do log(level=Level.Warning, args=args, location=location); +error :: proc(args : ..any, location := #caller_location) do log(level=Level.Error, args=args, location=location); +fatal :: proc(args : ..any, location := #caller_location) do log(level=Level.Fatal, args=args, location=location); + +log :: proc(level : Level, args : ..any, location := #caller_location) { + logger := context.logger; + if level < logger.lowest_level do return; + str := fmt.tprint(..args); //NOTE(Hoej): While tprint isn't thread-safe, no logging is. + logger.procedure(logger.data, level, str, logger.options, location); +} logf :: proc(level : Level, fmt_str : string, args : ..any, location := #caller_location) { logger := context.logger; + if level < logger.lowest_level do return; str := len(args) > 0 ? fmt.tprintf(fmt_str, ..args) : fmt.tprint(fmt_str); //NOTE(Hoej): While tprint isn't thread-safe, no logging is. logger.procedure(logger.data, level, str, logger.options, location); } diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 4ffd716ef..d459a27b6 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -276,9 +276,10 @@ Logger_Options :: bit_set[Logger_Option]; Logger_Proc :: #type proc(data: rawptr, level: Logger_Level, text: string, options: Logger_Options, location := #caller_location); Logger :: struct { - procedure: Logger_Proc, - data: rawptr, - options: Logger_Options, + procedure: Logger_Proc, + data: rawptr, + lowest_level: Logger_Level, + options: Logger_Options, } Context :: struct { @@ -434,7 +435,7 @@ default_logger_proc :: proc(data: rawptr, level: Logger_Level, text: string, opt } default_logger :: proc() -> Logger { - return Logger{default_logger_proc, nil, nil}; + return Logger{default_logger_proc, nil, Logger_Level.Debug, nil}; }