目录
日志的重要性及作用
日志是程序的重要组成部分
1.记录用户操作的审计日志
2.快速定位问题的根源
3.追踪程序执行的过程。
4.追踪数据的变化
5.数据统计和性能分析
6.采集运行环境数据
第三方日志库:
Golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数,对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持。
所以催生了很多第三方的日志库,但是在golang的世界里,没有一个日志库像slf4j那样在Java中具有绝对统治地位。golang中,流行的日志框架包括logrus、zap、zerolog、seelog等。
Logrus功能强大,性能高效,而且具有高度灵活性,提供了自定义插件的功能。很多开源项目,如docker,prometheus等,都是用了logrus来记录其日志。
安装Logrus的命令:
go get -u github.com/sirupsen/logrus
confs/log_config.json
- {
- "log_dir": "D:/mylog.log",
- "log_level": "info"
- }
logs_ope/log_load_config.go
- package logs_ope
-
- import (
- "encoding/json"
- "io/ioutil"
- "os"
- )
-
- // 对应结构体:
- type LogConfig struct {
- LogDir string `json:"log_dir"`
- LogLevel string `json:"log_level"`
- }
-
- // 读取配置文件:
- func LoadLogConfig() *LogConfig {
- log_conf := LogConfig{}
- //打开文件:
- file, err := os.Open("part07/confs/log_config.json")
- if err != nil { //错误处理
- panic(err)
- }
- //资源释放:
- defer file.Close()
- //用流读取文件中内容:
- data, err2 := ioutil.ReadAll(file)
- if err2 != nil {
- panic(err2)
- }
- //Unmarshal将json字符串解码到对应的数据结构中:
- //第一个参数:json字符串,第二个参数:接收json解析的数据结构
- err3 := json.Unmarshal(data, &log_conf)
- if err3 != nil {
- panic(err3)
- }
- return &log_conf
- }
logs_ope/log_init.go
- package logs_ope
-
- import (
- "github.com/sirupsen/logrus"
- "os"
- )
-
- // 初始化记录器一个实例:
- var Logrus = logrus.New()
-
- func init() {
- //先读取日志的配置文件:
- log_conf := LoadLogConfig()
- //设置日志的输出文件:
- file, err := os.OpenFile(log_conf.LogDir, os.O_APPEND|os.O_CREATE, 0666)
- if err != nil {
- panic(err)
- }
- //将上面打开的file文件设置为 日志的输出文件:
- Logrus.Out = file
- //设置日志的级别:
- //定义一个map,专门存储日志级别:
- log_level_map := map[string]logrus.Level{
- "trace": logrus.TraceLevel,
- "panic": logrus.PanicLevel,
- "fatal": logrus.FatalLevel,
- "error": logrus.ErrorLevel,
- "warn": logrus.WarnLevel,
- "info": logrus.InfoLevel,
- "debug": logrus.DebugLevel,
- }
- Logrus.SetLevel(log_level_map[log_conf.LogLevel])
- //日志格式化:设置文本格式
- Logrus.SetFormatter(&logrus.TextFormatter{})
- }
- package main
-
- import (
- "github.com/gin-gonic/gin"
- _ "test_gin/part07/logs_ope"
- "test_gin/part07/myfunc"
- )
-
- func main() {
- r := gin.Default()
- r.LoadHTMLGlob("part07/templates/**/*")
- //指定文件:
- r.Static("/s", "part07/static")
- r.GET("/test1", myfunc.Test1)
- r.Run()
- }
myfunc.go
- package myfunc
-
- import (
- "github.com/gin-gonic/gin"
- "test_gin/part07/logs_ope"
- )
-
- func Test1(context *gin.Context) {
- logs_ope.Logrus.Info("打开画面demo01/hello01.html")
- //获取路径中的参数值:
- context.HTML(200, "demo01/hello01.html", nil)
- }
hello01.html
- {{define "demo01/hello01.html"}}
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- head>
- <body>
- <form action="/toFormBind" >
- 用户名:<input type="text" name="username">
- 密码:<input type="password" name="pwd">
- <input type="submit" value="提交">
- form>
- body>
- html>
- {{end}}
测试:

![]()
一切都是假的,一切又都是真的!
努力就是自己找苦难!