在golang中将日志内容写入自定义文件

时间:2016-04-07 07:05:57

标签: logging go

我运行一个服务器,将日志内容重定向到一个文件,比如" current.log"用于调试目的,我无法向用户显示。但我得到了一个场景,我需要向用户显示特定日志,以便他们可以跟进后端正在进行的过程。所以我尝试为每个用户(每个用户一个日志文件)编写另一组日志(在自定义文件中),我需要向用户显示不包含任何安全数据的日志。

2 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是使用记录器机制,您可以为记录器创建对象(具有特定文件位置),然后使用写入日志那个目标 t。因此,使用特定对象写入的日志将重定向到该特定文件

  

我使用的记录器包是" github.com/sadlil/gologger"

示例代码:

package main
import (
     "github.com/sadlil/gologger"
)

func main() {
    logger := gologger.GetLogger(gologger.FILE, "/home/user/path/user.log")
    logger.Log("Test file log")
}
  

注意:文件将在创建对象时自动创建

因此您可以动态地为每个用户创建一个logger对象(每个用户获取一个不同的日志文件),并将日志重定向到该文件。 记录格式为

  

[LOG] [2016-04-07 11:31:28] [main :: test.go :: main] [8]测试文件日志

答案 1 :(得分:2)

您可以使用 lumberjack.v2 ,您可以为其定义每个用户的自定义日志文件。

在下面的代码片段中,我使用一个简单的布尔值来确定是否应该将日志内容添加到日志文件中,而不是每个用户。

package main

import (
    "gopkg.in/natefinch/lumberjack.v2"
    "io/ioutil"
    "log"
    "strconv"
)

type user struct {
    id     int
    logger *log.Logger
}

func createUser(id int, logWanted bool) user {
    var l *log.Logger

    if logWanted {
        // Here the log content will be added in the user log file
        userFIle := &lumberjack.Logger{
            Filename:   "user_log_" + strconv.Itoa(id) + ".log",
            MaxSize:    250, // mb
            MaxBackups: 5,
            MaxAge:     10, // in days
        }
        l = log.New(userFIle, "User: ", log.Ldate|log.Ltime|log.Lshortfile)
    } else {
        // Here the log content will go nowhere
        l = log.New(ioutil.Discard, "User: ", log.Ldate|log.Ltime|log.Lshortfile)
    }
    return user{id, l}
}

func doSomething(u user) {
    u.logger.Printf("Log content: user id %v \n", u.id)
}

func main() {
    user1 := createUser(1, true)
    user2 := createUser(2, false)
    user3 := createUser(3, true)
    doSomething(user1)
    doSomething(user2)
    doSomething(user3)
}

这将为每个用户创建一组新的滚动日志文件,日志在上打开

  • user1的“user_log_1.log”
  • user3的“user_log_3.log”
  • 并且没有user2的日志文件