logquill 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -130,6 +130,222 @@ logger2.info("hello");
130
130
  console.log(sink.formatted); // ['{"timestamp":...,"message":"hello",...}']
131
131
  ```
132
132
 
133
+ ### SQL transports
134
+
135
+ `SQLiteTransport`, `PostgresTransport`, and `MySQLTransport` all extend
136
+ `BaseSQLTransport`, which owns a fixed `logs` table schema (`timestamp`,
137
+ `level`, `logger`, `message`, `meta`, plus `runId`/`spanId`/`parentSpanId`/
138
+ `traceId` for future trace correlation) and always batches inserts into one
139
+ parameterized multi-row `INSERT` — never one query per log call. Each
140
+ driver (`better-sqlite3`, `pg`, `mysql2`) is an **optional peer
141
+ dependency** — install only the one you use, or inject a pre-built
142
+ client/pool directly (handy for tests). Production schema/migrations are
143
+ your responsibility; pass `ensureSchema: true` to auto-create the table for
144
+ local dev/test only.
145
+
146
+ ```ts
147
+ import { Logger, SQLiteTransport } from "logquill";
148
+
149
+ const transport = new SQLiteTransport({ filename: "app.db", ensureSchema: true });
150
+ const logger = new Logger("app", { transports: [transport] });
151
+
152
+ logger.info("user signed up", { userId: "u_123" });
153
+ await new Promise((r) => setImmediate(r)); // let the batch flush in this example
154
+ logger.close();
155
+ ```
156
+
157
+ ```ts
158
+ import { Logger, PostgresTransport } from "logquill";
159
+ // npm install pg
160
+
161
+ const transport = new PostgresTransport({ connectionString: process.env.DATABASE_URL, maxRecords: 100 });
162
+ const logger = new Logger("app", { transports: [transport] });
163
+
164
+ logger.info("user signed up", { userId: "u_123" });
165
+ logger.close();
166
+ ```
167
+
168
+ ```ts
169
+ import { Logger, MySQLTransport } from "logquill";
170
+ // npm install mysql2
171
+
172
+ const transport = new MySQLTransport({ connectionString: "mysql://user:pass@localhost:3306/app" });
173
+ const logger = new Logger("app", { transports: [transport] });
174
+
175
+ logger.info("user signed up", { userId: "u_123" });
176
+ logger.close();
177
+ ```
178
+
179
+ ### NoSQL transports
180
+
181
+ `MongoDBTransport`, `DynamoDBTransport`, and `RedisTransport` are all
182
+ optional peer dependencies too — install only the driver you use, or
183
+ inject a pre-built client/collection directly.
184
+
185
+ ```ts
186
+ import { Logger, MongoDBTransport } from "logquill";
187
+ // npm install mongodb
188
+
189
+ const transport = new MongoDBTransport({
190
+ connectionString: "mongodb://localhost:27017",
191
+ database: "app",
192
+ collectionName: "logs",
193
+ });
194
+ const logger = new Logger("app", { transports: [transport] });
195
+ logger.info("user signed up", { userId: "u_123" });
196
+ ```
197
+
198
+ ```ts
199
+ import { Logger, DynamoDBTransport } from "logquill";
200
+ // npm install @aws-sdk/client-dynamodb
201
+
202
+ // Partition key is meta.runId (falling back to meta.traceId, then the
203
+ // logger name); sort key is `timestamp`. Batches are chunked to respect
204
+ // BatchWriteItem's 25-item cap.
205
+ const transport = new DynamoDBTransport({ tableName: "app-logs", region: "us-east-1" });
206
+ const logger = new Logger("app", { transports: [transport] });
207
+ logger.info("order placed", { runId: "run-42", orderId: "o_9" });
208
+ ```
209
+
210
+ ```ts
211
+ import { Logger, RedisTransport } from "logquill";
212
+ // npm install redis
213
+
214
+ // Writes to a Redis Stream via XADD — a fast local buffer/tail, not a
215
+ // durable system of record.
216
+ const transport = new RedisTransport({ url: "redis://localhost:6379", stream: "app:logs" });
217
+ const logger = new Logger("app", { transports: [transport] });
218
+ logger.info("cache miss", { key: "user:42" });
219
+ ```
220
+
221
+ ### Message queue transports
222
+
223
+ `KafkaTransport`, `RabbitMQTransport`, `SQSTransport`, and `PubSubTransport`
224
+ all extend `BaseQueueTransport`, which owns the "always batch, never
225
+ publish one message per log call" contract — each only implements
226
+ `publishBatch()` against its own driver's batch-publish API. Every
227
+ transport takes a `topic` option naming the destination (a Kafka topic, a
228
+ RabbitMQ queue, an SQS queue URL, or a Pub/Sub topic, respectively). Each
229
+ driver is an optional peer dependency — install only the one you use, or
230
+ inject a pre-built client.
231
+
232
+ ```ts
233
+ import { Logger, KafkaTransport } from "logquill";
234
+ // npm install kafkajs
235
+
236
+ // Each message is keyed by meta.runId (falling back to meta.traceId), so
237
+ // kafkajs's default partitioner keeps one run/trace on the same partition.
238
+ const transport = new KafkaTransport({ topic: "app-logs", brokers: ["localhost:9092"] });
239
+ const logger = new Logger("app", { transports: [transport] });
240
+ logger.info("order placed", { runId: "run-42", orderId: "o-123" });
241
+ logger.close();
242
+ ```
243
+
244
+ ```ts
245
+ import { Logger, RabbitMQTransport } from "logquill";
246
+ // npm install amqplib
247
+
248
+ const transport = new RabbitMQTransport({ topic: "app-logs", url: "amqp://localhost" });
249
+ const logger = new Logger("app", { transports: [transport] });
250
+ logger.warn("low disk space", { host: "worker-3" });
251
+ ```
252
+
253
+ ```ts
254
+ import { Logger, SQSTransport } from "logquill";
255
+ // npm install @aws-sdk/client-sqs
256
+
257
+ // SendMessageBatch caps a request at 10 messages; larger flushes are
258
+ // automatically chunked.
259
+ const transport = new SQSTransport({
260
+ topic: "https://sqs.us-east-1.amazonaws.com/123456789012/app-logs",
261
+ region: "us-east-1",
262
+ });
263
+ const logger = new Logger("app", { transports: [transport] });
264
+ logger.error("payment failed", { orderId: "o-123" });
265
+ ```
266
+
267
+ ```ts
268
+ import { Logger, PubSubTransport } from "logquill";
269
+ // npm install @google-cloud/pubsub
270
+
271
+ const transport = new PubSubTransport({ topic: "app-logs", projectId: "my-gcp-project" });
272
+ const logger = new Logger("app", { transports: [transport] });
273
+ logger.info("job completed", { jobId: "j-9" });
274
+ ```
275
+
276
+ ### Cloud-native transports
277
+
278
+ `CloudWatchTransport`, `CloudLoggingTransport` (GCP), and
279
+ `AppInsightsTransport` (Azure) are SDK-based — each driver is an optional
280
+ peer dependency, or inject a pre-built client. `DatadogTransport`,
281
+ `ElasticsearchTransport`, and `NewRelicTransport` are plain `fetch`-based
282
+ and need no extra dependency at all; pass `sender` to swap in a fake for
283
+ tests or an alternate backend.
284
+
285
+ ```ts
286
+ import { Logger, CloudWatchTransport } from "logquill";
287
+ // npm install @aws-sdk/client-cloudwatch-logs
288
+
289
+ const logger = new Logger("app", {
290
+ transports: [new CloudWatchTransport({ logGroupName: "/my-app", logStreamName: "prod", region: "us-east-1" })],
291
+ });
292
+ logger.info("service started");
293
+ logger.close(); // flushes buffered log events
294
+ ```
295
+
296
+ ```ts
297
+ import { Logger, CloudLoggingTransport } from "logquill";
298
+ // npm install @google-cloud/logging
299
+
300
+ const logger = new Logger("app", {
301
+ transports: [new CloudLoggingTransport({ projectId: "my-gcp-project", logName: "my-app" })],
302
+ });
303
+ logger.info("service started");
304
+ ```
305
+
306
+ ```ts
307
+ import { Logger, AppInsightsTransport } from "logquill";
308
+ // npm install applicationinsights
309
+
310
+ const logger = new Logger("app", {
311
+ transports: [new AppInsightsTransport({ connectionString: process.env.APPINSIGHTS_CONNECTION_STRING })],
312
+ });
313
+ logger.info("service started");
314
+ ```
315
+
316
+ ```ts
317
+ import { Logger, DatadogTransport } from "logquill";
318
+
319
+ const logger = new Logger("app", {
320
+ transports: [new DatadogTransport({ apiKey: process.env.DD_API_KEY!, site: "datadoghq.eu" })],
321
+ });
322
+ logger.info("service started");
323
+ ```
324
+
325
+ ```ts
326
+ import { Logger, ElasticsearchTransport } from "logquill";
327
+
328
+ const logger = new Logger("app", {
329
+ transports: [
330
+ new ElasticsearchTransport({ node: "https://localhost:9200", index: "app-logs", apiKey: process.env.ES_API_KEY }),
331
+ ],
332
+ });
333
+ logger.info("service started");
334
+ ```
335
+
336
+ ```ts
337
+ import { Logger, NewRelicTransport } from "logquill";
338
+
339
+ // `region` selects the ingest host ("US" default, or "EU") — set it
340
+ // explicitly for EU accounts, since a mismatched region is rejected.
341
+ // Batches are gzip-compressed, and a 429 pauses further sends until the
342
+ // `Retry-After` window elapses.
343
+ const logger = new Logger("app", {
344
+ transports: [new NewRelicTransport({ licenseKey: process.env.NEW_RELIC_LICENSE_KEY!, region: "EU" })],
345
+ });
346
+ logger.info("service started");
347
+ ```
348
+
133
349
  ## Plugins
134
350
 
135
351
  Plugins hook into the pipeline around each log call: `beforeLog(record)` can