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 docs/plan-reorganization 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}