{"author":{"address":"0x750Ea21c1e98CcED0d4557196B6f4a5974CCB6f5","user":"https://learnblockchain.cn/people/18602"},"content":{"body":"# **Go 语言学习指南：配置日志的最佳实践**\r\n\r\n## 一、日志三大类\r\n\r\n### 创建项目并初始化用vscode 打开\r\n\r\n```bash\r\n~/Code/go via 🐹 v1.20.3 via 🅒 base\r\n➜ mcd demo\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base\r\n➜ go mod init\r\ngo: cannot determine module path for source directory /Users/qiaopengjun/Code/go/demo (outside GOPATH, module path must be specified)\r\n\r\nExample usage:\r\n 'go mod init example.com/m' to initialize a v0 or v1 module\r\n 'go mod init example.com/m/v2' to initialize a v2 module\r\n\r\nRun 'go help mod init' for more information.\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base\r\n➜ go mod init demo  #  初始化当前文件夹, 创建go.mod文件\r\ngo: creating new go.mod: module demo\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base\r\n➜ c\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base\r\n➜\r\n```\r\n\r\n### main.go 文件\r\n\r\n```go\r\npackage main\r\n\r\nimport \"log\"\r\n\r\nfunc init() {\r\n\r\n}\r\n\r\nfunc main() {\r\n log.Println(\"1234\")\r\n\r\n // log.Fatalln(\"1234\")\r\n\r\n // log.Panicln(\"1234\")\r\n}\r\n\r\n```\r\n\r\n### 运行 log.Println\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .        \r\n2023/06/04 22:16:25 1234\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n### main.go 文件\r\n\r\n```go\r\npackage main\r\n\r\nimport \"log\"\r\n\r\nfunc init() {\r\n\r\n}\r\n\r\nfunc main() {\r\n // log.Println(\"1234\")\r\n\r\n log.Fatalln(\"1234\")\r\n\r\n // log.Panicln(\"1234\")\r\n}\r\n\r\n```\r\n\r\n### 运行 log.Fatalln\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .\r\n2023/06/04 22:17:45 1234\r\nexit status 1\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n相当于\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n \"os\"\r\n)\r\n\r\nfunc init() {\r\n\r\n}\r\n\r\nfunc main() {\r\n // log.Println(\"1234\")\r\n\r\n log.Fatalln(\"1234\")\r\n os.Exit(1)\r\n\r\n // log.Panicln(\"1234\")\r\n}\r\n\r\n```\r\n\r\n### main.go 文件\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n)\r\n\r\nfunc init() {\r\n\r\n}\r\n\r\nfunc main() {\r\n // log.Println(\"1234\")\r\n\r\n // log.Fatalln(\"1234\")\r\n // os.Exit(1)\r\n\r\n log.Panicln(\"1234\")\r\n}\r\n\r\n```\r\n\r\n### 运行 log.Panicln\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .\r\n2023/06/04 22:20:42 1234\r\npanic: 1234\r\n\r\n\r\ngoroutine 1 [running]:\r\nlog.Panicln({0x14000092f58?, 0x0?, 0x1400004e768?})\r\n        /usr/local/go/src/log/log.go:398 +0x64\r\nmain.main()\r\n        /Users/qiaopengjun/Code/go/demo/main.go:17 +0x44\r\nexit status 2\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n### 日志三大类\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n)\r\n\r\nfunc init() {\r\n\r\n}\r\n\r\nfunc main() {\r\n log.Println(\"1234\")\r\n\r\n log.Fatalln(\"1234\")\r\n\r\n log.Panicln(\"1234\")\r\n\r\n log.Panic(\"1234\")\r\n log.Panicf(\"1234, %d\", 5678)\r\n}\r\n\r\n```\r\n\r\n## 二、配置日志\r\n\r\n### 设置前缀\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n)\r\n\r\nfunc init() {\r\n log.SetPrefix(\"LOG: \") // 设置前缀\r\n}\r\n\r\nfunc main() {\r\n log.Println(\"1234\")\r\n\r\n // log.Fatalln(\"1234\")\r\n\r\n // log.Panicln(\"1234\")\r\n\r\n // log.Panic(\"1234\")\r\n // log.Panicf(\"1234, %d\", 5678)\r\n}\r\n\r\n```\r\n\r\n#### 运行\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .\r\nLOG: 2023/06/04 22:26:08 1234\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n### 设置输出\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n \"os\"\r\n)\r\n\r\nfunc init() {\r\n log.SetPrefix(\"LOG: \") // 设置前缀\r\n\r\n f, err := os.OpenFile(\"./log.log\", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)\r\n if err != nil {\r\n  log.Fatalf(\"open log file failed with error: %v\", err)\r\n }\r\n log.SetOutput(f) // 设置输出\r\n}\r\n\r\nfunc main() {\r\n log.Println(\"1234\")\r\n\r\n // log.Fatalln(\"1234\")\r\n\r\n // log.Panicln(\"1234\")\r\n\r\n // log.Panic(\"1234\")\r\n // log.Panicf(\"1234, %d\", 5678)\r\n}\r\n\r\n```\r\n\r\n#### 运行\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n#### log.log\r\n\r\n```log\r\nLOG: 2023/06/04 22:32:00 1234\r\n\r\n```\r\n\r\n### 设置 flag\r\n\r\n#### main.go 文件\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n \"log\"\r\n \"os\"\r\n)\r\n\r\nfunc init() {\r\n log.SetPrefix(\"LOG: \") // 设置前缀\r\n\r\n f, err := os.OpenFile(\"./log.log\", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)\r\n if err != nil {\r\n  log.Fatalf(\"open log file failed with error: %v\", err)\r\n }\r\n log.SetOutput(f) // 设置输出\r\n\r\n log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile)\r\n\r\n // const (\r\n //  Ldate         = 1 \u003c\u003c iota // 1 \u003c\u003c 0 = 000000001 = 1\r\n //  Ltime                     // 1 \u003c\u003c 1 = 000000010 = 2\r\n //  Lmicroseconds             // 1 \u003c\u003c 2 = 000000100 = 4\r\n //  Llongfile                 // 1 \u003c\u003c 3 = 000001000 = 8\r\n //  Lshortfile                // 1 \u003c\u003c 4 = 000010000 = 16\r\n //  ...\r\n // )\r\n}\r\n\r\nfunc main() {\r\n log.Println(\"1234\")\r\n\r\n // log.Fatalln(\"1234\")\r\n\r\n // log.Panicln(\"1234\")\r\n\r\n // log.Panic(\"1234\")\r\n // log.Panicf(\"1234, %d\", 5678)\r\n}\r\n\r\n```\r\n\r\n#### 源码\r\n\r\n```go\r\nconst (\r\n Ldate         = 1 \u003c\u003c iota     // the date in the local time zone: 2009/01/23\r\n Ltime                         // the time in the local time zone: 01:23:23\r\n Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.\r\n Llongfile                     // full file name and line number: /a/b/c/d.go:23\r\n Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile\r\n LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone\r\n Lmsgprefix                    // move the \"prefix\" from the beginning of the line to before the message\r\n LstdFlags     = Ldate | Ltime // initial values for the standard logger 默认flag\r\n)\r\n```\r\n\r\n#### 运行\r\n\r\n```bash\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ go run .\r\n\r\nCode/go/demo via 🐹 v1.20.3 via 🅒 base \r\n➜ \r\n```\r\n\r\n#### log.log\r\n\r\n```log\r\nLOG: 2023/06/04 22:32:00 1234\r\nLOG: 2023/06/04 22:43:12.984321 /Users/qiaopengjun/Code/go/demo/main.go:30: 1234\r\n\r\n```","title":"Go 语言学习指南：配置日志的最佳实践"},"history":null,"timestamp":1723204465,"version":1}