completely revamped logging to a file
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 22 Feb 2023 21:43:06 +0000 (15:43 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 22 Feb 2023 21:43:06 +0000 (15:43 -0600)
core/os/file.onyx

index d80cdabf041ad0e6355664cb59a593fb51ae4dfb..53e742156bc1b88e5a5868403b159e02a8874365 100644 (file)
@@ -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);
+    }
 }