英文:
golang wait for io.Writer to be written to
问题
http.Server
类型位于 golang 标准库的 net/http
包中,它有一个名为 ErrorLog
的字段,类型为 log.Logger
。
这是我在 http.Server
中设置 ErrorLog
的方式:
// 设置 HTTP 服务器
server = &http.Server{
Addr: getPortFromConfig(),
Handler: handler,
ErrorLog: log.New(io.MultiWriter(stdout, fileout), "", 1),
}
在这里,io.MultiWriter()
函数创建了一个新的 io.Writer
,它将把所有从我的 http.Server
写入的内容复制到文件和标准输出(stdout)。它的工作非常好。
然而,我想在写入文件之前拦截数据并进行格式化。
如何实现这一点呢?
英文:
The http.Server
type in the golang standard net/http
package has a field named ErrorLog
, which is of type log.Logger
.
This is how ErrorLog
is set up in my http.Server
:
// set up HTTP server
server = &http.Server{
Addr: getPortFromConfig(),
Handler: handler,
ErrorLog: log.New(io.MultiWriter(stdout, fileout), "", 1),
}
So here, the io.MultiWriter()
function creates a new io.Writer
that will copy all writes from my http.Server
into a file as well as stdout. It works like a charm.
However, I would like to intercept the data and format it before it is written to the file.
How is it possible to do this?
答案1
得分: 1
你可以创建一个自己的写入器,实现"Write([]byte) error"方法。
当你创建这个写入器时,将文件写入器作为参数传递给它。
每当你的写入器接收到数据时,它会对数据进行格式化,然后调用文件写入器的"Write"方法。
类似于:
type MyFormatter struct {
fileWriter io.Writer
}
func (m *MyFormatter) Write(buf []byte) error {
formattedBytes := FormatBytes(buf)
m.fileWriter.Write(formattedBytes)
}
这段代码没有经过测试,只是伪代码!
编辑:你甚至可以使用嵌入式写入器
type MyFormatter struct {
io.Writer
}
func (m *MyFormatter) Write(buf []byte) error {
formattedBytes := FormatBytes(buf)
m.Writer.Write(formattedBytes)
}
英文:
You can create your own writer which implements "Write([]byte) error".
When you create this writer, you give him the file writer as arguments.
Each time your writer receive something, it formats it and then calls the "Write" method on the file writer.
Something like :
type MyFormatter struct {
fileWriter io.Writer
}
func (m *MyFormatter) Write(buf []byte) error {
formattedBytes := FormatBytes(buf)
m.fileWriter.Write(formattedBytes)
}
Haven't tested that code, it is only pseudo code!
EDIT: You can even use embedded writer
type MyFormatter struct {
io.Writer
}
func (m *MyFormatter) Write(buf []byte) error {
formattedBytes := FormatBytes(buf)
m.Writer.Write(formattedBytes)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论