提问人:liminor 提问时间:10/13/2023 最后编辑:liminor 更新时间:10/14/2023 访问量:55
Monadic 日志函数使用“using”关键字写入文件
Monadic log function writing to file utilizing 'using' keyword
问:
块上有一个新的上下文管理器。 悄无声息地死去,所以自然是重塑品牌和重振:)的时候了with
设置:
看着新关键字,我立即发现了一个非常棒的模式。Google Cloud Platform (GCP) 具有 ,并用于其云功能。不过,很多时候我需要先在本地运行它们,而且有些日志非常广泛。我不想通过终端窗口查看,而是希望从帮助程序文件中导入我自己的这些函数的实现,保持实现语法不变。这将允许我在本地文件夹中拥有用于调试和测试的文件。using
log()
warn()
error()
.log
我一直在尝试像这样完成它:
// localLogger.ts
import { createWriteStream } from "fs"
import { fileURLToPath } from "url"
import { dirname, join } from "path"
export function wrapLogs(
callee: string,
type: "info" | "warn" | "error" = "info"
) {
const logs: {
when: string
logs: string
payload?: any
}[] = []
const __importFile = fileURLToPath(import.meta.url)
const __logFileDir = dirname(__importFile)
const __logFile = join(__logFileDir, "../logs", `${type}.log`)
const stream = createWriteStream(__logFile, {
flags: "a",
encoding: "utf8",
})
return function (input?: string, payload: any = {}) {
if (input) {
const timeStamp = new Date().toISOString().split("T")[1].slice(0, -1)
logs.push({ when: timeStamp, logs: input })
if (Object.keys(payload).length) {
logs[logs.length - 1].payload = payload
}
}
return {
callee,
logs,
done: () => {
logs.forEach((log) => {
stream.write(`${log.when} - [${callee}] - ${type}: ${log.logs}\n`)
if (log.payload) {
stream.write(`payload: ${JSON.stringify(log.payload, null, 2)}\n`)
}
})
stream.on("finish", () => {
console.log("done")
})
stream.end()
},
}
}
}
这很接近,但没有雪茄。此实现需要在实现记录器的每个函数的末尾运行该方法 - 不太理想,因为这为遗忘错误留下了很大的空间。从理论上讲,这应该是应该进来的地方。.done()
using
// implementer.ts
import { wrapLogs } from './localLogger.ts'
function myCloudFuntion(){
const log = wrapLogs('myCloudFunction')
// does something and then logs
const data = { payload: 'relevant data' }
log("some useful log here", data)
// more stuff
log().done() // <- this part i would like to do without
return
}
因此,在理想世界中,我想这样定义记录器:
// localLogger.ts
...
// last return of the wrapLogs definition
return {
callee,
logs,
[Symbol.dispose]() {
logs.forEach((log) => {
stream.write(`${log.when} - [${callee}] - ${type}: ${log.logs}\n`)
if (log.payload) {
stream.write(`payload: ${JSON.stringify(log.payload, null, 2)}\n`)
}
})
stream.on("finish", () => {
console.log("done")
})
stream.end()
},
}
在实现文件中:
// implementer.ts
function myCloudFunction(){
using log = wrapLogs("myCloudFunction")
//...
log("some message", data)
return // <- no more log().done()
}
不幸的是,这会导致各种问题。
欢迎任何帮助。
这些是我进入单子土地的第一步,所以要温柔:)using
编辑:我创建了一个存储库,它应该使设置不那么耗时 https://github.com/kolchurinvv/logger-replacements
答: 暂无答案
评论