WIP! A BB-style forum, on the ATmosphere! We're still working... we'll be back soon when we have something to show off!
node typescript hono htmx atproto
at main 61 lines 2.0 kB view raw
1import { 2 LoggerProvider, 3 SimpleLogRecordProcessor, 4} from "@opentelemetry/sdk-logs"; 5import { resourceFromAttributes } from "@opentelemetry/resources"; 6import { 7 ATTR_SERVICE_NAME, 8 ATTR_SERVICE_VERSION, 9} from "@opentelemetry/semantic-conventions"; 10import { StructuredLogExporter } from "./exporter.js"; 11import { AppLogger, resolveLogLevel } from "./logger.js"; 12import type { CreateLoggerOptions, Logger } from "./types.js"; 13 14/** 15 * Create a structured logger backed by the OpenTelemetry Logs SDK. 16 * 17 * Sets up a LoggerProvider with a Resource describing the service, 18 * and a StructuredLogExporter that writes NDJSON to stdout. 19 * 20 * When traces and metrics are added later, the same Resource 21 * can be shared across all signal providers. 22 * 23 * @example 24 * ```ts 25 * const logger = createLogger({ 26 * service: "atbb-appview", 27 * version: "0.1.0", 28 * environment: "development", 29 * level: "debug", 30 * }); 31 * 32 * logger.info("Server started", { port: 3000 }); 33 * logger.error("Query failed", { error: err.message, table: "posts" }); 34 * 35 * const reqLog = logger.child({ requestId: "abc-123" }); 36 * reqLog.info("Handling request"); 37 * ``` 38 */ 39export function createLogger(options: CreateLoggerOptions): Logger { 40 const resourceAttrs: Record<string, string> = { 41 [ATTR_SERVICE_NAME]: options.service, 42 }; 43 if (options.version) { 44 resourceAttrs[ATTR_SERVICE_VERSION] = options.version; 45 } 46 if (options.environment) { 47 resourceAttrs["deployment.environment.name"] = options.environment; 48 } 49 50 const resource = resourceFromAttributes(resourceAttrs); 51 const exporter = new StructuredLogExporter(); 52 const processor = new SimpleLogRecordProcessor(exporter); 53 54 const provider = new LoggerProvider({ resource }); 55 provider.addLogRecordProcessor(processor); 56 57 const otelLogger = provider.getLogger(options.service); 58 const minSeverity = resolveLogLevel(options.level ?? "info"); 59 60 return new AppLogger(otelLogger, provider, {}, minSeverity); 61}