@mastra/loggers 1.3.6-alpha.1 → 1.3.6-alpha.3
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/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-logging-pino-logger.md +3 -3
- package/dist/file/index.cjs +24 -19
- package/dist/file/index.cjs.map +1 -1
- package/dist/file/index.d.ts +1 -1
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +24 -19
- package/dist/file/index.js.map +1 -1
- package/package.json +2 -2
package/dist/docs/SKILL.md
CHANGED
|
@@ -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.3.6-alpha.
|
|
6
|
+
version: "1.3.6-alpha.3"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
@@ -98,7 +98,7 @@ Writes structured logs to a file using the `FileTransport`. The logger accepts a
|
|
|
98
98
|
|
|
99
99
|
```typescript
|
|
100
100
|
import { FileTransport } from '@mastra/loggers/file'
|
|
101
|
-
import { PinoLogger } from '@mastra/loggers
|
|
101
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
102
102
|
|
|
103
103
|
export const fileLogger = new PinoLogger({
|
|
104
104
|
name: 'Mastra',
|
|
@@ -122,7 +122,7 @@ Streams structured logs to a remote Redis list using the `UpstashTransport`. The
|
|
|
122
122
|
|
|
123
123
|
```typescript
|
|
124
124
|
import { UpstashTransport } from '@mastra/loggers/upstash'
|
|
125
|
-
import { PinoLogger } from '@mastra/loggers
|
|
125
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
126
126
|
|
|
127
127
|
export const upstashLogger = new PinoLogger({
|
|
128
128
|
name: 'Mastra',
|
|
@@ -157,7 +157,7 @@ Creates a custom transport using `createCustomTransport` and integrates it with
|
|
|
157
157
|
|
|
158
158
|
```typescript
|
|
159
159
|
import { createCustomTransport } from '@mastra/core/logger'
|
|
160
|
-
import { PinoLogger } from '@mastra/loggers
|
|
160
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
161
161
|
import pinoSentry from 'pino-sentry-transport'
|
|
162
162
|
|
|
163
163
|
const sentryStream = await pinoSentry({
|
package/dist/file/index.cjs
CHANGED
|
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
let _mastra_core_logger = require("@mastra/core/logger");
|
|
3
3
|
let fs = require("fs");
|
|
4
4
|
let readline = require("readline");
|
|
5
|
+
let _mastra_core_error = require("@mastra/core/error");
|
|
5
6
|
//#region src/file/index.ts
|
|
6
7
|
var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
7
8
|
path;
|
|
@@ -12,14 +13,19 @@ var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
|
12
13
|
if (!(0, fs.existsSync)(this.path)) throw new Error("File path does not exist");
|
|
13
14
|
if (!(0, fs.statSync)(this.path).isFile()) throw new Error(`File path must point to a file: ${this.path}`);
|
|
14
15
|
this.fileStream = (0, fs.createWriteStream)(this.path, { flags: "a" });
|
|
16
|
+
this.fileStream.on("error", (error) => {
|
|
17
|
+
if (!this.destroyed) this.destroy(error);
|
|
18
|
+
});
|
|
15
19
|
}
|
|
16
20
|
_transform(chunk, _encoding, callback) {
|
|
17
21
|
try {
|
|
18
|
-
this.fileStream.write(chunk)
|
|
22
|
+
this.fileStream.write(chunk, (error) => {
|
|
23
|
+
if (error) callback(error);
|
|
24
|
+
else callback(null, chunk);
|
|
25
|
+
});
|
|
19
26
|
} catch (error) {
|
|
20
|
-
|
|
27
|
+
callback(error);
|
|
21
28
|
}
|
|
22
|
-
callback(null, chunk);
|
|
23
29
|
}
|
|
24
30
|
_flush(callback) {
|
|
25
31
|
this.fileStream.end(() => {
|
|
@@ -44,14 +50,12 @@ var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
|
44
50
|
try {
|
|
45
51
|
return await this.#queryLogs(params || {});
|
|
46
52
|
} catch (error) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
hasMore: false
|
|
54
|
-
};
|
|
53
|
+
throw new _mastra_core_error.MastraError({
|
|
54
|
+
id: "FILE_TRANSPORT_LIST_LOGS_FAILED",
|
|
55
|
+
domain: _mastra_core_error.ErrorDomain.MASTRA_OBSERVABILITY,
|
|
56
|
+
category: _mastra_core_error.ErrorCategory.SYSTEM,
|
|
57
|
+
details: { path: this.path }
|
|
58
|
+
}, error);
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
async listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) {
|
|
@@ -66,14 +70,15 @@ var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
|
66
70
|
perPage
|
|
67
71
|
});
|
|
68
72
|
} catch (error) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
throw new _mastra_core_error.MastraError({
|
|
74
|
+
id: "FILE_TRANSPORT_LIST_LOGS_BY_RUN_ID_FAILED",
|
|
75
|
+
domain: _mastra_core_error.ErrorDomain.MASTRA_OBSERVABILITY,
|
|
76
|
+
category: _mastra_core_error.ErrorCategory.SYSTEM,
|
|
77
|
+
details: {
|
|
78
|
+
path: this.path,
|
|
79
|
+
runId
|
|
80
|
+
}
|
|
81
|
+
}, error);
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
/**
|
package/dist/file/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["LoggerTransport","#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["LoggerTransport","#queryLogs","MastraError","ErrorDomain","ErrorCategory"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n // Without a listener, the file stream's 'error' event would crash the process.\n // Write failures already reach the transport through the write callback, so only\n // forward errors that have not destroyed the transport yet (e.g. open failures).\n this.fileStream.on('error', error => {\n if (!this.destroyed) this.destroy(error);\n });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void) {\n try {\n this.fileStream.write(chunk, error => {\n if (error) callback(error);\n else callback(null, chunk);\n });\n } catch (error) {\n callback(error as Error);\n }\n }\n\n _flush(callback: Function) {\n // End the file stream when transform stream ends\n this.fileStream.end(() => {\n callback();\n });\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n // Clean up resources\n _destroy(error: Error, callback: Function) {\n if (this.fileStream) {\n this.fileStream.destroy(error);\n }\n callback(error);\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs(params || {});\n } catch (error) {\n throw new MastraError(\n {\n id: 'FILE_TRANSPORT_LIST_LOGS_FAILED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n details: { path: this.path },\n },\n error,\n );\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs({ runId, fromDate, toDate, logLevel, filters, page, perPage });\n } catch (error) {\n throw new MastraError(\n {\n id: 'FILE_TRANSPORT_LIST_LOGS_BY_RUN_ID_FAILED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n details: { path: this.path, runId },\n },\n error,\n );\n }\n }\n\n /**\n * Streams the log file line by line, counting every matching record but\n * retaining only the requested page (or all matches when pagination is off).\n */\n async #queryLogs({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults = true,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId?: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n }) {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = (perPageInput ?? 100) || 100;\n const start = (page - 1) * perPage;\n const end = start + perPage;\n const filterEntries = Object.entries(filters ?? {});\n\n const logs: BaseLogMessage[] = [];\n let total = 0;\n\n const lines = createInterface({ input: createReadStream(this.path, 'utf8'), crlfDelay: Infinity });\n for await (const line of lines) {\n if (!line.trim()) continue;\n\n let log: any;\n try {\n log = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (log === null || typeof log !== 'object') continue;\n if (runId !== undefined && log.runId !== runId) continue;\n if (!filterEntries.every(([key, value]) => log[key] === value)) continue;\n if (logLevel && log.level !== logLevel) continue;\n if (fromDate && !(new Date(log.time).getTime() >= fromDate.getTime())) continue;\n if (toDate && !(new Date(log.time).getTime() <= toDate.getTime())) continue;\n\n if (!returnPaginationResults || (total >= start && total < end)) {\n logs.push(log);\n }\n total++;\n }\n\n if (!returnPaginationResults) {\n return { logs, total, page, perPage: total, hasMore: false };\n }\n\n return { logs, total, page, perPage, hasMore: end < total };\n }\n}\n"],"mappings":"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"}
|
package/dist/file/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare class FileTransport extends LoggerTransport {
|
|
|
8
8
|
constructor({ path }: {
|
|
9
9
|
path: string;
|
|
10
10
|
});
|
|
11
|
-
_transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk
|
|
11
|
+
_transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void): void;
|
|
12
12
|
_flush(callback: Function): void;
|
|
13
13
|
_write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean;
|
|
14
14
|
_destroy(error: Error, callback: Function): void;
|
package/dist/file/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpE,qBAAa,aAAc,SAAQ,eAAe;;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAmBrC;IAED,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,QAS7F;IAED,MAAM,CAAC,QAAQ,EAAE,QAAQ,QAKxB;IAED,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAUxF;IAGD,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAKxC;IAEK,QAAQ,CAAC,MAAM,CAAC,EAAE;QACtB,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,MAAM,CAAC,EAAE,IAAI,CAAC;QACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAClC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAcD;IAEK,eAAe,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,OAAO,GACR,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,MAAM,CAAC,EAAE,IAAI,CAAC;QACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAcD;CAgEF"}
|
package/dist/file/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LoggerTransport } from "@mastra/core/logger";
|
|
2
2
|
import { createReadStream, createWriteStream, existsSync, statSync } from "fs";
|
|
3
3
|
import { createInterface } from "readline";
|
|
4
|
+
import { ErrorCategory, ErrorDomain, MastraError } from "@mastra/core/error";
|
|
4
5
|
//#region src/file/index.ts
|
|
5
6
|
var FileTransport = class extends LoggerTransport {
|
|
6
7
|
path;
|
|
@@ -11,14 +12,19 @@ var FileTransport = class extends LoggerTransport {
|
|
|
11
12
|
if (!existsSync(this.path)) throw new Error("File path does not exist");
|
|
12
13
|
if (!statSync(this.path).isFile()) throw new Error(`File path must point to a file: ${this.path}`);
|
|
13
14
|
this.fileStream = createWriteStream(this.path, { flags: "a" });
|
|
15
|
+
this.fileStream.on("error", (error) => {
|
|
16
|
+
if (!this.destroyed) this.destroy(error);
|
|
17
|
+
});
|
|
14
18
|
}
|
|
15
19
|
_transform(chunk, _encoding, callback) {
|
|
16
20
|
try {
|
|
17
|
-
this.fileStream.write(chunk)
|
|
21
|
+
this.fileStream.write(chunk, (error) => {
|
|
22
|
+
if (error) callback(error);
|
|
23
|
+
else callback(null, chunk);
|
|
24
|
+
});
|
|
18
25
|
} catch (error) {
|
|
19
|
-
|
|
26
|
+
callback(error);
|
|
20
27
|
}
|
|
21
|
-
callback(null, chunk);
|
|
22
28
|
}
|
|
23
29
|
_flush(callback) {
|
|
24
30
|
this.fileStream.end(() => {
|
|
@@ -43,14 +49,12 @@ var FileTransport = class extends LoggerTransport {
|
|
|
43
49
|
try {
|
|
44
50
|
return await this.#queryLogs(params || {});
|
|
45
51
|
} catch (error) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
hasMore: false
|
|
53
|
-
};
|
|
52
|
+
throw new MastraError({
|
|
53
|
+
id: "FILE_TRANSPORT_LIST_LOGS_FAILED",
|
|
54
|
+
domain: ErrorDomain.MASTRA_OBSERVABILITY,
|
|
55
|
+
category: ErrorCategory.SYSTEM,
|
|
56
|
+
details: { path: this.path }
|
|
57
|
+
}, error);
|
|
54
58
|
}
|
|
55
59
|
}
|
|
56
60
|
async listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) {
|
|
@@ -65,14 +69,15 @@ var FileTransport = class extends LoggerTransport {
|
|
|
65
69
|
perPage
|
|
66
70
|
});
|
|
67
71
|
} catch (error) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
throw new MastraError({
|
|
73
|
+
id: "FILE_TRANSPORT_LIST_LOGS_BY_RUN_ID_FAILED",
|
|
74
|
+
domain: ErrorDomain.MASTRA_OBSERVABILITY,
|
|
75
|
+
category: ErrorCategory.SYSTEM,
|
|
76
|
+
details: {
|
|
77
|
+
path: this.path,
|
|
78
|
+
runId
|
|
79
|
+
}
|
|
80
|
+
}, error);
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
83
|
/**
|
package/dist/file/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk
|
|
1
|
+
{"version":3,"file":"index.js","names":["#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n // Without a listener, the file stream's 'error' event would crash the process.\n // Write failures already reach the transport through the write callback, so only\n // forward errors that have not destroyed the transport yet (e.g. open failures).\n this.fileStream.on('error', error => {\n if (!this.destroyed) this.destroy(error);\n });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void) {\n try {\n this.fileStream.write(chunk, error => {\n if (error) callback(error);\n else callback(null, chunk);\n });\n } catch (error) {\n callback(error as Error);\n }\n }\n\n _flush(callback: Function) {\n // End the file stream when transform stream ends\n this.fileStream.end(() => {\n callback();\n });\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n // Clean up resources\n _destroy(error: Error, callback: Function) {\n if (this.fileStream) {\n this.fileStream.destroy(error);\n }\n callback(error);\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs(params || {});\n } catch (error) {\n throw new MastraError(\n {\n id: 'FILE_TRANSPORT_LIST_LOGS_FAILED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n details: { path: this.path },\n },\n error,\n );\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs({ runId, fromDate, toDate, logLevel, filters, page, perPage });\n } catch (error) {\n throw new MastraError(\n {\n id: 'FILE_TRANSPORT_LIST_LOGS_BY_RUN_ID_FAILED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n details: { path: this.path, runId },\n },\n error,\n );\n }\n }\n\n /**\n * Streams the log file line by line, counting every matching record but\n * retaining only the requested page (or all matches when pagination is off).\n */\n async #queryLogs({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults = true,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId?: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n }) {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = (perPageInput ?? 100) || 100;\n const start = (page - 1) * perPage;\n const end = start + perPage;\n const filterEntries = Object.entries(filters ?? {});\n\n const logs: BaseLogMessage[] = [];\n let total = 0;\n\n const lines = createInterface({ input: createReadStream(this.path, 'utf8'), crlfDelay: Infinity });\n for await (const line of lines) {\n if (!line.trim()) continue;\n\n let log: any;\n try {\n log = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (log === null || typeof log !== 'object') continue;\n if (runId !== undefined && log.runId !== runId) continue;\n if (!filterEntries.every(([key, value]) => log[key] === value)) continue;\n if (logLevel && log.level !== logLevel) continue;\n if (fromDate && !(new Date(log.time).getTime() >= fromDate.getTime())) continue;\n if (toDate && !(new Date(log.time).getTime() <= toDate.getTime())) continue;\n\n if (!returnPaginationResults || (total >= start && total < end)) {\n logs.push(log);\n }\n total++;\n }\n\n if (!returnPaginationResults) {\n return { logs, total, page, perPage: total, hasMore: false };\n }\n\n return { logs, total, page, perPage, hasMore: end < total };\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/loggers",
|
|
3
|
-
"version": "1.3.6-alpha.
|
|
3
|
+
"version": "1.3.6-alpha.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"vitest": "4.1.11",
|
|
79
79
|
"@internal/lint": "0.0.141",
|
|
80
80
|
"@internal/types-builder": "0.0.116",
|
|
81
|
-
"@mastra/core": "1.76.0-alpha.
|
|
81
|
+
"@mastra/core": "1.76.0-alpha.6"
|
|
82
82
|
},
|
|
83
83
|
"peerDependencies": {
|
|
84
84
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|