log_linux_amd64.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //获取linux环境下崩溃栈(可以根据文件最后修改时间,知悉崩溃时间)
  2. //pprof memory(cpu) need graphviz
  3. //go tool pprof --pdf/web/svg http://10.105.57.151:8101/debug/pprof/heap(profile) >one.pdf
  4. package util
  5. import (
  6. "dsbqj-admin/pkg/logger"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. _ "net/http/pprof"
  11. "os"
  12. "os/exec"
  13. "syscall"
  14. )
  15. func init() {
  16. os.MkdirAll("logs", 0660)
  17. logFile, err := os.OpenFile("logs/sysdebug.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0660)
  18. if err != nil {
  19. log.Println("open sysdebug err:", err.Error())
  20. return
  21. }
  22. // 将进程标准出错重定向至文件,进程崩溃时运行时将向该文件记录协程调用栈信息
  23. syscall.Dup2(int(logFile.Fd()), int(os.Stderr.Fd()))
  24. log.Println("program runtime...")
  25. //监控pprof
  26. ListenPprof()
  27. }
  28. // 端口号是否正在被使用
  29. func PortInUse(port int) bool {
  30. checkStatement := fmt.Sprintf("lsof -i:%d ", port)
  31. output, _ := exec.Command("sh", "-c", checkStatement).CombinedOutput()
  32. if len(output) > 0 {
  33. return true
  34. }
  35. return false
  36. }
  37. // 监控pprof
  38. func ListenPprof() {
  39. go func() {
  40. port := 6060
  41. for i := 0; i < 1000; i++ { //从6060开始,找一个空闲的端口号
  42. if PortInUse(port) {
  43. port++
  44. } else {
  45. break
  46. }
  47. }
  48. logger.Info("start listen pprof: %d", port)
  49. err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
  50. if err != nil {
  51. logger.Error("pprof listen err: %s", err.Error())
  52. }
  53. }()
  54. }
  55. // 发送警告
  56. func SendAlarm(group string, content string) {
  57. if group == "" {
  58. return
  59. }
  60. command := fmt.Sprint("cagent_tools alarm '《指挥官》", content, "' ", group)
  61. cmd := exec.Command("/bin/bash", "-c", command)
  62. output, err := cmd.Output()
  63. if err != nil {
  64. log.Printf("Execute Shell:%s failed with error:%s", command, err.Error())
  65. return
  66. }
  67. log.Printf("Execute Shell:%s finished with output:\n%s", command, string(output))
  68. }