Logger Instance
A Logger instance is created by new PinoLogger()
and provides methods to record events at various severity levels. Depending on the logger type, messages may be written to the console, file, or an external service.
Example
// Using a console logger
const logger = new PinoLogger({ name: "Mastra", level: "info" });
logger.debug("Debug message"); // Won't be logged because level is INFO
logger.info({
message: "User action occurred",
destinationPath: "user-actions",
type: "AGENT",
}); // Logged
logger.error("An error occurred"); // Logged as ERROR
Methods
debug:
(message: BaseLogMessage | string, ...args: any[]) => void | Promise<void>
Write a DEBUG-level log. Only recorded if level ≤ DEBUG.
info:
(message: BaseLogMessage | string, ...args: any[]) => void | Promise<void>
Write an INFO-level log. Only recorded if level ≤ INFO.
warn:
(message: BaseLogMessage | string, ...args: any[]) => void | Promise<void>
Write a WARN-level log. Only recorded if level ≤ WARN.
error:
(message: BaseLogMessage | string, ...args: any[]) => void | Promise<void>
Write an ERROR-level log. Only recorded if level ≤ ERROR.
cleanup?:
() => Promise<void>
Cleanup resources held by the logger (e.g., network connections for Upstash). Not all loggers implement this.
Note: Some loggers require a BaseLogMessage
object (with message
, destinationPath
, type
fields). For instance, the File
and Upstash
loggers need structured messages.
File Transport (Structured Logs)
import { FileTransport } from "@mastra/loggers/file";
const fileLogger = new PinoLogger({
name: "Mastra",
transports: { file: new FileTransport({ path: "test-dir/test.log" }) },
level: "warn",
});
fileLogger.warn("Low disk space", {
destinationPath: "system",
type: "WORKFLOW",
});
Upstash Logger (Remote Log Drain)
import { UpstashTransport } from "@mastra/loggers/upstash";
const logger = new PinoLogger({
name: "Mastra",
transports: {
upstash: new UpstashTransport({
listName: "production-logs",
upstashUrl: process.env.UPSTASH_URL!,
upstashToken: process.env.UPSTASH_TOKEN!,
}),
},
level: "info",
});
logger.info({
message: "User signed in",
destinationPath: "auth",
type: "AGENT",
runId: "run_123",
});
Custom Transport
You can create custom transports using the createCustomTransport
utility to integrate with any logging service or stream.
Example: Sentry Integration
import { createCustomTransport } from "@mastra/core/loggers";
import pinoSentry from 'pino-sentry-transport';
const sentryStream = await pinoSentry({
sentry: {
dsn: 'YOUR_SENTRY_DSN',
_experiments: {
enableLogs: true,
},
},
});
const customTransport = createCustomTransport(sentryStream);
const logger = new PinoLogger({
name: "Mastra",
transports: { sentry: customTransport },
level: "info",
});