跳至主要內容

PinoLogger

使用 new PinoLogger() 建立 Logger 實例後,便可透過其方法記錄不同嚴重程度的事件。

使用範例
使用範例 的直接連結

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { PinoLogger } from '@mastra/loggers'

export const mastra = new Mastra({
logger: new PinoLogger({
name: 'Mastra',
level: 'info',
}),
})

參數
參數 的直接連結

name:

string
用於分組及識別此 Logger 所產生日誌的標籤。

level:

"debug" | "info" | "warn" | "error"
設定最低日誌級別。低於此級別的訊息會被忽略。

transports:

Record<string, LoggerTransport>
用於持久儲存日誌的 transport 實例對照表。

overrideDefaultTransports?:

boolean
設為 true 時,停用預設的 console transport。

formatters?:

pino.LoggerOptions['formatters']
用於序列化日誌的自訂 Pino formatter。

redact?:

pino.LoggerOptions['redact']
從日誌輸出遮蔽敏感欄位的路徑或選項(Pino redact)。

prettyPrint?:

boolean
= true
設為 false 時,停用 pino-pretty 並寫入原始 JSON 行(適用於日誌彙集器)。

mixin?:

pino.MixinFn
會合併至每個日誌物件的 Pino mixin 函數(例如請求範圍內的 traceId 或其他共用元數據)。

customLevels?:

Record<string, number>
傳遞至 Pino 的自訂日誌級別及數值。標準嚴重程度仍會透過 debuginfowarnerror 記錄;額外級別則遵循 Pino 的自訂級別行為。

使用 mixin 豐富日誌資料
log-enrichment-with-mixin 的直接連結

如果想在每一行加入相同的結構化欄位(以便與其他服務互相對照),可使用 mixin

src/mastra/index.ts
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()
},
}),
})

自訂級別
自訂級別 的直接連結

customLevels 會直接傳遞至 Pino。PinoLogger 只公開 debuginfowarnerror;如要使用任何額外的級別名稱(例如 audit),請建立子類別,並將其轉送至底層 Pino 實例:

src/mastra/logger.ts
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 })

數值遵循 Pino 的排序方式(內置級別使用 10 至 60)。級別 35 位於 info(30)與 warn(40)之間,因此當 level: 'info' 時,infoaudit 行都會輸出。

檔案 transport(結構化日誌)
檔案 transport(結構化日誌) 的直接連結

使用 FileTransport 將結構化日誌寫入檔案。Logger 接受純文字訊息作為第一個引數,並接受結構化元數據作為第二個引數。兩者會在內部轉換為 BaseLogMessage,並持久儲存至已設定的檔案路徑。

src/mastra/loggers/file-transport.ts
import { FileTransport } from '@mastra/loggers/file'
import { PinoLogger } from '@mastra/loggers/pino'

export const fileLogger = new PinoLogger({
name: 'Mastra',
transports: { file: new FileTransport({ path: 'test-dir/test.log' }) },
level: 'warn',
})

檔案 transport 用法
檔案 transport 用法 的直接連結

fileLogger.warn('Low disk space', {
destinationPath: 'system',
type: 'WORKFLOW',
})

Upstash transport(遠端日誌接收端)
Upstash transport(遠端日誌接收端) 的直接連結

使用 UpstashTransport 將結構化日誌串流至遠端 Redis list。Logger 接受字串訊息及結構化元數據物件。它支援分散式環境的集中式日誌記錄,並可按 destinationPathtyperunId 篩選。

src/mastra/loggers/upstash-transport.ts
import { UpstashTransport } from '@mastra/loggers/upstash'
import { PinoLogger } from '@mastra/loggers/pino'

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 用法
Upstash transport 用法 的直接連結

upstashLogger.info('User signed in', {
destinationPath: 'auth',
type: 'AGENT',
runId: 'run_123',
})

自訂 transport
自訂 transport 的直接連結

你可以使用 createCustomTransport 工具函數建立自訂 transport,以整合任何日誌服務或串流。

Sentry transport 範例
Sentry transport 範例 的直接連結

使用 createCustomTransport 建立自訂 transport,並將其與 pino-sentry-transport 等第三方日誌串流整合。這樣便可將日誌轉送至 Sentry 等外部系統,以進行進階監察及可觀測性分析。

src/mastra/loggers/sentry-transport.ts
import { createCustomTransport } from '@mastra/core/loggers'
import { PinoLogger } from '@mastra/loggers/pino'
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 },
})