+11
-15
src/file_logger.zig
+11
-15
src/file_logger.zig
···
24
24
file: ?std.fs.File,
25
25
26
26
pub fn init(dir: std.fs.Dir) FileLogger {
27
-
var file: ?std.fs.File = null;
28
-
if (!environment.fileExists(dir, LOG_PATH)) {
29
-
file = dir.createFile(LOG_PATH, .{}) catch lbl: {
30
-
std.log.err("Failed to create log file.", .{});
31
-
break :lbl null;
32
-
};
33
-
} else {
34
-
file = dir.openFile(LOG_PATH, .{ .mode = .write_only }) catch lbl: {
35
-
std.log.err("Failed to open log file.", .{});
36
-
break :lbl null;
37
-
};
38
-
}
27
+
const file = dir.createFile(LOG_PATH, .{ .truncate = false, .read = true }) catch |err| {
28
+
std.log.err("Failed to create/open log file: {s}", .{@errorName(err)});
29
+
return .{ .dir = dir, .file = null };
30
+
};
39
31
40
32
return .{ .dir = dir, .file = file };
41
33
}
···
49
41
50
42
pub fn write(self: FileLogger, msg: []const u8, level: LogLevel) !void {
51
43
const file = if (self.file) |file| file else return error.NoLogFile;
52
-
if (try file.tryLock(std.fs.File.Lock.shared)) {
44
+
45
+
if (try file.tryLock(.exclusive)) {
53
46
defer file.unlock();
54
-
try file.seekFromEnd(0);
55
47
56
48
var buffer: [1024]u8 = undefined;
57
-
var file_writer = file.writer(&buffer).interface;
49
+
var file_writer_impl = file.writer(&buffer);
50
+
const file_writer = &file_writer_impl.interface;
51
+
try file_writer_impl.seekTo(file.getEndPos() catch 0);
52
+
58
53
try file_writer.print(
59
54
"({d}) {s}: {s}\n",
60
55
.{ std.time.timestamp(), LogLevel.toString(level), msg },
61
56
);
57
+
try file_writer.flush();
62
58
}
63
59
}
+5
-1
src/main.zig
+5
-1
src/main.zig
···
139
139
},
140
140
};
141
141
142
-
app.file_logger = if (config.config_dir) |dir| FileLogger.init(dir) else null;
142
+
app.file_logger = if (config.config_dir) |dir| FileLogger.init(dir) else logger: {
143
+
std.log.err("Failed to initialise file logger - no config directory found", .{});
144
+
break :logger null;
145
+
};
146
+
app.notification.loop = &app.loop;
143
147
144
148
try app.run();
145
149