MST

星途 面试题库

面试题:Go函数调试中如何有效利用`log`包

在Go函数调试场景下,描述如何合理使用`log`包进行关键信息记录,包括如何设置日志输出格式、输出位置,以及如何在不同阶段添加日志来辅助定位问题。请举例说明。
31.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 设置日志输出格式
    • Go语言的log包默认输出格式相对简单。如果要自定义格式,可以使用log.SetFlags函数。log包提供了以下几种标志位:
      • log.Ldate:日期:2009/01/23
      • log.Ltime:时间:01:23:24
      • log.Lmicroseconds:微秒级时间:01:23:24.123123
      • log.Llongfile:全路径文件名和行号:/a/b/c/d.go:23
      • log.Lshortfile:最后一个文件名元素和行号:d.go:23(在Llongfile开启时有效)
      • log.LUTC:使用UTC时间,否则使用本地时间
    • 示例:
package main

import (
    "log"
)

func main() {
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    log.Println("This is a log message")
}
  1. 设置日志输出位置
    • 默认情况下,log包输出到标准错误(os.Stderr)。可以使用log.SetOutput函数来更改输出位置。例如,将日志输出到文件:
package main

import (
    "log"
    "os"
)

func main() {
    file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("Failed to open log file: %v", err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.Println("This log message will be written to app.log")
}
  1. 在不同阶段添加日志辅助定位问题
    • 函数入口处:记录输入参数,这样可以确保传入函数的数据是预期的。
func calculateSum(a, b int) int {
    log.Printf("Entering calculateSum with a = %d and b = %d\n", a, b)
    result := a + b
    log.Printf("Exiting calculateSum with result = %d\n", result)
    return result
}
  • 关键计算步骤:在函数执行过程中的关键计算处添加日志,有助于确认中间结果是否正确。
func complexCalculation(x, y int) int {
    step1 := x * 2
    log.Printf("Step 1: x * 2 = %d\n", step1)
    step2 := y + 3
    log.Printf("Step 2: y + 3 = %d\n", step2)
    result := step1 + step2
    log.Printf("Final result of complexCalculation: %d\n", result)
    return result
}
  • 错误处理处:记录错误信息及相关上下文,方便定位错误来源。
func readFileContent(filePath string) ([]byte, error) {
    data, err := os.ReadFile(filePath)
    if err != nil {
        log.Printf("Error reading file %s: %v", filePath, err)
        return nil, err
    }
    return data, nil
}

通过合理设置日志输出格式、输出位置,并在函数不同阶段添加日志,可以更有效地在Go函数调试场景中定位问题。