@mastra/loggers 1.1.0 → 1.1.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @mastra/loggers
2
2
 
3
+ ## 1.1.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Removed 'component' field from pino-pretty log output to reduce noise in CLI logs ([#15146](https://github.com/mastra-ai/mastra/pull/15146))
8
+
9
+ - Updated dependencies [[`8db7663`](https://github.com/mastra-ai/mastra/commit/8db7663c9a9c735828094c359d2e327fd4f8fba3), [`715710d`](https://github.com/mastra-ai/mastra/commit/715710d12fa47cf88e09d41f13843eddc29327b0), [`378c6c4`](https://github.com/mastra-ai/mastra/commit/378c6c4755726e8d8cf83a14809b350b90d46c62), [`9f91fd5`](https://github.com/mastra-ai/mastra/commit/9f91fd538ab2a44f8cc740bcad8e51205f74fbea), [`ba6fa9c`](https://github.com/mastra-ai/mastra/commit/ba6fa9cc0f3e1912c49fd70d4c3bb8c44903ddaa)]:
10
+ - @mastra/core@1.24.0-alpha.1
11
+
3
12
  ## 1.1.0
4
13
 
5
14
  ### Minor Changes
@@ -3,7 +3,7 @@ name: mastra-loggers
3
3
  description: Documentation for @mastra/loggers. Use when working with @mastra/loggers APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/loggers"
6
- version: "1.1.0"
6
+ version: "1.1.1-alpha.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -17,7 +17,6 @@ Read the individual reference documents for detailed explanations and code examp
17
17
  ### Docs
18
18
 
19
19
  - [Logging](references/docs-observability-logging.md) - Learn how to use logging in Mastra to monitor execution, capture application behavior, and improve the accuracy of AI applications.
20
- - [Observability overview](references/docs-observability-overview.md) - Monitor and debug applications with Mastra's Observability features.
21
20
 
22
21
  ### Reference
23
22
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.0",
2
+ "version": "1.1.1-alpha.0",
3
3
  "package": "@mastra/loggers",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -22,13 +22,70 @@ export const mastra = new Mastra({
22
22
 
23
23
  > **Info:** Visit [PinoLogger](https://mastra.ai/reference/logging/pino-logger) for all available configuration options.
24
24
 
25
+ ## Logging to observability storage
26
+
27
+ When [observability](https://mastra.ai/docs/observability/overview) is configured, all logger calls are automatically forwarded to your observability storage. This means every `debug`, `info`, `warn`, `error`, and `trackException` call from your application and from Mastra's internal components appears alongside your traces.
28
+
29
+ No code changes are required. Mastra wraps the configured logger so that it writes to both the original logger (console, file, or custom transport) and the observability system simultaneously.
30
+
31
+ ### Configuring observability log level
32
+
33
+ You can control which log levels reach observability storage independently from your console logger. Add a `logging` option to your observability instance configuration:
34
+
35
+ ```typescript
36
+ import { Mastra } from '@mastra/core/mastra'
37
+ import { PinoLogger } from '@mastra/loggers'
38
+ import { Observability, DefaultExporter } from '@mastra/observability'
39
+
40
+ export const mastra = new Mastra({
41
+ logger: new PinoLogger({ name: 'Mastra', level: 'debug' }),
42
+ observability: new Observability({
43
+ configs: {
44
+ default: {
45
+ serviceName: 'my-app',
46
+ exporters: [new DefaultExporter()],
47
+ logging: {
48
+ enabled: true, // set to false to disable log forwarding
49
+ level: 'info', // minimum level: 'debug' | 'info' | 'warn' | 'error' | 'fatal'
50
+ },
51
+ },
52
+ },
53
+ }),
54
+ })
55
+ ```
56
+
57
+ In this example, the console logger outputs all levels starting from `debug`, but only `info` and above are written to observability storage. This keeps your storage clean while still having verbose console output during development.
58
+
59
+ | Option | Type | Default | Description |
60
+ | --------- | ---------- | --------- | ---------------------------------------------------------------------- |
61
+ | `enabled` | `boolean` | `true` | Set to `false` to disable all log forwarding to observability storage. |
62
+ | `level` | `LogLevel` | `'debug'` | Minimum severity level. Logs below this level are discarded. |
63
+
64
+ ### Querying logs
65
+
66
+ Logs written to observability storage are queryable through the Mastra client SDK:
67
+
68
+ ```typescript
69
+ import { MastraClient } from '@mastra/client-js'
70
+
71
+ const client = new MastraClient()
72
+
73
+ const logs = await client.listLogsVNext({
74
+ filters: { level: 'error' },
75
+ pagination: { page: 1, perPage: 50 },
76
+ orderBy: { field: 'timestamp', direction: 'desc' },
77
+ })
78
+ ```
79
+
80
+ When using a persistent storage backend like DuckDB or ClickHouse, logs survive restarts and are available for historical analysis.
81
+
25
82
  ## Customizing logs
26
83
 
27
84
  Mastra provides access to a logger instance via the `mastra.getLogger()` method, available inside both workflow steps and tools. The logger supports standard severity levels: `debug`, `info`, `warn`, and `error`.
28
85
 
29
86
  ### Logging from workflow steps
30
87
 
31
- Within a workflow step, access the logger via the `mastra` parameter inside the `execute` function. This allows you to log messages relevant to the steps execution.
88
+ Within a workflow step, access the logger via the `mastra` parameter inside the `execute` function. This allows you to log messages relevant to the step's execution.
32
89
 
33
90
  ```typescript
34
91
  import { createWorkflow, createStep } from "@mastra/core/workflows";
@@ -52,7 +109,7 @@ export const testWorkflow = createWorkflow({...})
52
109
 
53
110
  ### Logging from tools
54
111
 
55
- Similarly, tools have access to the logger instance via the `mastra` parameter. Use this to log tool specific activity during execution.
112
+ Similarly, tools have access to the logger instance via the `mastra` parameter. Use this to log tool-specific activity during execution.
56
113
 
57
114
  ```typescript
58
115
  import { createTool } from '@mastra/core/tools'
@@ -72,9 +129,7 @@ export const testTool = createTool({
72
129
 
73
130
  ### Logging with additional data
74
131
 
75
- Logger methods accept an optional second argument for additional data. This can be any value, such as an object, string, or number.
76
-
77
- In this example, the log message includes an object with a key of `agent` and a value of the `testAgent` instance.
132
+ Logger methods accept an optional second argument for additional data. Pass a structured object to make logs filterable in observability storage.
78
133
 
79
134
  ```typescript
80
135
  import { createWorkflow, createStep } from "@mastra/core/workflows";
package/dist/index.cjs CHANGED
@@ -25,7 +25,7 @@ var PinoLogger = class _PinoLogger extends logger.MastraLogger {
25
25
  prettyStream = pretty__default.default({
26
26
  colorize: true,
27
27
  levelFirst: true,
28
- ignore: "pid,hostname",
28
+ ignore: "pid,hostname,component",
29
29
  colorizeObjects: true,
30
30
  translateTime: "SYS:standard",
31
31
  singleLine: false
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pino.ts"],"names":["MastraLogger","pretty","pino","LogLevel"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LoggerTransport } from '@mastra/core/logger';\nimport { LogLevel, MastraLogger } from '@mastra/core/logger';\nimport pino from 'pino';\nimport pretty from 'pino-pretty';\n\ntype TransportMap = Record<string, LoggerTransport>;\n\nexport type { LogLevel } from '@mastra/core/logger';\n\nexport interface PinoLoggerOptions<CustomLevels extends string = never> {\n name?: string;\n level?: LogLevel;\n transports?: TransportMap;\n overrideDefaultTransports?: boolean;\n formatters?: pino.LoggerOptions['formatters'];\n redact?: pino.LoggerOptions['redact'];\n mixin?: pino.MixinFn<CustomLevels>;\n customLevels?: { [level in CustomLevels]: number };\n /**\n * When false, disables pino-pretty and outputs raw JSON.\n * Useful when sending logs to aggregators like Datadog,\n * Loki, or CloudWatch that expect single-line JSON per entry.\n * @default true\n */\n prettyPrint?: boolean;\n}\n\ninterface PinoLoggerInternalOptions<CustomLevels extends string = never> extends PinoLoggerOptions<CustomLevels> {\n /** @internal Used internally for child loggers */\n _logger?: pino.Logger<CustomLevels>;\n}\n\nexport class PinoLogger<CustomLevels extends string = never> extends MastraLogger {\n protected logger: pino.Logger<CustomLevels>;\n\n constructor(options: PinoLoggerOptions<CustomLevels> = {}) {\n super(options);\n\n const internalOptions = options as PinoLoggerInternalOptions<CustomLevels>;\n\n // If an existing pino logger is provided (for child loggers), use it directly\n if (internalOptions._logger) {\n this.logger = internalOptions._logger;\n return;\n }\n\n const shouldPrettyPrint = options.prettyPrint ?? true;\n let prettyStream: ReturnType<typeof pretty> | undefined = undefined;\n if (!options.overrideDefaultTransports && shouldPrettyPrint) {\n prettyStream = pretty({\n colorize: true,\n levelFirst: true,\n ignore: 'pid,hostname',\n colorizeObjects: true,\n translateTime: 'SYS:standard',\n singleLine: false,\n });\n }\n\n const transportsAry = [...this.getTransports().entries()];\n this.logger = pino(\n {\n name: options.name || 'app',\n level: options.level || LogLevel.INFO,\n formatters: options.formatters,\n redact: options.redact,\n mixin: options.mixin,\n customLevels: options.customLevels,\n },\n options.overrideDefaultTransports\n ? options?.transports?.default\n : transportsAry.length === 0\n ? prettyStream // undefined when prettyPrint:false → pino native JSON\n : pino.multistream([\n ...transportsAry.map(([, transport]) => ({\n stream: transport,\n level: options.level || LogLevel.INFO,\n })),\n ...(prettyStream // only add prettyStream to multistream if it exists\n ? [{ stream: prettyStream, level: options.level || LogLevel.INFO }]\n : []),\n ]),\n );\n }\n\n /**\n * Creates a child logger with additional bound context.\n * All logs from the child logger will include the bound context.\n *\n * @param bindings - Key-value pairs to include in all logs from this child logger\n * @returns A new PinoLogger instance with the bound context\n *\n * @example\n * ```typescript\n * const baseLogger = new PinoLogger({ name: 'MyApp' });\n *\n * // Create module-scoped logger\n * const serviceLogger = baseLogger.child({ module: 'UserService' });\n * serviceLogger.info('User created', { userId: '123' });\n * // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }\n *\n * // Create request-scoped logger\n * const requestLogger = baseLogger.child({ requestId: req.id });\n * requestLogger.error('Request failed', { err: error });\n * // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }\n * ```\n */\n child(bindings: Record<string, unknown>): PinoLogger<CustomLevels> {\n const childPino = this.logger.child(bindings);\n const childOptions: PinoLoggerInternalOptions<CustomLevels> = {\n name: this.name,\n level: this.level,\n transports: Object.fromEntries(this.transports),\n _logger: childPino,\n };\n return new PinoLogger(childOptions);\n }\n\n debug(message: string, args: Record<string, any> = {}): void {\n this.logger.debug(args, message);\n }\n\n info(message: string, args: Record<string, any> = {}): void {\n this.logger.info(args, message);\n }\n\n warn(message: string, args: Record<string, any> = {}): void {\n this.logger.warn(args, message);\n }\n\n error(message: string, args: Record<string, any> = {}): void {\n this.logger.error(args, message);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/pino.ts"],"names":["MastraLogger","pretty","pino","LogLevel"],"mappings":";;;;;;;;;;;;AAgCO,IAAM,UAAA,GAAN,MAAM,WAAA,SAAwDA,mBAAA,CAAa;AAAA,EACtE,MAAA;AAAA,EAEV,WAAA,CAAY,OAAA,GAA2C,EAAC,EAAG;AACzD,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,MAAM,eAAA,GAAkB,OAAA;AAGxB,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,SAAS,eAAA,CAAgB,OAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,QAAQ,WAAA,IAAe,IAAA;AACjD,IAAA,IAAI,YAAA,GAAsD,MAAA;AAC1D,IAAA,IAAI,CAAC,OAAA,CAAQ,yBAAA,IAA6B,iBAAA,EAAmB;AAC3D,MAAA,YAAA,GAAeC,uBAAA,CAAO;AAAA,QACpB,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ,wBAAA;AAAA,QACR,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,cAAA;AAAA,QACf,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,gBAAgB,CAAC,GAAG,KAAK,aAAA,EAAc,CAAE,SAAS,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAASC,qBAAA;AAAA,MACZ;AAAA,QACE,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,QACtB,KAAA,EAAO,OAAA,CAAQ,KAAA,IAASC,eAAA,CAAS,IAAA;AAAA,QACjC,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,cAAc,OAAA,CAAQ;AAAA,OACxB;AAAA,MACA,OAAA,CAAQ,yBAAA,GACJ,OAAA,EAAS,UAAA,EAAY,OAAA,GACrB,cAAc,MAAA,KAAW,CAAA,GACvB,YAAA,GACAD,qBAAA,CAAK,WAAA,CAAY;AAAA,QACf,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,GAAG,SAAS,CAAA,MAAO;AAAA,UACvC,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,OAAA,CAAQ,KAAA,IAASC,eAAA,CAAS;AAAA,SACnC,CAAE,CAAA;AAAA,QACF,GAAI,YAAA,GACA,CAAC,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,OAAA,CAAQ,KAAA,IAASA,eAAA,CAAS,IAAA,EAAM,IAChE;AAAC,OACN;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,QAAA,EAA6D;AACjE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAwD;AAAA,MAC5D,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAA,EAAY,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAAA,MAC9C,OAAA,EAAS;AAAA,KACX;AACA,IAAA,OAAO,IAAI,YAAW,YAAY,CAAA;AAAA,EACpC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAiB,IAAA,GAA4B,EAAC,EAAS;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,IAAA,CAAK,OAAA,EAAiB,IAAA,GAA4B,EAAC,EAAS;AAC1D,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,IAAA,CAAK,OAAA,EAAiB,IAAA,GAA4B,EAAC,EAAS;AAC1D,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAiB,IAAA,GAA4B,EAAC,EAAS;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAAA,EACjC;AACF","file":"index.cjs","sourcesContent":["import type { LoggerTransport } from '@mastra/core/logger';\nimport { LogLevel, MastraLogger } from '@mastra/core/logger';\nimport pino from 'pino';\nimport pretty from 'pino-pretty';\n\ntype TransportMap = Record<string, LoggerTransport>;\n\nexport type { LogLevel } from '@mastra/core/logger';\n\nexport interface PinoLoggerOptions<CustomLevels extends string = never> {\n name?: string;\n level?: LogLevel;\n transports?: TransportMap;\n overrideDefaultTransports?: boolean;\n formatters?: pino.LoggerOptions['formatters'];\n redact?: pino.LoggerOptions['redact'];\n mixin?: pino.MixinFn<CustomLevels>;\n customLevels?: { [level in CustomLevels]: number };\n /**\n * When false, disables pino-pretty and outputs raw JSON.\n * Useful when sending logs to aggregators like Datadog,\n * Loki, or CloudWatch that expect single-line JSON per entry.\n * @default true\n */\n prettyPrint?: boolean;\n}\n\ninterface PinoLoggerInternalOptions<CustomLevels extends string = never> extends PinoLoggerOptions<CustomLevels> {\n /** @internal Used internally for child loggers */\n _logger?: pino.Logger<CustomLevels>;\n}\n\nexport class PinoLogger<CustomLevels extends string = never> extends MastraLogger {\n protected logger: pino.Logger<CustomLevels>;\n\n constructor(options: PinoLoggerOptions<CustomLevels> = {}) {\n super(options);\n\n const internalOptions = options as PinoLoggerInternalOptions<CustomLevels>;\n\n // If an existing pino logger is provided (for child loggers), use it directly\n if (internalOptions._logger) {\n this.logger = internalOptions._logger;\n return;\n }\n\n const shouldPrettyPrint = options.prettyPrint ?? true;\n let prettyStream: ReturnType<typeof pretty> | undefined = undefined;\n if (!options.overrideDefaultTransports && shouldPrettyPrint) {\n prettyStream = pretty({\n colorize: true,\n levelFirst: true,\n ignore: 'pid,hostname,component',\n colorizeObjects: true,\n translateTime: 'SYS:standard',\n singleLine: false,\n });\n }\n\n const transportsAry = [...this.getTransports().entries()];\n this.logger = pino(\n {\n name: options.name || 'app',\n level: options.level || LogLevel.INFO,\n formatters: options.formatters,\n redact: options.redact,\n mixin: options.mixin,\n customLevels: options.customLevels,\n },\n options.overrideDefaultTransports\n ? options?.transports?.default\n : transportsAry.length === 0\n ? prettyStream // undefined when prettyPrint:false → pino native JSON\n : pino.multistream([\n ...transportsAry.map(([, transport]) => ({\n stream: transport,\n level: options.level || LogLevel.INFO,\n })),\n ...(prettyStream // only add prettyStream to multistream if it exists\n ? [{ stream: prettyStream, level: options.level || LogLevel.INFO }]\n : []),\n ]),\n );\n }\n\n /**\n * Creates a child logger with additional bound context.\n * All logs from the child logger will include the bound context.\n *\n * @param bindings - Key-value pairs to include in all logs from this child logger\n * @returns A new PinoLogger instance with the bound context\n *\n * @example\n * ```typescript\n * const baseLogger = new PinoLogger({ name: 'MyApp' });\n *\n * // Create module-scoped logger\n * const serviceLogger = baseLogger.child({ module: 'UserService' });\n * serviceLogger.info('User created', { userId: '123' });\n * // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }\n *\n * // Create request-scoped logger\n * const requestLogger = baseLogger.child({ requestId: req.id });\n * requestLogger.error('Request failed', { err: error });\n * // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }\n * ```\n */\n child(bindings: Record<string, unknown>): PinoLogger<CustomLevels> {\n const childPino = this.logger.child(bindings);\n const childOptions: PinoLoggerInternalOptions<CustomLevels> = {\n name: this.name,\n level: this.level,\n transports: Object.fromEntries(this.transports),\n _logger: childPino,\n };\n return new PinoLogger(childOptions);\n }\n\n debug(message: string, args: Record<string, any> = {}): void {\n this.logger.debug(args, message);\n }\n\n info(message: string, args: Record<string, any> = {}): void {\n this.logger.info(args, message);\n }\n\n warn(message: string, args: Record<string, any> = {}): void {\n this.logger.warn(args, message);\n }\n\n error(message: string, args: Record<string, any> = {}): void {\n this.logger.error(args, message);\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ var PinoLogger = class _PinoLogger extends MastraLogger {
18
18
  prettyStream = pretty({
19
19
  colorize: true,
20
20
  levelFirst: true,
21
- ignore: "pid,hostname",
21
+ ignore: "pid,hostname,component",
22
22
  colorizeObjects: true,
23
23
  translateTime: "SYS:standard",
24
24
  singleLine: false
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pino.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { LoggerTransport } from '@mastra/core/logger';\nimport { LogLevel, MastraLogger } from '@mastra/core/logger';\nimport pino from 'pino';\nimport pretty from 'pino-pretty';\n\ntype TransportMap = Record<string, LoggerTransport>;\n\nexport type { LogLevel } from '@mastra/core/logger';\n\nexport interface PinoLoggerOptions<CustomLevels extends string = never> {\n name?: string;\n level?: LogLevel;\n transports?: TransportMap;\n overrideDefaultTransports?: boolean;\n formatters?: pino.LoggerOptions['formatters'];\n redact?: pino.LoggerOptions['redact'];\n mixin?: pino.MixinFn<CustomLevels>;\n customLevels?: { [level in CustomLevels]: number };\n /**\n * When false, disables pino-pretty and outputs raw JSON.\n * Useful when sending logs to aggregators like Datadog,\n * Loki, or CloudWatch that expect single-line JSON per entry.\n * @default true\n */\n prettyPrint?: boolean;\n}\n\ninterface PinoLoggerInternalOptions<CustomLevels extends string = never> extends PinoLoggerOptions<CustomLevels> {\n /** @internal Used internally for child loggers */\n _logger?: pino.Logger<CustomLevels>;\n}\n\nexport class PinoLogger<CustomLevels extends string = never> extends MastraLogger {\n protected logger: pino.Logger<CustomLevels>;\n\n constructor(options: PinoLoggerOptions<CustomLevels> = {}) {\n super(options);\n\n const internalOptions = options as PinoLoggerInternalOptions<CustomLevels>;\n\n // If an existing pino logger is provided (for child loggers), use it directly\n if (internalOptions._logger) {\n this.logger = internalOptions._logger;\n return;\n }\n\n const shouldPrettyPrint = options.prettyPrint ?? true;\n let prettyStream: ReturnType<typeof pretty> | undefined = undefined;\n if (!options.overrideDefaultTransports && shouldPrettyPrint) {\n prettyStream = pretty({\n colorize: true,\n levelFirst: true,\n ignore: 'pid,hostname',\n colorizeObjects: true,\n translateTime: 'SYS:standard',\n singleLine: false,\n });\n }\n\n const transportsAry = [...this.getTransports().entries()];\n this.logger = pino(\n {\n name: options.name || 'app',\n level: options.level || LogLevel.INFO,\n formatters: options.formatters,\n redact: options.redact,\n mixin: options.mixin,\n customLevels: options.customLevels,\n },\n options.overrideDefaultTransports\n ? options?.transports?.default\n : transportsAry.length === 0\n ? prettyStream // undefined when prettyPrint:false → pino native JSON\n : pino.multistream([\n ...transportsAry.map(([, transport]) => ({\n stream: transport,\n level: options.level || LogLevel.INFO,\n })),\n ...(prettyStream // only add prettyStream to multistream if it exists\n ? [{ stream: prettyStream, level: options.level || LogLevel.INFO }]\n : []),\n ]),\n );\n }\n\n /**\n * Creates a child logger with additional bound context.\n * All logs from the child logger will include the bound context.\n *\n * @param bindings - Key-value pairs to include in all logs from this child logger\n * @returns A new PinoLogger instance with the bound context\n *\n * @example\n * ```typescript\n * const baseLogger = new PinoLogger({ name: 'MyApp' });\n *\n * // Create module-scoped logger\n * const serviceLogger = baseLogger.child({ module: 'UserService' });\n * serviceLogger.info('User created', { userId: '123' });\n * // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }\n *\n * // Create request-scoped logger\n * const requestLogger = baseLogger.child({ requestId: req.id });\n * requestLogger.error('Request failed', { err: error });\n * // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }\n * ```\n */\n child(bindings: Record<string, unknown>): PinoLogger<CustomLevels> {\n const childPino = this.logger.child(bindings);\n const childOptions: PinoLoggerInternalOptions<CustomLevels> = {\n name: this.name,\n level: this.level,\n transports: Object.fromEntries(this.transports),\n _logger: childPino,\n };\n return new PinoLogger(childOptions);\n }\n\n debug(message: string, args: Record<string, any> = {}): void {\n this.logger.debug(args, message);\n }\n\n info(message: string, args: Record<string, any> = {}): void {\n this.logger.info(args, message);\n }\n\n warn(message: string, args: Record<string, any> = {}): void {\n this.logger.warn(args, message);\n }\n\n error(message: string, args: Record<string, any> = {}): void {\n this.logger.error(args, message);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/pino.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { LoggerTransport } from '@mastra/core/logger';\nimport { LogLevel, MastraLogger } from '@mastra/core/logger';\nimport pino from 'pino';\nimport pretty from 'pino-pretty';\n\ntype TransportMap = Record<string, LoggerTransport>;\n\nexport type { LogLevel } from '@mastra/core/logger';\n\nexport interface PinoLoggerOptions<CustomLevels extends string = never> {\n name?: string;\n level?: LogLevel;\n transports?: TransportMap;\n overrideDefaultTransports?: boolean;\n formatters?: pino.LoggerOptions['formatters'];\n redact?: pino.LoggerOptions['redact'];\n mixin?: pino.MixinFn<CustomLevels>;\n customLevels?: { [level in CustomLevels]: number };\n /**\n * When false, disables pino-pretty and outputs raw JSON.\n * Useful when sending logs to aggregators like Datadog,\n * Loki, or CloudWatch that expect single-line JSON per entry.\n * @default true\n */\n prettyPrint?: boolean;\n}\n\ninterface PinoLoggerInternalOptions<CustomLevels extends string = never> extends PinoLoggerOptions<CustomLevels> {\n /** @internal Used internally for child loggers */\n _logger?: pino.Logger<CustomLevels>;\n}\n\nexport class PinoLogger<CustomLevels extends string = never> extends MastraLogger {\n protected logger: pino.Logger<CustomLevels>;\n\n constructor(options: PinoLoggerOptions<CustomLevels> = {}) {\n super(options);\n\n const internalOptions = options as PinoLoggerInternalOptions<CustomLevels>;\n\n // If an existing pino logger is provided (for child loggers), use it directly\n if (internalOptions._logger) {\n this.logger = internalOptions._logger;\n return;\n }\n\n const shouldPrettyPrint = options.prettyPrint ?? true;\n let prettyStream: ReturnType<typeof pretty> | undefined = undefined;\n if (!options.overrideDefaultTransports && shouldPrettyPrint) {\n prettyStream = pretty({\n colorize: true,\n levelFirst: true,\n ignore: 'pid,hostname,component',\n colorizeObjects: true,\n translateTime: 'SYS:standard',\n singleLine: false,\n });\n }\n\n const transportsAry = [...this.getTransports().entries()];\n this.logger = pino(\n {\n name: options.name || 'app',\n level: options.level || LogLevel.INFO,\n formatters: options.formatters,\n redact: options.redact,\n mixin: options.mixin,\n customLevels: options.customLevels,\n },\n options.overrideDefaultTransports\n ? options?.transports?.default\n : transportsAry.length === 0\n ? prettyStream // undefined when prettyPrint:false → pino native JSON\n : pino.multistream([\n ...transportsAry.map(([, transport]) => ({\n stream: transport,\n level: options.level || LogLevel.INFO,\n })),\n ...(prettyStream // only add prettyStream to multistream if it exists\n ? [{ stream: prettyStream, level: options.level || LogLevel.INFO }]\n : []),\n ]),\n );\n }\n\n /**\n * Creates a child logger with additional bound context.\n * All logs from the child logger will include the bound context.\n *\n * @param bindings - Key-value pairs to include in all logs from this child logger\n * @returns A new PinoLogger instance with the bound context\n *\n * @example\n * ```typescript\n * const baseLogger = new PinoLogger({ name: 'MyApp' });\n *\n * // Create module-scoped logger\n * const serviceLogger = baseLogger.child({ module: 'UserService' });\n * serviceLogger.info('User created', { userId: '123' });\n * // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }\n *\n * // Create request-scoped logger\n * const requestLogger = baseLogger.child({ requestId: req.id });\n * requestLogger.error('Request failed', { err: error });\n * // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }\n * ```\n */\n child(bindings: Record<string, unknown>): PinoLogger<CustomLevels> {\n const childPino = this.logger.child(bindings);\n const childOptions: PinoLoggerInternalOptions<CustomLevels> = {\n name: this.name,\n level: this.level,\n transports: Object.fromEntries(this.transports),\n _logger: childPino,\n };\n return new PinoLogger(childOptions);\n }\n\n debug(message: string, args: Record<string, any> = {}): void {\n this.logger.debug(args, message);\n }\n\n info(message: string, args: Record<string, any> = {}): void {\n this.logger.info(args, message);\n }\n\n warn(message: string, args: Record<string, any> = {}): void {\n this.logger.warn(args, message);\n }\n\n error(message: string, args: Record<string, any> = {}): void {\n this.logger.error(args, message);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/loggers",
3
- "version": "1.1.0",
3
+ "version": "1.1.1-alpha.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "files": [
@@ -76,9 +76,9 @@
76
76
  "tsup": "^8.5.1",
77
77
  "typescript": "^5.9.3",
78
78
  "vitest": "4.0.18",
79
- "@internal/lint": "0.0.75",
80
- "@mastra/core": "1.18.0",
81
- "@internal/types-builder": "0.0.50"
79
+ "@internal/lint": "0.0.80",
80
+ "@internal/types-builder": "0.0.55",
81
+ "@mastra/core": "1.24.0-alpha.1"
82
82
  },
83
83
  "peerDependencies": {
84
84
  "@mastra/core": ">=1.0.0-0 <2.0.0-0"
@@ -1,70 +0,0 @@
1
- # Observability overview
2
-
3
- Mastra provides observability features for AI applications. Monitor LLM operations, trace agent decisions, and debug complex workflows with tools that understand AI-specific patterns.
4
-
5
- ## Key features
6
-
7
- ### Tracing
8
-
9
- Specialized tracing for AI operations that captures:
10
-
11
- - **Model interactions**: Token usage, latency, prompts, and completions
12
- - **Agent execution**: Decision paths, tool calls, and memory operations
13
- - **Workflow steps**: Branching logic, parallel execution, and step outputs
14
- - **Automatic instrumentation**: Tracing with decorators
15
-
16
- ## Storage requirements
17
-
18
- The `DefaultExporter` persists traces to your configured storage backend. Not all storage providers support observability—for the full list, see [Storage Provider Support](https://mastra.ai/docs/observability/tracing/exporters/default).
19
-
20
- For production environments with high traffic, we recommend using **ClickHouse** for the observability domain via [composite storage](https://mastra.ai/reference/storage/composite). See [Production Recommendations](https://mastra.ai/docs/observability/tracing/exporters/default) for details.
21
-
22
- ## Quickstart
23
-
24
- Configure Observability in your Mastra instance:
25
-
26
- ```typescript
27
- import { Mastra } from '@mastra/core'
28
- import { PinoLogger } from '@mastra/loggers'
29
- import { LibSQLStore } from '@mastra/libsql'
30
- import {
31
- Observability,
32
- DefaultExporter,
33
- CloudExporter,
34
- SensitiveDataFilter,
35
- } from '@mastra/observability'
36
-
37
- export const mastra = new Mastra({
38
- logger: new PinoLogger(),
39
- storage: new LibSQLStore({
40
- id: 'mastra-storage',
41
- url: 'file:./mastra.db', // Storage is required for tracing
42
- }),
43
- observability: new Observability({
44
- configs: {
45
- default: {
46
- serviceName: 'mastra',
47
- exporters: [
48
- new DefaultExporter(), // Persists traces to storage for Mastra Studio
49
- new CloudExporter(), // Sends traces to Mastra Cloud (if MASTRA_CLOUD_ACCESS_TOKEN is set)
50
- ],
51
- spanOutputProcessors: [
52
- new SensitiveDataFilter(), // Redacts sensitive data like passwords, tokens, keys
53
- ],
54
- },
55
- },
56
- }),
57
- })
58
- ```
59
-
60
- > **Serverless environments:** The `file:./mastra.db` storage URL uses the local filesystem, which doesn't work in serverless environments like Vercel, AWS Lambda, or Cloudflare Workers. For serverless deployments, use external storage. See the [Vercel deployment guide](https://mastra.ai/guides/deployment/vercel) for a complete example.
61
-
62
- With this basic setup, you will see Traces and Logs in both Studio and in Mastra Cloud.
63
-
64
- We also support various external tracing providers like MLflow, Langfuse, Braintrust, and any OpenTelemetry-compatible platform (Datadog, New Relic, SigNoz, etc.). See more about this in the [Tracing](https://mastra.ai/docs/observability/tracing/overview) documentation.
65
-
66
- ## What's next?
67
-
68
- - **[Set up Tracing](https://mastra.ai/docs/observability/tracing/overview)**: Configure tracing for your application
69
- - **[Configure Logging](https://mastra.ai/docs/observability/logging)**: Add structured logging
70
- - **[API Reference](https://mastra.ai/reference/observability/tracing/instances)**: Detailed configuration options