Golang 调试功能
Golang Debug Function
来自 shell 编程,我在那里使用了很多这样的函数:
log_action() {
case "" in
'ERROR')
EXIT_CODE=""
echo "[] | $(date +"%T") | | Exiting (${EXIT_CODE})"
exit ${EXIT_CODE};
;;
'WARNING')
echo "[] | $(date +"%T") | | Line: ()"
;;
'DEBUG')
if [[ ${DEBUG} -eq "1" ]]; then {
echo "[] | $(date +"%T") | | "
}; fi
;;
*)
echo "[] | $(date +"%T") | | "
;;
esac
}
log_action "WARNING" "Cannot Connect to MySQL Database" "${LINENO}")
现在,我开始学习golang,想把所有bash脚本都转过来。所以,我需要在 golang 中使用相同的函数,我尝试了以下方法:
func logHandler(t string, e string, l string) {
switch t {
case "warning":
fmt.Println("WARNING")
case "error":
fmt.Println("ERROR")
case "debug":
fmt.Println("DEBUG |", e, l)
}
}
logHandler("debug", "Test Function", "LineNumber")
但我不知道如何在调用 logHandler 函数时获取当前行号变量 (LineNumber) 并将其作为字符串或整数传递给函数。
此外,有什么方法可以 运行 跟踪模式下的 go 脚本,例如 bash 选项:set -o xtrace?
我只是一个初学者所以如果我做错了什么请指出正确的方向。
谢谢。
这是一种优雅的方式。
我们将使用 runtime
包,方法如下:
package main
import (
"fmt"
"runtime"
)
func main() {
logHandler("warning", "Test Function")
logHandler("error", "Test Function")
logHandler("debug", "Test Function")
}
func logHandler(t, e string) {
switch t {
case "warning":
fmt.Println("WARNING |", e)
case "error":
fmt.Println("ERROR |", e)
case "debug":
// 0 = This function
// 1 = Function that called this function
_, fn, line, _ := runtime.Caller(1)
fmt.Printf("DEBUG | %s:%d | %v\n", fn, line, e)
}
}
Outputs:
WARNING | Test Function
ERROR | Test Function
DEBUG | /home/runner/main.go:11 | Test Function
Working example link
你基本上可以对所有的人都这样做(警告和调试)
如果您有兴趣,这里有一些关于 runtime package.
的额外阅读材料
灵感来自 this great answer from OneOfOne.
来自 shell 编程,我在那里使用了很多这样的函数:
log_action() {
case "" in
'ERROR')
EXIT_CODE=""
echo "[] | $(date +"%T") | | Exiting (${EXIT_CODE})"
exit ${EXIT_CODE};
;;
'WARNING')
echo "[] | $(date +"%T") | | Line: ()"
;;
'DEBUG')
if [[ ${DEBUG} -eq "1" ]]; then {
echo "[] | $(date +"%T") | | "
}; fi
;;
*)
echo "[] | $(date +"%T") | | "
;;
esac
}
log_action "WARNING" "Cannot Connect to MySQL Database" "${LINENO}")
现在,我开始学习golang,想把所有bash脚本都转过来。所以,我需要在 golang 中使用相同的函数,我尝试了以下方法:
func logHandler(t string, e string, l string) {
switch t {
case "warning":
fmt.Println("WARNING")
case "error":
fmt.Println("ERROR")
case "debug":
fmt.Println("DEBUG |", e, l)
}
}
logHandler("debug", "Test Function", "LineNumber")
但我不知道如何在调用 logHandler 函数时获取当前行号变量 (LineNumber) 并将其作为字符串或整数传递给函数。
此外,有什么方法可以 运行 跟踪模式下的 go 脚本,例如 bash 选项:set -o xtrace?
我只是一个初学者所以如果我做错了什么请指出正确的方向。 谢谢。
这是一种优雅的方式。
我们将使用 runtime
包,方法如下:
package main
import (
"fmt"
"runtime"
)
func main() {
logHandler("warning", "Test Function")
logHandler("error", "Test Function")
logHandler("debug", "Test Function")
}
func logHandler(t, e string) {
switch t {
case "warning":
fmt.Println("WARNING |", e)
case "error":
fmt.Println("ERROR |", e)
case "debug":
// 0 = This function
// 1 = Function that called this function
_, fn, line, _ := runtime.Caller(1)
fmt.Printf("DEBUG | %s:%d | %v\n", fn, line, e)
}
}
Outputs:
WARNING | Test Function
ERROR | Test Function
DEBUG | /home/runner/main.go:11 | Test Function
Working example link
你基本上可以对所有的人都这样做(警告和调试)
如果您有兴趣,这里有一些关于 runtime package.
的额外阅读材料灵感来自 this great answer from OneOfOne.