import { Context } from "../context" export namespace Log { const ctx = Context.create<{ tags: Record }>() export function create(tags?: Record) { tags = tags || {} const result = { info(message?: any, extra?: Record) { const prefix = Object.entries({ ...use().tags, ...tags, ...extra, }) .map(([key, value]) => `${key}=${value}`) .join(" ") console.log(prefix, message) return result }, tag(key: string, value: string) { if (tags) tags[key] = value return result }, clone() { return Log.create({ ...tags }) }, } return result } export function provide(tags: Record, cb: () => R) { const existing = use() return ctx.provide( { tags: { ...existing.tags, ...tags, }, }, cb, ) } function use() { try { return ctx.use() } catch (e) { return { tags: {} } } } }