A TypeScript logger integrating Pino with Azure Application Insights and correlationId support.
npm install appinsights-pino-loggerA lightweight, production-ready TypeScript logger built on Pino, designed for modern distributed applications.
It provides:
โก Fast, pretty, colorized logging
๐งต Automatic correlationId tracking via AsyncLocalStorage
โ๏ธ Optional Azure Application Insights integration
๐ Inline single-line log formatting (no JSON metadata blocks)
๐ง Runtime configuration through logger.init()
Ideal for microservices, Kafka consumers, API gateways, and distributed systems needing reliable request tracing.
---
| Feature | Description |
| ---------------------------------- | ---------------------------------------- |
| โก Fast Pino logging | Pretty output, timestamps, colorized |
| ๐งต AsyncLocalStorage correlationId | Automatic context propagation |
| โ๏ธ Optional Azure AI | Only used if installed + enabled |
| ๐งฉ Multiple log arguments | logger.info("a", 1, { b: 2 }) |
| ๐ง Runtime configuration | serviceName, version, log level, AI keys |
| ๐งผ Clean inline logs | No multi-line metadata in console |
| ๐ Severity mapping | Translates Pino โ Azure AI severity |
---
``bash`
npm install appinsights-pino-logger
Optional (only if you want Azure Telemetry):
`bash`
npm install applicationinsights
---
`ts
import { logger } from "appinsights-pino-logger";
// const { logger } = require("appinsights-pino-logger"); // CommonJS
logger.init({
serviceName: "billing-service",
version: "2.1.0",
level: "debug",
connectionString: process.env.APPINSIGHTS_CONNECTION_STRING,
enableAI: true
});
`
| Option | Type | Description |
| -------------------- | -------- | --------------------------- |
| serviceName | string | Name of your service |version
| | string | Version tag for logs |level
| | string | Log level (default: info) |timestamp
| | function | Custom timestamp formatter |connectionString
| | string | Azure AI connection string |instrumentationKey
| | string | Legacy Azure AI key |enableAI
| | boolean | Toggle AI logging |
---
`env
SERVICE_NAME=service-api
SERVICE_VERSION=1.0.0
LOG_LEVEL=debug
APPINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxxx...
ENABLE_APPINSIGHTS=true
`
---
`ts
import { logger } from "appinsights-pino-logger";
logger.info("Service started");
logger.debug("Debug details");
logger.error("Something went wrong");
console.log = logger.log; // optional override console.log
`
---
`ts
import { withContext, logger } from "appinsights-pino-logger";
withContext({ correlationId: "order-999" }, async () => {
logger.info("Processing order");
await new Promise(r => setTimeout(r, 200));
logger.info("Order completed");
});
`
---
Terminal output:
``
[2025-12-09 03:55:27] INFO: [correlationId: "test-corr-1232"][version: "1.2.0"] Payment created {"amount":100} USD {"userId":50}
๐น One clean line per log entry
๐น Optimized for local development readability
๐น No bulky multi-line metadata blocks
๐น Complete metadata still captured by Azure AI
---
Basic:
`kusto`
traces
| order by timestamp desc
Filter by correlationId:
`kusto`
traces
| where customDimensions.correlationId == "order-999"
---
`ts`
logger.info(
"Payment created",
{ amount: 100 },
"USD",
{ userId: 50 }
);
---
`ts
import express from "express";
import { withContext, logger } from "appinsights-pino-logger";
import { v4 as uuid } from "uuid";
logger.init({ serviceName: "express-api", version: "1.0.0" });
const app = express();
app.use((req, res, next) => {
const correlationId = req.headers["x-correlation-id"] || uuid();
withContext({ correlationId }, next);
});
app.get("/hello", (_, res) => {
logger.info("Request received");
res.send("Hello");
});
app.listen(3000, () => logger.info("Server running"));
`
---
`ts`
consumer.on("message", msg => {
withContext({ correlationId: msg.headers.correlationId }, () => {
logger.info("Message received", msg.value);
});
});
---
`ts``
process.on("beforeExit", () => {
logger.aiClient?.flush();
});
---
MIT