@mastra/loggers 1.2.0 → 1.3.0-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 +23 -0
- package/dist/docs/SKILL.md +3 -2
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-observability-logging.md +101 -5
- package/dist/docs/references/reference-core-mastra-class.md +61 -8
- package/dist/docs/references/reference-file-based-agents-logger.md +30 -0
- package/dist/docs/references/reference-logging-pino-logger.md +12 -8
- package/dist/file/index.cjs +117 -151
- package/dist/file/index.cjs.map +1 -1
- package/dist/file/index.js +115 -148
- package/dist/file/index.js.map +1 -1
- package/dist/http/index.cjs +137 -165
- package/dist/http/index.cjs.map +1 -1
- package/dist/http/index.js +135 -162
- package/dist/http/index.js.map +1 -1
- package/dist/index.cjs +164 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +139 -92
- package/dist/index.js.map +1 -1
- package/dist/pino.d.ts +16 -1
- package/dist/pino.d.ts.map +1 -1
- package/dist/upstash/index.cjs +178 -215
- package/dist/upstash/index.cjs.map +1 -1
- package/dist/upstash/index.js +176 -212
- package/dist/upstash/index.js.map +1 -1
- package/package.json +15 -14
package/dist/file/index.cjs
CHANGED
|
@@ -1,154 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
logLevel,
|
|
117
|
-
filters,
|
|
118
|
-
page: pageInput,
|
|
119
|
-
perPage: perPageInput
|
|
120
|
-
}) {
|
|
121
|
-
try {
|
|
122
|
-
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
123
|
-
const perPage = perPageInput ?? 100;
|
|
124
|
-
const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });
|
|
125
|
-
const logs = allLogs?.logs?.filter((log) => log?.runId === runId) || [];
|
|
126
|
-
const total = logs.length;
|
|
127
|
-
const resolvedPerPage = perPage || 100;
|
|
128
|
-
const start = (page - 1) * resolvedPerPage;
|
|
129
|
-
const end = start + resolvedPerPage;
|
|
130
|
-
const paginatedLogs = logs.slice(start, end);
|
|
131
|
-
const hasMore = end < total;
|
|
132
|
-
return {
|
|
133
|
-
logs: paginatedLogs,
|
|
134
|
-
total,
|
|
135
|
-
page,
|
|
136
|
-
perPage: resolvedPerPage,
|
|
137
|
-
hasMore
|
|
138
|
-
};
|
|
139
|
-
} catch (error) {
|
|
140
|
-
console.error("Error getting logs by runId from file:", error);
|
|
141
|
-
return {
|
|
142
|
-
logs: [],
|
|
143
|
-
total: 0,
|
|
144
|
-
page: 0,
|
|
145
|
-
perPage: 0,
|
|
146
|
-
hasMore: false
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
}
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let _mastra_core_logger = require("@mastra/core/logger");
|
|
3
|
+
let fs = require("fs");
|
|
4
|
+
//#region src/file/index.ts
|
|
5
|
+
var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
6
|
+
path;
|
|
7
|
+
fileStream;
|
|
8
|
+
constructor({ path }) {
|
|
9
|
+
super({ objectMode: true });
|
|
10
|
+
this.path = path;
|
|
11
|
+
if (!(0, fs.existsSync)(this.path)) {
|
|
12
|
+
console.info(this.path);
|
|
13
|
+
throw new Error("File path does not exist");
|
|
14
|
+
}
|
|
15
|
+
this.fileStream = (0, fs.createWriteStream)(this.path, { flags: "a" });
|
|
16
|
+
}
|
|
17
|
+
_transform(chunk, _encoding, callback) {
|
|
18
|
+
try {
|
|
19
|
+
this.fileStream.write(chunk);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.error("Error parsing log entry:", error);
|
|
22
|
+
}
|
|
23
|
+
callback(null, chunk);
|
|
24
|
+
}
|
|
25
|
+
_flush(callback) {
|
|
26
|
+
this.fileStream.end(() => {
|
|
27
|
+
callback();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
_write(chunk, encoding, callback) {
|
|
31
|
+
if (typeof callback === "function") {
|
|
32
|
+
this._transform(chunk, encoding || "utf8", callback);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
this._transform(chunk, encoding || "utf8", (error) => {
|
|
36
|
+
if (error) console.error("Transform error in write:", error);
|
|
37
|
+
});
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
_destroy(error, callback) {
|
|
41
|
+
if (this.fileStream) this.fileStream.destroy(error);
|
|
42
|
+
callback(error);
|
|
43
|
+
}
|
|
44
|
+
async listLogs(params) {
|
|
45
|
+
try {
|
|
46
|
+
const { fromDate, toDate, logLevel, filters, returnPaginationResults: returnPaginationResultsInput, page: pageInput, perPage: perPageInput } = params || {};
|
|
47
|
+
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
48
|
+
const perPage = perPageInput ?? 100;
|
|
49
|
+
const returnPaginationResults = returnPaginationResultsInput ?? true;
|
|
50
|
+
let filteredLogs = (0, fs.readFileSync)(this.path, "utf8").split("\n").filter(Boolean).map((log) => JSON.parse(log)).filter((record) => record !== null && typeof record === "object");
|
|
51
|
+
if (filters) filteredLogs = filteredLogs.filter((log) => Object.entries(filters || {}).every(([key, value]) => log[key] === value));
|
|
52
|
+
if (logLevel) filteredLogs = filteredLogs.filter((log) => log.level === logLevel);
|
|
53
|
+
if (fromDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() >= fromDate.getTime());
|
|
54
|
+
if (toDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() <= toDate.getTime());
|
|
55
|
+
if (!returnPaginationResults) return {
|
|
56
|
+
logs: filteredLogs,
|
|
57
|
+
total: filteredLogs.length,
|
|
58
|
+
page,
|
|
59
|
+
perPage: filteredLogs.length,
|
|
60
|
+
hasMore: false
|
|
61
|
+
};
|
|
62
|
+
const total = filteredLogs.length;
|
|
63
|
+
const resolvedPerPage = perPage || 100;
|
|
64
|
+
const start = (page - 1) * resolvedPerPage;
|
|
65
|
+
const end = start + resolvedPerPage;
|
|
66
|
+
return {
|
|
67
|
+
logs: filteredLogs.slice(start, end),
|
|
68
|
+
total,
|
|
69
|
+
page,
|
|
70
|
+
perPage: resolvedPerPage,
|
|
71
|
+
hasMore: end < total
|
|
72
|
+
};
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error("Error getting logs from file:", error);
|
|
75
|
+
return {
|
|
76
|
+
logs: [],
|
|
77
|
+
total: 0,
|
|
78
|
+
page: 0,
|
|
79
|
+
perPage: 0,
|
|
80
|
+
hasMore: false
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page: pageInput, perPage: perPageInput }) {
|
|
85
|
+
try {
|
|
86
|
+
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
87
|
+
const perPage = perPageInput ?? 100;
|
|
88
|
+
const logs = (await this.listLogs({
|
|
89
|
+
fromDate,
|
|
90
|
+
toDate,
|
|
91
|
+
logLevel,
|
|
92
|
+
filters
|
|
93
|
+
}))?.logs?.filter((log) => log?.runId === runId) || [];
|
|
94
|
+
const total = logs.length;
|
|
95
|
+
const resolvedPerPage = perPage || 100;
|
|
96
|
+
const start = (page - 1) * resolvedPerPage;
|
|
97
|
+
const end = start + resolvedPerPage;
|
|
98
|
+
return {
|
|
99
|
+
logs: logs.slice(start, end),
|
|
100
|
+
total,
|
|
101
|
+
page,
|
|
102
|
+
perPage: resolvedPerPage,
|
|
103
|
+
hasMore: end < total
|
|
104
|
+
};
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error("Error getting logs by runId from file:", error);
|
|
107
|
+
return {
|
|
108
|
+
logs: [],
|
|
109
|
+
total: 0,
|
|
110
|
+
page: 0,
|
|
111
|
+
perPage: 0,
|
|
112
|
+
hasMore: false
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
150
116
|
};
|
|
151
|
-
|
|
117
|
+
//#endregion
|
|
152
118
|
exports.FileTransport = FileTransport;
|
|
153
|
-
|
|
119
|
+
|
|
154
120
|
//# sourceMappingURL=index.cjs.map
|
package/dist/file/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/file/index.ts"],"names":["LoggerTransport","existsSync","createWriteStream","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createWriteStream, existsSync, readFileSync } from 'node:fs';\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 console.info(this.path);\n throw new Error('File path does not exist');\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk: any) => void) {\n try {\n this.fileStream.write(chunk);\n } catch (error) {\n console.error('Error parsing log entry:', error);\n }\n callback(null, chunk);\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 const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n const logs = readFileSync(this.path, 'utf8')\n .split('\\n')\n .filter(Boolean)\n .map(log => JSON.parse(log));\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\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 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 const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });\n const logs = (allLogs?.logs?.filter(log => log?.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["LoggerTransport"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createWriteStream, existsSync, readFileSync } from 'node:fs';\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 console.info(this.path);\n throw new Error('File path does not exist');\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk: any) => void) {\n try {\n this.fileStream.write(chunk);\n } catch (error) {\n console.error('Error parsing log entry:', error);\n }\n callback(null, chunk);\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 const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n const logs = readFileSync(this.path, 'utf8')\n .split('\\n')\n .filter(Boolean)\n .map(log => JSON.parse(log));\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\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 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 const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });\n const logs = (allLogs?.logs?.filter(log => log?.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/file/index.js
CHANGED
|
@@ -1,152 +1,119 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
// src/file/index.ts
|
|
1
|
+
import { LoggerTransport } from "@mastra/core/logger";
|
|
2
|
+
import { createWriteStream, existsSync, readFileSync } from "fs";
|
|
3
|
+
//#region src/file/index.ts
|
|
5
4
|
var FileTransport = class extends LoggerTransport {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
page: pageInput,
|
|
117
|
-
perPage: perPageInput
|
|
118
|
-
}) {
|
|
119
|
-
try {
|
|
120
|
-
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
121
|
-
const perPage = perPageInput ?? 100;
|
|
122
|
-
const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });
|
|
123
|
-
const logs = allLogs?.logs?.filter((log) => log?.runId === runId) || [];
|
|
124
|
-
const total = logs.length;
|
|
125
|
-
const resolvedPerPage = perPage || 100;
|
|
126
|
-
const start = (page - 1) * resolvedPerPage;
|
|
127
|
-
const end = start + resolvedPerPage;
|
|
128
|
-
const paginatedLogs = logs.slice(start, end);
|
|
129
|
-
const hasMore = end < total;
|
|
130
|
-
return {
|
|
131
|
-
logs: paginatedLogs,
|
|
132
|
-
total,
|
|
133
|
-
page,
|
|
134
|
-
perPage: resolvedPerPage,
|
|
135
|
-
hasMore
|
|
136
|
-
};
|
|
137
|
-
} catch (error) {
|
|
138
|
-
console.error("Error getting logs by runId from file:", error);
|
|
139
|
-
return {
|
|
140
|
-
logs: [],
|
|
141
|
-
total: 0,
|
|
142
|
-
page: 0,
|
|
143
|
-
perPage: 0,
|
|
144
|
-
hasMore: false
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
}
|
|
5
|
+
path;
|
|
6
|
+
fileStream;
|
|
7
|
+
constructor({ path }) {
|
|
8
|
+
super({ objectMode: true });
|
|
9
|
+
this.path = path;
|
|
10
|
+
if (!existsSync(this.path)) {
|
|
11
|
+
console.info(this.path);
|
|
12
|
+
throw new Error("File path does not exist");
|
|
13
|
+
}
|
|
14
|
+
this.fileStream = createWriteStream(this.path, { flags: "a" });
|
|
15
|
+
}
|
|
16
|
+
_transform(chunk, _encoding, callback) {
|
|
17
|
+
try {
|
|
18
|
+
this.fileStream.write(chunk);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error("Error parsing log entry:", error);
|
|
21
|
+
}
|
|
22
|
+
callback(null, chunk);
|
|
23
|
+
}
|
|
24
|
+
_flush(callback) {
|
|
25
|
+
this.fileStream.end(() => {
|
|
26
|
+
callback();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
_write(chunk, encoding, callback) {
|
|
30
|
+
if (typeof callback === "function") {
|
|
31
|
+
this._transform(chunk, encoding || "utf8", callback);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
this._transform(chunk, encoding || "utf8", (error) => {
|
|
35
|
+
if (error) console.error("Transform error in write:", error);
|
|
36
|
+
});
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
_destroy(error, callback) {
|
|
40
|
+
if (this.fileStream) this.fileStream.destroy(error);
|
|
41
|
+
callback(error);
|
|
42
|
+
}
|
|
43
|
+
async listLogs(params) {
|
|
44
|
+
try {
|
|
45
|
+
const { fromDate, toDate, logLevel, filters, returnPaginationResults: returnPaginationResultsInput, page: pageInput, perPage: perPageInput } = params || {};
|
|
46
|
+
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
47
|
+
const perPage = perPageInput ?? 100;
|
|
48
|
+
const returnPaginationResults = returnPaginationResultsInput ?? true;
|
|
49
|
+
let filteredLogs = readFileSync(this.path, "utf8").split("\n").filter(Boolean).map((log) => JSON.parse(log)).filter((record) => record !== null && typeof record === "object");
|
|
50
|
+
if (filters) filteredLogs = filteredLogs.filter((log) => Object.entries(filters || {}).every(([key, value]) => log[key] === value));
|
|
51
|
+
if (logLevel) filteredLogs = filteredLogs.filter((log) => log.level === logLevel);
|
|
52
|
+
if (fromDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() >= fromDate.getTime());
|
|
53
|
+
if (toDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() <= toDate.getTime());
|
|
54
|
+
if (!returnPaginationResults) return {
|
|
55
|
+
logs: filteredLogs,
|
|
56
|
+
total: filteredLogs.length,
|
|
57
|
+
page,
|
|
58
|
+
perPage: filteredLogs.length,
|
|
59
|
+
hasMore: false
|
|
60
|
+
};
|
|
61
|
+
const total = filteredLogs.length;
|
|
62
|
+
const resolvedPerPage = perPage || 100;
|
|
63
|
+
const start = (page - 1) * resolvedPerPage;
|
|
64
|
+
const end = start + resolvedPerPage;
|
|
65
|
+
return {
|
|
66
|
+
logs: filteredLogs.slice(start, end),
|
|
67
|
+
total,
|
|
68
|
+
page,
|
|
69
|
+
perPage: resolvedPerPage,
|
|
70
|
+
hasMore: end < total
|
|
71
|
+
};
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error("Error getting logs from file:", error);
|
|
74
|
+
return {
|
|
75
|
+
logs: [],
|
|
76
|
+
total: 0,
|
|
77
|
+
page: 0,
|
|
78
|
+
perPage: 0,
|
|
79
|
+
hasMore: false
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page: pageInput, perPage: perPageInput }) {
|
|
84
|
+
try {
|
|
85
|
+
const page = pageInput === 0 ? 1 : pageInput ?? 1;
|
|
86
|
+
const perPage = perPageInput ?? 100;
|
|
87
|
+
const logs = (await this.listLogs({
|
|
88
|
+
fromDate,
|
|
89
|
+
toDate,
|
|
90
|
+
logLevel,
|
|
91
|
+
filters
|
|
92
|
+
}))?.logs?.filter((log) => log?.runId === runId) || [];
|
|
93
|
+
const total = logs.length;
|
|
94
|
+
const resolvedPerPage = perPage || 100;
|
|
95
|
+
const start = (page - 1) * resolvedPerPage;
|
|
96
|
+
const end = start + resolvedPerPage;
|
|
97
|
+
return {
|
|
98
|
+
logs: logs.slice(start, end),
|
|
99
|
+
total,
|
|
100
|
+
page,
|
|
101
|
+
perPage: resolvedPerPage,
|
|
102
|
+
hasMore: end < total
|
|
103
|
+
};
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.error("Error getting logs by runId from file:", error);
|
|
106
|
+
return {
|
|
107
|
+
logs: [],
|
|
108
|
+
total: 0,
|
|
109
|
+
page: 0,
|
|
110
|
+
perPage: 0,
|
|
111
|
+
hasMore: false
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
148
115
|
};
|
|
149
|
-
|
|
116
|
+
//#endregion
|
|
150
117
|
export { FileTransport };
|
|
151
|
-
|
|
118
|
+
|
|
152
119
|
//# sourceMappingURL=index.js.map
|
package/dist/file/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/file/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createWriteStream, existsSync, readFileSync } from 'node:fs';\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 console.info(this.path);\n throw new Error('File path does not exist');\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk: any) => void) {\n try {\n this.fileStream.write(chunk);\n } catch (error) {\n console.error('Error parsing log entry:', error);\n }\n callback(null, chunk);\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 const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n const logs = readFileSync(this.path, 'utf8')\n .split('\\n')\n .filter(Boolean)\n .map(log => JSON.parse(log));\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\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 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 const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });\n const logs = (allLogs?.logs?.filter(log => log?.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createWriteStream, existsSync, readFileSync } from 'node:fs';\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 console.info(this.path);\n throw new Error('File path does not exist');\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk: any) => void) {\n try {\n this.fileStream.write(chunk);\n } catch (error) {\n console.error('Error parsing log entry:', error);\n }\n callback(null, chunk);\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 const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n const logs = readFileSync(this.path, 'utf8')\n .split('\\n')\n .filter(Boolean)\n .map(log => JSON.parse(log));\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\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 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 const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters });\n const logs = (allLogs?.logs?.filter(log => log?.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return {\n logs: [],\n total: 0,\n page: 0,\n perPage: 0,\n hasMore: false,\n };\n }\n }\n}\n"],"mappings":"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"}
|