增加彩色日志输出功能

This commit is contained in:
langhuihui
2020-04-11 20:19:24 +08:00
parent 10767a3b39
commit 34a16a2508
6 changed files with 97 additions and 25 deletions

View File

@@ -1,12 +1,12 @@
package engine
import (
"log"
"path/filepath"
"runtime"
"strings"
"github.com/Monibuca/engine/util"
. "github.com/logrusorgru/aurora"
)
const (
@@ -32,7 +32,6 @@ type PluginConfig struct {
// InstallPlugin 安装插件
func InstallPlugin(opt *PluginConfig) {
log.Printf("install plugin %s version: %s", opt.Name, opt.Version)
Plugins[opt.Name] = opt
_, pluginFilePath, _, _ := runtime.Caller(1)
opt.Dir = filepath.Dir(pluginFilePath)
@@ -40,6 +39,10 @@ func InstallPlugin(opt *PluginConfig) {
if util.Exist(ui) {
opt.UI = ui
}
if parts := strings.Split(opt.Dir, "@"); len(parts) > 1 {
opt.Version = parts[len(parts)-1]
}
Print(Green("install plugin"), BrightCyan(opt.Name), BrightBlue(opt.Version))
}
// ListenerConfig 带有监听地址端口的插件配置类型

4
go.mod
View File

@@ -6,9 +6,11 @@ require (
github.com/BurntSushi/toml v0.3.1
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478
github.com/funny/utest v0.0.0-20161029064919-43870a374500 // indirect
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381
github.com/mattn/go-colorable v0.1.6
github.com/pkg/errors v0.9.1
github.com/shirou/gopsutil v2.20.1+incompatible
github.com/stretchr/testify v1.5.1 // indirect
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect
)

11
go.sum
View File

@@ -8,14 +8,19 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/elgs/gostrgen v0.0.0-20161222160715-9d61ae07eeae/go.mod h1:wruC5r2gHdr/JIUs5Rr1V45YtsAzKXZxAnn/5rPC97g=
github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478 h1:Db9StoJ6RZN3YttC0Pm0I4Y5izITRYch3RMbT59BYN0=
github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478/go.mod h1:0j1+svBH8ABEIPdUP0AIg4qedsybnXGJBakCEw8cfoo=
github.com/funny/utest v0.0.0-20161029064919-43870a374500 h1:Z0r1CZnoIWFB/Uiwh1BU5FYmuFe6L5NPi6XWQEmsTRg=
github.com/funny/utest v0.0.0-20161029064919-43870a374500/go.mod h1:mUn39tBov9jKnTWV1RlOYoNzxdBFHiSzXWdY1FoNGGg=
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/langhuihui/monibuca v0.4.1 h1:hR5xiVtYJM272ChQUrKdNd+AQyY98SNxVZEx2WAuNmA=
github.com/langhuihui/monibuca v0.4.1/go.mod h1:S4rqYUQ+bCB3WdwuXTJ92FqVRZz5Sh7zAXOJc94JqMI=
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 h1:bqDmpDG49ZRnB5PcgP0RXtQvnMSgIF14M7CBd2shtXs=
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -35,9 +40,11 @@ github.com/yakovlevdmv/gosoap v0.0.0-20180512142237-299a954b1c6d/go.mod h1:NhCpq
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20200226051749-491c5fce7268/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

View File

@@ -1,35 +1,87 @@
package engine
import (
"fmt"
"io"
"log"
"os"
"sync"
"github.com/logrusorgru/aurora"
"github.com/mattn/go-colorable"
)
// LogWriter 多端写日志类
type LogWriter struct {
io.Writer
origin io.Writer
*MultiLogWriter
}
type MultiLogWriter struct {
sync.Map
}
var logWriter = &LogWriter{new(MultiLogWriter)}
var multiLogger = log.New(logWriter.MultiLogWriter, "", log.LstdFlags)
var colorLogger = log.New(colorable.NewColorableStdout(), "", log.LstdFlags)
func init() {
log.SetOutput(logWriter)
}
func (w *LogWriter) Write(data []byte) (n int, err error) {
if n, err = w.Writer.Write(data); err != nil {
go log.SetOutput(w.origin)
}
return w.origin.Write(data)
os.Stdout.Write(data)
return w.MultiLogWriter.Write(data)
}
func (w *MultiLogWriter) Write(data []byte) (n int, err error) {
w.Range(func(k, v interface{}) bool {
n, err = k.(io.Writer).Write(data)
if err != nil {
w.Delete(k)
}
return true
})
return
}
// AddWriter 添加日志输出端
func AddWriter(wn io.Writer) {
log.SetOutput(&LogWriter{
Writer: wn,
origin: log.Writer(),
})
logWriter.Store(wn, wn)
}
// MayBeError 优雅错误判断加日志辅助函数
func MayBeError(info error) (hasError bool) {
if hasError = info != nil; hasError {
log.Print(info)
Print(aurora.Red(info))
}
return
}
func getNoColor(v ...interface{}) (noColor []interface{}) {
noColor = append(noColor, v...)
for i, value := range v {
if vv, ok := value.(aurora.Value); ok {
noColor[i] = vv.Value()
}
}
return
}
// Print 带颜色识别
func Print(v ...interface{}) {
noColor := getNoColor(v...)
colorLogger.Output(2, fmt.Sprint(v...))
multiLogger.Output(2, fmt.Sprint(noColor...))
}
// Printf calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Printf.
func Printf(format string, v ...interface{}) {
noColor := getNoColor(v...)
colorLogger.Output(2, fmt.Sprintf(format, v...))
multiLogger.Output(2, fmt.Sprintf(format, noColor...))
}
// Println calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Println.
func Println(v ...interface{}) {
noColor := getNoColor(v...)
colorLogger.Output(2, fmt.Sprintln(v...))
multiLogger.Output(2, fmt.Sprintln(noColor...))
}

21
main.go
View File

@@ -6,22 +6,25 @@ import (
"io/ioutil"
"log"
"os"
"path/filepath"
"runtime"
"time"
"strings"
"time" // colorable
"github.com/BurntSushi/toml"
. "github.com/logrusorgru/aurora"
)
var (
// ConfigRaw 配置信息的原始数据
ConfigRaw []byte
// Version 引擎版本号
Version = "1.1.3"
Version string
// EngineInfo 引擎信息
EngineInfo = &struct {
Version string
Version *string
StartTime time.Time //启动时间
}{Version, time.Now()}
}{&Version, time.Now()}
)
// Run 启动Monibuca引擎
@@ -31,11 +34,15 @@ func Run(configFile string) (err error) {
} else {
ioutil.WriteFile("shutdown.sh", []byte(fmt.Sprintf("kill -9 %d", os.Getpid())), 0777)
}
log.Printf("start monibuca version:%s", Version)
_, enginePath, _, _ := runtime.Caller(0)
if parts := strings.Split(filepath.Dir(enginePath), "@"); len(parts) > 1 {
Version = parts[len(parts)-1]
}
if ConfigRaw, err = ioutil.ReadFile(configFile); err != nil {
log.Printf("read config file error: %v", err)
Print(Red("read config file error:"), err)
return
}
Print(Green("start monibuca"), BrightBlue(Version))
go Summary.StartSummary()
var cg map[string]interface{}
if _, err = toml.Decode(string(ConfigRaw), &cg); err == nil {
@@ -60,7 +67,7 @@ func Run(configFile string) (err error) {
}
}
} else {
log.Printf("decode config file error: %v", err)
Print(Red("decode config file error:"), err)
}
return
}

View File

@@ -7,6 +7,7 @@ import (
"time"
"github.com/Monibuca/engine/avformat"
. "github.com/logrusorgru/aurora"
)
var (
@@ -89,7 +90,7 @@ type ChangeRoomCmd struct {
}
func (r *Room) onClosed() {
log.Printf("room destoryed :%s", r.StreamPath)
Print(Yellow("room destoryed :"), BgBrightCyan(r.StreamPath))
AllRoom.Delete(r.StreamPath)
OnRoomClosedHooks.Trigger(r)
if r.Publisher != nil {
@@ -118,7 +119,7 @@ func (r *Room) UnSubscribe(s *OutputStream) {
// Run 房间运行,转发逻辑
func (r *Room) Run() {
log.Printf("room create :%s", r.StreamPath)
Print(Green("room create:"), BgBrightCyan(r.StreamPath))
defer r.onClosed()
update := time.NewTicker(time.Second)
defer update.Stop()