From: Brendan Hansen Date: Wed, 22 Feb 2023 21:43:06 +0000 (-0600) Subject: completely revamped logging to a file X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=ed0225d5e5943c18d7775f5ede0e71a4ee924338;p=onyx.git completely revamped logging to a file --- diff --git a/core/os/file.onyx b/core/os/file.onyx index d80cdabf..53e74215 100644 --- a/core/os/file.onyx +++ b/core/os/file.onyx @@ -136,26 +136,56 @@ is_directory :: (path: str) -> bool { } -file_logger_open :: (filename: str, allocator := context.allocator) -> Logger { - file := new(File, allocator); + +// +// File Logging +// + +File_Logger :: struct { + file: ^File; + filename: str; + allocator: Allocator; + + old_logger: Logger; +} + +file_logger_open :: (filename: str, allocator := context.allocator) -> ^File_Logger { + file_logger := new(File_Logger, allocator); + file_logger.allocator = allocator; + file_logger.filename = filename; + + file_logger.file = new(File, allocator); error := os.FileError.None; - error, *file = open(filename, mode=.Append); - assert(error != .None, "Unable to open file for logging."); + error, *file_logger.file = open(filename, mode=.Append); + assert(error == .None, "Unable to open file for logging."); + + return file_logger; +} - return .{ file_logger_proc, file }; +file_logger_use :: (logger: ^File_Logger) { + logger.old_logger = context.logger; + context.logger = .{ file_logger_proc, logger }; } -file_logger_close :: (logger := context.logger) { - close(cast(^File) logger.data); +file_logger_close :: (logger: ^File_Logger) { + if logger.old_logger.data { + context.logger = logger.old_logger; + } - // @Robustness: this could be the wrong allocator if the context allocator wasn't used. - cfree(logger.data); + close(logger.file); + + raw_free(logger.allocator, logger.file); + raw_free(logger.allocator, logger); } #local -file_logger_proc :: (data: ^File, level: Log_Level, msg: str, module: str) { - writer := io.writer_make(data, 0); - io.write(^writer, msg); - io.write(^writer, "\n"); +file_logger_proc :: (logger: ^File_Logger, level: Log_Level, msg: str, module: str) { + writer := io.writer_make(logger.file, 0); + + if module { + io.write_format(^writer, "[{}][{}] {}\n", level, module, msg); + } else { + io.write_format(^writer, "[{}] {}\n", level, msg); + } }