Golang日志记录问题求助

Golang日志记录问题求助 你好,我是新来的。很抱歉需要寻求帮助,情况是这样的:我请一位开发者为我用Golang开发了一个特定用途的系统,但不幸的是,他后来失联了。现在我有几个(主要是格式方面的)问题需要解决,基本上只能通过阅读代码从头开始学习。

目前,我的日志产生了以下结果:

|09:40:55.622|2018-10-29,2019-10-29, 2.07447ms| |09:40:55.822|2018-10-29,2019-10-29, 2.057991ms| |09:40:56.022|2018-10-29,2019-10-29, 2.441781ms| |09:40:56.222|2018-10-29,2019-10-29, 2.0848ms|

我需要将末尾的“响应”时间格式化为小数点后保留两位数字,以确保格式一致。例如,应该是 2.07ms、2.05ms、2.44ms 等。

我认为需要修改的代码在下面这段里,但我不太确定。有人能帮忙吗?

(提供的代码不相关)


更多关于Golang日志记录问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

这段代码或许有帮助?我真的是基于有限的知识在猜测。

(提供的代码不相关)

更多关于Golang日志记录问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


据我所知,在你展示的函数中,日志记录器甚至没有被使用。

该函数中也没有其他会写入或生成字符串的内容。至少,如果存在这样的功能,它也被隐藏在我们无法窥见的函数调用背后了。

嗯,其实并非如此,实际上那里记录的只有一条级别为 debug 的消息“Processing started”。

此外,从您之前的消息中可以看出,日志记录使用了 zap,它会将日志输出为 JSON 格式。

您之前帖子中展示的示例输出并非 JSON 格式。因此,这可能与任何日志记录无关,而是在其他地方生成的。

是的,“处理已开始”是我唯一能追踪的线索,因为它出现在日志文件中那些具体的日期/响应时间报告之前。

对于一个基于我不熟悉的代码开发的系统,这就是我遇到的麻烦。然后开发者消失了,而我有一大堆工作要处理(可能需要推荐,哈哈)。

我能找到的唯一其他代码片段是:

(提供的代码不相关)

感谢您的帮助,我怀疑您是对的,它是在打印前通过其他方式生成的。通过文本编辑器搜索,没有发现任何这些条目类型的迹象。

我可能需要请一位Go语言的“专家”来协助系统的开发。这个改动只是一个小的改进,但后续还有更大的工作量,需要通过git获得完整的代码访问权限。

如果您或任何人知道有谁对有偿工作感兴趣,愿意帮助我开发这个系统,我将不胜感激。

这真的很难说。

我们除了看到一些代码片段外,对你的应用程序一无所知,而那些代码片段也说明不了什么。

我们唯一知道的是,实际日志记录使用了 zap,而它生成的是 JSON 输出。

我们还知道,你想更改一些明显不是 JSON 格式的打印行的格式。

因此,根据目前所知,我们只能推断这些行与应用程序的日志记录部分无关。

我认为,如果没有完整的代码访问权限,并且无法使用测试数据运行它,就不可能给你任何提示。

如果你运气好的话,可以使用文本编辑器在所有文件中通过正则表达式进行搜索,也许这样能找到一些更好的线索。"|.*|.*, .*|" 这个正则表达式或许能找到负责生成相关输出的地方。你可能需要对这个正则表达式稍作调整,但作为起点它应该能工作。不过,也许这行内容在打印之前是通过字符串拼接创建的……那样的话,在不了解程序工作原理的情况下,真的很难找到它……

func main() {
    fmt.Println("hello world")
}

根据你的需求,需要将日志中响应时间的格式统一为保留两位小数。从你提供的日志示例来看,响应时间格式不一致,有的有三位小数,有的有四位小数。

以下是修改日志格式的示例代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 模拟你的响应时间
    responseTimes := []time.Duration{
        2074470 * time.Nanosecond,  // 2.07447ms
        2057991 * time.Nanosecond,  // 2.057991ms
        2441781 * time.Nanosecond,  // 2.441781ms
        2084800 * time.Nanosecond,  // 2.0848ms
    }
    
    currentTime := time.Now()
    
    for _, rt := range responseTimes {
        // 格式化时间部分
        timeStr := currentTime.Format("15:04:05.000")
        
        // 格式化响应时间,保留两位小数
        // 将纳秒转换为毫秒并保留两位小数
        ms := float64(rt.Nanoseconds()) / 1_000_000.0
        responseStr := fmt.Sprintf("%.2fms", ms)
        
        // 输出格式化后的日志
        fmt.Printf("|%s|2018-10-29,2019-10-29, %s|\n", timeStr, responseStr)
        
        // 模拟时间递增
        currentTime = currentTime.Add(200 * time.Millisecond)
    }
}

如果你的代码中已经使用了 time.Duration 类型来记录响应时间,可以直接这样格式化:

// 假设 responseTime 是 time.Duration 类型
func formatResponseTime(responseTime time.Duration) string {
    ms := float64(responseTime.Nanoseconds()) / 1_000_000.0
    return fmt.Sprintf("%.2fms", ms)
}

或者如果你使用的是浮点数表示毫秒:

// 假设 responseTime 是 float64 类型,单位是毫秒
func formatResponseTime(responseTime float64) string {
    return fmt.Sprintf("%.2fms", responseTime)
}

在你的日志记录代码中,找到输出响应时间的地方,将原来的格式替换为 fmt.Sprintf("%.2fms", responseTimeInMs) 即可。

运行示例代码的输出结果:

|09:40:55.622|2018-10-29,2019-10-29, 2.07ms|
|09:40:55.822|2018-10-29,2019-10-29, 2.06ms|
|09:40:56.022|2018-10-29,2019-10-29, 2.44ms|
|09:40:56.222|2018-10-29,2019-10-29, 2.08ms|

这样就能确保所有响应时间都统一保留两位小数格式了。

回到顶部