PinoLogger
A Logger instance is created using new PinoLogger() and provides methods to record events at severity levels.
Usage exampleUsage example的直接链接
import { Mastra } from '@mastra/core'
import { PinoLogger } from '@mastra/loggers'
export const mastra = new Mastra({
logger: new PinoLogger({
name: 'Mastra',
level: 'info',
}),
})
ParametersParameters的直接链接
name:
level:
transports:
overrideDefaultTransports?:
formatters?:
redact?:
redact).prettyPrint?:
pino-pretty and writes raw JSON lines (useful for log aggregators).mixin?:
traceId or other shared metadata).customLevels?:
debug, info, warn, and error; extra levels follow Pino’s custom-level behavior.serializers?:
error key uses Pino’s standard error serializer (alongside the built-in err), so logger.warn("...", { error }) records the type, message, and stack instead of an empty object.Log enrichment with mixinlog-enrichment-with-mixin的直接链接
Use mixin when you want the same structured fields on every line (for correlation with the rest of your services):
import { Mastra } from '@mastra/core'
import { PinoLogger } from '@mastra/loggers'
function getTraceContext() {
return { traceId: 'abc-123' }
}
export const mastra = new Mastra({
logger: new PinoLogger({
name: 'Mastra',
level: 'info',
mixin() {
return getTraceContext()
},
}),
})
Custom levelsCustom levels的直接链接
customLevels is passed through to Pino. PinoLogger only exposes debug, info, warn, and error; for any extra level name (for example audit), subclass and forward to the underlying Pino instance:
import { Mastra } from '@mastra/core'
import { PinoLogger } from '@mastra/loggers'
type AuditLevel = 'audit'
class MastraPinoWithAudit extends PinoLogger<AuditLevel> {
audit(message: string, meta: Record<string, unknown> = {}) {
this.logger.audit(meta, message)
}
}
const logger = new MastraPinoWithAudit({
name: 'Mastra',
level: 'info',
customLevels: { audit: 35 },
})
export const mastra = new Mastra({ logger })
Numeric values follow Pino’s ordering (built-in levels use 10 to 60). A level of 35 sits between info (30) and warn (40), so with level: 'info' both info and audit lines are emitted.
File transport (structured logs)File transport (structured logs)的直接链接
Writes structured logs to a file using the FileTransport. The logger accepts a plain message as the first argument and structured metadata as the second argument. These are internally converted to a BaseLogMessage and persisted to the configured file path.
import { FileTransport } from '@mastra/loggers/file'
import { PinoLogger } from '@mastra/loggers'
export const fileLogger = new PinoLogger({
name: 'Mastra',
transports: { file: new FileTransport({ path: 'test-dir/test.log' }) },
level: 'warn',
})
File transport usageFile transport usage的直接链接
fileLogger.warn('Low disk space', {
destinationPath: 'system',
type: 'WORKFLOW',
})
Upstash transport (remote log drain)Upstash transport (remote log drain)的直接链接
Streams structured logs to a remote Redis list using the UpstashTransport. The logger accepts a string message and a structured metadata object. It supports centralized logging for distributed environments, supporting filtering by destinationPath, type, and runId.
import { UpstashTransport } from '@mastra/loggers/upstash'
import { PinoLogger } from '@mastra/loggers'
export const upstashLogger = new PinoLogger({
name: 'Mastra',
transports: {
upstash: new UpstashTransport({
listName: 'production-logs',
upstashUrl: process.env.UPSTASH_URL!,
upstashToken: process.env.UPSTASH_TOKEN!,
}),
},
level: 'info',
})
Upstash transport usageUpstash transport usage的直接链接
upstashLogger.info('User signed in', {
destinationPath: 'auth',
type: 'AGENT',
runId: 'run_123',
})
Custom transportCustom transport的直接链接
You can create custom transports using the createCustomTransport utility to integrate with any logging service or stream.
Sentry transport exampleSentry transport example的直接链接
Creates a custom transport using createCustomTransport and integrates it with a third-party logging stream such as pino-sentry-transport. The custom transport forwards logs to an external system such as Sentry for advanced monitoring and observability.
import { createCustomTransport } from '@mastra/core/logger'
import { PinoLogger } from '@mastra/loggers'
import pinoSentry from 'pino-sentry-transport'
const sentryStream = await pinoSentry({
sentry: {
dsn: 'YOUR_SENTRY_DSN',
_experiments: {
enableLogs: true,
},
},
})
const customTransport = createCustomTransport(sentryStream)
export const sentryLogger = new PinoLogger({
name: 'Mastra',
level: 'info',
transports: { sentry: customTransport },
})