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
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}