add "error" log level

This commit is contained in:
aler9
2021-10-27 19:49:57 +02:00
parent 8875c8eaa6
commit 75d4f1437d
5 changed files with 85 additions and 76 deletions

View File

@@ -87,7 +87,7 @@ func New(args []string) (*Core, bool) {
err = p.createResources(true) err = p.createResources(true)
if err != nil { if err != nil {
p.Log(logger.Info, "ERR: %s", err) p.Log(logger.Error, "%s", err)
p.closeResources(nil, false) p.closeResources(nil, false)
return nil, false return nil, false
} }
@@ -95,7 +95,7 @@ func New(args []string) (*Core, bool) {
if p.confFound { if p.confFound {
p.confWatcher, err = confwatcher.New(p.confPath) p.confWatcher, err = confwatcher.New(p.confPath)
if err != nil { if err != nil {
p.Log(logger.Info, "ERR: %s", err) p.Log(logger.Error, "%s", err)
p.closeResources(nil, false) p.closeResources(nil, false)
return nil, false return nil, false
} }
@@ -144,13 +144,13 @@ outer:
newConf, _, err := conf.Load(p.confPath) newConf, _, err := conf.Load(p.confPath)
if err != nil { if err != nil {
p.Log(logger.Info, "ERR: %s", err) p.Log(logger.Error, "%s", err)
break outer break outer
} }
err = p.reloadConf(newConf, false) err = p.reloadConf(newConf, false)
if err != nil { if err != nil {
p.Log(logger.Info, "ERR: %s", err) p.Log(logger.Error, "%s", err)
break outer break outer
} }
@@ -159,7 +159,7 @@ outer:
err := p.reloadConf(newConf, true) err := p.reloadConf(newConf, true)
if err != nil { if err != nil {
p.Log(logger.Info, "ERR: %s", err) p.Log(logger.Error, "%s", err)
break outer break outer
} }

View File

@@ -3,6 +3,7 @@ package core
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"net" "net"
@@ -195,7 +196,6 @@ func (r *hlsMuxer) PathName() string {
func (r *hlsMuxer) run() { func (r *hlsMuxer) run() {
defer r.wg.Done() defer r.wg.Done()
defer r.log(logger.Info, "destroyed")
innerCtx, innerCtxCancel := context.WithCancel(context.Background()) innerCtx, innerCtxCancel := context.WithCancel(context.Background())
innerReady := make(chan struct{}) innerReady := make(chan struct{})
@@ -206,36 +206,34 @@ func (r *hlsMuxer) run() {
isReady := false isReady := false
outer: err := func() error {
for { for {
select { select {
case <-r.ctx.Done(): case <-r.ctx.Done():
innerCtxCancel() innerCtxCancel()
<-innerErr <-innerErr
break outer return errors.New("terminated")
case req := <-r.request: case req := <-r.request:
if isReady { if isReady {
req.Res <- r.handleRequest(req) req.Res <- r.handleRequest(req)
} else { } else {
r.requests = append(r.requests, req) r.requests = append(r.requests, req)
} }
case <-innerReady: case <-innerReady:
isReady = true isReady = true
for _, req := range r.requests { for _, req := range r.requests {
req.Res <- r.handleRequest(req) req.Res <- r.handleRequest(req)
} }
r.requests = nil r.requests = nil
case err := <-innerErr: case err := <-innerErr:
innerCtxCancel() innerCtxCancel()
if err != nil { return err
r.log(logger.Info, "ERR: %s", err)
} }
break outer
} }
} }()
r.ctxCancel() r.ctxCancel()
@@ -244,6 +242,8 @@ outer:
} }
r.parent.OnMuxerClose(r) r.parent.OnMuxerClose(r)
r.log(logger.Info, "destroyed (%v)", err)
} }
func (r *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{}) error { func (r *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{}) error {

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"io"
"net" "net"
"net/url" "net/url"
"strings" "strings"
@@ -144,44 +143,45 @@ func (c *rtmpConn) safeState() gortsplib.ServerSessionState {
func (c *rtmpConn) run() { func (c *rtmpConn) run() {
defer c.wg.Done() defer c.wg.Done()
defer c.log(logger.Info, "closed")
if c.runOnConnect != "" { err := func() error {
c.log(logger.Info, "runOnConnect command started") if c.runOnConnect != "" {
_, port, _ := net.SplitHostPort(c.rtspAddress) c.log(logger.Info, "runOnConnect command started")
onConnectCmd := externalcmd.New(c.runOnConnect, c.runOnConnectRestart, externalcmd.Environment{ _, port, _ := net.SplitHostPort(c.rtspAddress)
Path: "", onConnectCmd := externalcmd.New(c.runOnConnect, c.runOnConnectRestart, externalcmd.Environment{
Port: port, Path: "",
}) Port: port,
})
defer func() { defer func() {
onConnectCmd.Close() onConnectCmd.Close()
c.log(logger.Info, "runOnConnect command stopped") c.log(logger.Info, "runOnConnect command stopped")
}() }()
}
ctx, cancel := context.WithCancel(c.ctx)
runErr := make(chan error)
go func() {
runErr <- c.runInner(ctx)
}()
select {
case err := <-runErr:
cancel()
if err != io.EOF {
c.log(logger.Info, "ERR: %s", err)
} }
case <-c.ctx.Done(): ctx, cancel := context.WithCancel(c.ctx)
cancel() runErr := make(chan error)
<-runErr go func() {
} runErr <- c.runInner(ctx)
}()
select {
case err := <-runErr:
cancel()
return err
case <-c.ctx.Done():
cancel()
<-runErr
return errors.New("terminated")
}
}()
c.ctxCancel() c.ctxCancel()
c.parent.OnConnClose(c) c.parent.OnConnClose(c)
c.log(logger.Info, "closed (%v)", err)
} }
func (c *rtmpConn) runInner(ctx context.Context) error { func (c *rtmpConn) runInner(ctx context.Context) error {
@@ -505,7 +505,7 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
switch pkt.Type { switch pkt.Type {
case av.H264: case av.H264:
if videoTrack == nil { if videoTrack == nil {
return fmt.Errorf("ERR: received an H264 frame, but track is not set up") return fmt.Errorf("received an H264 frame, but track is not set up")
} }
nalus, err := h264.DecodeAVCC(pkt.Data) nalus, err := h264.DecodeAVCC(pkt.Data)
@@ -532,7 +532,7 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
pkts, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime) pkts, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime)
if err != nil { if err != nil {
return fmt.Errorf("ERR while encoding H264: %v", err) return fmt.Errorf("error while encoding H264: %v", err)
} }
bytss := make([][]byte, len(pkts)) bytss := make([][]byte, len(pkts))
@@ -550,12 +550,12 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
case av.AAC: case av.AAC:
if audioTrack == nil { if audioTrack == nil {
return fmt.Errorf("ERR: received an AAC frame, but track is not set up") return fmt.Errorf("received an AAC frame, but track is not set up")
} }
pkts, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime) pkts, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime)
if err != nil { if err != nil {
return fmt.Errorf("ERR while encoding AAC: %v", err) return fmt.Errorf("error while encoding AAC: %v", err)
} }
bytss := make([][]byte, len(pkts)) bytss := make([][]byte, len(pkts))

View File

@@ -181,7 +181,7 @@ func (s *rtmpSource) runInner() bool {
switch pkt.Type { switch pkt.Type {
case av.H264: case av.H264:
if videoTrack == nil { if videoTrack == nil {
return fmt.Errorf("ERR: received an H264 frame, but track is not set up") return fmt.Errorf("received an H264 frame, but track is not set up")
} }
nalus, err := h264.DecodeAVCC(pkt.Data) nalus, err := h264.DecodeAVCC(pkt.Data)
@@ -203,7 +203,7 @@ func (s *rtmpSource) runInner() bool {
pkts, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime) pkts, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime)
if err != nil { if err != nil {
return fmt.Errorf("ERR while encoding H264: %v", err) return fmt.Errorf("error while encoding H264: %v", err)
} }
bytss := make([][]byte, len(pkts)) bytss := make([][]byte, len(pkts))
@@ -221,12 +221,12 @@ func (s *rtmpSource) runInner() bool {
case av.AAC: case av.AAC:
if audioTrack == nil { if audioTrack == nil {
return fmt.Errorf("ERR: received an AAC frame, but track is not set up") return fmt.Errorf("received an AAC frame, but track is not set up")
} }
pkts, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime) pkts, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime)
if err != nil { if err != nil {
return fmt.Errorf("ERR while encoding AAC: %v", err) return fmt.Errorf("error while encoding AAC: %v", err)
} }
bytss := make([][]byte, len(pkts)) bytss := make([][]byte, len(pkts))

View File

@@ -19,6 +19,7 @@ const (
Debug Level = iota + 1 Debug Level = iota + 1
Info Info
Warn Warn
Error
) )
// Destination is a log destination. // Destination is a log destination.
@@ -137,25 +138,33 @@ func writeLevel(buf *bytes.Buffer, level Level, doColor bool) {
switch level { switch level {
case Debug: case Debug:
if doColor { if doColor {
buf.WriteString(color.RenderString(color.Debug.Code(), "D ")) buf.WriteString(color.RenderString(color.Debug.Code(), "D"))
} else { } else {
buf.WriteString("D ") buf.WriteString("D")
} }
case Info: case Info:
if doColor { if doColor {
buf.WriteString(color.RenderString(color.Green.Code(), "I ")) buf.WriteString(color.RenderString(color.Green.Code(), "I"))
} else { } else {
buf.WriteString("I ") buf.WriteString("I")
} }
case Warn: case Warn:
if doColor { if doColor {
buf.WriteString(color.RenderString(color.Warn.Code(), "W ")) buf.WriteString(color.RenderString(color.Warn.Code(), "W"))
} else { } else {
buf.WriteString("W ") buf.WriteString("W")
}
case Error:
if doColor {
buf.WriteString(color.RenderString(color.Error.Code(), "E"))
} else {
buf.WriteString("E")
} }
} }
buf.WriteByte(' ')
} }
func writeContent(buf *bytes.Buffer, format string, args []interface{}) { func writeContent(buf *bytes.Buffer, format string, args []interface{}) {