(buf *bytes.Buffer, termW io.Writer, ent slog.SinkEntry)
| 200 | } |
| 201 | |
| 202 | func (f Formatter) Fmt(buf *bytes.Buffer, termW io.Writer, ent slog.SinkEntry) { |
| 203 | reset(buf, termW) |
| 204 | |
| 205 | // Timestamp + space |
| 206 | buf.WriteString(render(termW, timeStyle, ent.Time.Format(TimeFormat))) |
| 207 | buf.WriteString(" ") |
| 208 | |
| 209 | // Level label + two spaces |
| 210 | lvl := bracketedLevel(ent.Level) // e.g. "[debu]", "[info]" |
| 211 | buf.WriteString(render(termW, levelStyle(ent.Level), lvl)) |
| 212 | buf.WriteString(" ") |
| 213 | |
| 214 | // Logger names: name1.name2.name3: (no strings.Join allocation) |
| 215 | if len(ent.LoggerNames) > 0 { |
| 216 | for i, name := range ent.LoggerNames { |
| 217 | if i > 0 { |
| 218 | buf.WriteString(".") |
| 219 | } |
| 220 | buf.WriteString(quoteKey(name)) |
| 221 | } |
| 222 | buf.WriteString(": ") |
| 223 | } |
| 224 | |
| 225 | // Message (detect multiline) |
| 226 | var multilineKey string |
| 227 | var multilineVal string |
| 228 | msg := strings.TrimSpace(ent.Message) |
| 229 | if strings.Contains(msg, "\n") { |
| 230 | multilineKey = "msg" |
| 231 | multilineVal = msg |
| 232 | msg = quote("...") |
| 233 | } |
| 234 | buf.WriteString(msg) |
| 235 | |
| 236 | keyStyle := timeStyle |
| 237 | equalsStyle := timeStyle |
| 238 | |
| 239 | // Write trace/span directly (do not mutate ent.Fields) |
| 240 | if ent.SpanContext.IsValid() { |
| 241 | buf.WriteString(tab) |
| 242 | |
| 243 | buf.WriteString(render(termW, keyStyle, quoteKey("trace"))) |
| 244 | buf.WriteString(render(termW, equalsStyle, "=")) |
| 245 | buf.WriteString(ent.SpanContext.TraceID().String()) |
| 246 | buf.WriteString(tab) |
| 247 | buf.WriteString(render(termW, keyStyle, quoteKey("span"))) |
| 248 | buf.WriteString(render(termW, equalsStyle, "=")) |
| 249 | buf.WriteString(ent.SpanContext.SpanID().String()) |
| 250 | } |
| 251 | |
| 252 | // Find a multiline field without mutating ent.Fields. |
| 253 | multiIdx := -1 |
| 254 | for i, fld := range ent.Fields { |
| 255 | if multilineVal != "" { |
| 256 | break |
| 257 | } |
| 258 | var s string |
| 259 | switch v := fld.Value.(type) { |
no test coverage detected