Skip to content

Commit eb10e62

Browse files
committed
add src() for std.builtin.SourceLocation
1 parent 5cf5f4c commit eb10e62

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

readme.md

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ try logz.setup(allocator, .{
1818
1919
// other places in your code
2020
logz.info().string("path", req.url.path).int("ms", elapsed).log();
21+
22+
// The src(@src()) + err(err) combo is great for errors
23+
logz.err().src(@src()).err(err).log();
2124
```
2225

2326
Alternatively, 1 or more explicit pools can be created:
@@ -69,6 +72,7 @@ The logger can log:
6972
* stringSafe(key: []const u8, value: ?[]const u8 - assumes value doesn't need to be encoded
7073
* stringSafeZ(key: []const u8, value: ?[*:0]const u8 - assumes value doesn't need to be encoded
7174
* ctx(value: []const u8) - same as `stringSafe("@ctx", value)`
75+
* src(value: std.builtin.SourceLocation) - Logs an `std.builtin.SourceLocation`, the type of value you get from the `@src()` builtin.
7276

7377
### Log Level
7478
Pools are configured with a minimum log level:

src/kv.zig

+37-8
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,15 @@ pub const Kv = struct {
7474
pub fn ctx(self: *Kv, value: []const u8) void {
7575
if (!self.writeKeyForValue("@ctx", value.len)) return;
7676
const pos = self.pos;
77-
@memcpy(self.buf[pos..pos+value.len], value);
78-
self.pos = pos + value.len;
77+
const end = pos+value.len;
78+
@memcpy(self.buf[pos..end], value);
79+
self.pos = end;
80+
}
81+
82+
pub fn src(self: *Kv, value: std.builtin.SourceLocation) void {
83+
self.string("@src.file", value.file);
84+
self.string("@src.fn", value.fn_name);
85+
self.int("@src.line", value.line);
7986
}
8087

8188
pub fn string(self: *Kv, key: []const u8, nvalue: ?[]const u8) void {
@@ -103,8 +110,9 @@ pub const Kv = struct {
103110
}
104111

105112
if (!needs_escape) {
106-
@memcpy(self.buf[pos..pos+value.len], value);
107-
self.pos = pos + value.len;
113+
const end = pos+value.len;
114+
@memcpy(self.buf[pos..end], value);
115+
self.pos = end;
108116
return;
109117
}
110118

@@ -164,8 +172,9 @@ pub const Kv = struct {
164172
if (value) |v| {
165173
if (!self.writeKeyForValue(key, v.len)) return;
166174
const pos = self.pos;
167-
@memcpy(self.buf[pos..pos+v.len], v);
168-
self.pos = pos + v.len;
175+
const end = pos+v.len;
176+
@memcpy(self.buf[pos..end], v);
177+
self.pos = end;
169178
} else {
170179
self.writeNull(key);
171180
}
@@ -386,8 +395,9 @@ pub const Kv = struct {
386395
pos += 1;
387396
}
388397

389-
@memcpy(buf[pos..pos+key.len], key);
390-
pos += key.len;
398+
const end = pos+key.len;
399+
@memcpy(buf[pos..end], key);
400+
pos = end;
391401
buf[pos] = '=';
392402
self.pos = pos + 1;
393403
return true;
@@ -1047,6 +1057,25 @@ test "kv: ctx" {
10471057
}
10481058
}
10491059

1060+
test "kv: src" {
1061+
var pool = try Pool.init(t.allocator, .{.pool_size = 1});
1062+
defer pool.deinit();
1063+
1064+
var out = std.ArrayList(u8).init(t.allocator);
1065+
try out.ensureTotalCapacity(100);
1066+
defer out.deinit();
1067+
1068+
{
1069+
// normal strings
1070+
var kv = pool.acquire() orelse unreachable;
1071+
defer pool.release(kv);
1072+
1073+
kv.src(@src());
1074+
try kv.logTo(out.writer());
1075+
try t.expectString(out.items, "@ts=9999999999999 @src.file=src/kv.zig @src.fn=\"test.kv: src\" @src.line=1073\n");
1076+
}
1077+
}
1078+
10501079
test "kv: fmt" {
10511080
var pool = try Pool.init(t.allocator, .{.pool_size = 1});
10521081
defer pool.deinit();

src/logz.zig

+8
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ pub const Logger = struct {
7979
return self;
8080
}
8181

82+
pub fn src(self: Self, value: std.builtin.SourceLocation) Self {
83+
switch (self.inner) {
84+
.noop => {},
85+
inline else => |l| l.src(value),
86+
}
87+
return self;
88+
}
89+
8290
pub fn fmt(self: Self, key: []const u8, comptime format: []const u8, values: anytype) Self {
8391
switch (self.inner) {
8492
.noop => {},

0 commit comments

Comments
 (0)