我想将日志(log)信息发送到套接字,要实现这一点,我需要先发送capture the os.stdout.我知道我可以使用os.pip重定向os.stdout.但是,有没有一种方法可以直接使用bufio.NewReader或bufio.NewScanner从os.stdout读取内容呢?

func Start() {
   //dataChan := make(chan string)

   outC := make(chan string, 3)
   defer close(outC)
   conn, err := net.Dial("tcp", "localhost:9090")

   if err != nil {
       log.Fatal(err)
   }

   fmt.Println("first line!")
   fmt.Println("second line!")
   fmt.Println("third line!")
   // write to channel
   go func() {
       scanner := bufio.NewScanner(os.Stdout)
       for scanner.Scan() {
           outC <- scanner.Text() + "\n"
           err = scanner.Err()

           if err != nil {
               log.Fatal(err)
           }
       }
   }()

   // read from channel and print to connection
   go func() {
       out := <-outC

       for {
           conn.Write([]byte(out + "\n"))
       }

   }()

}

推荐答案

你可以把stdout读到os.Pipe

    old := os.Stdout
    r, w, _ := os.Pipe()
    os.Stdout = w

    go func() {
        var buf bytes.Buffer
        io.Copy(&buf, r)
        outC <- buf.String()
    }()

    fmt.Println("first line!")
    fmt.Println("second line!")
    fmt.Println("third line!")

    w.Close()
    os.Stdout = old // restore stdout

    for {
        select {
        case out := <-outC:
            conn.Write([]byte("read " + out + "\n"))
        }
    }

Go相关问答推荐

golang 的条件储存库

减少在围棋中映射DTO时的重复代码量

如何防止程序B存档/删除围棋中程序A当前打开的文件?

如何使用中间件更改http请求的响应代码?

JWT 如何解析声明有效性和错误?

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

无效操作:v > max(类型参数 T 与 > 不可比较)

在 GoLang 中对自定义 struct 体数组进行排序

命令行参数在 Golang 程序中不正确地接受为参数

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

为什么docall在singleflight中使用go panic?

Go 切片容量增长率

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

动态 SQL 集 Golang

如何将一片 map 转换为一片具有不同属性的 struct

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

Go 中 SDL Surface 的 OpenGL 纹理

具有相同提前返回语句的函数的不同基准测试结果

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录

手动下载并放置一个 golang mod 文件