Skip to Content

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", });