diff --git a/.gitignore b/.gitignore index 726b97962..01dd47d4a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ hls/ dist/ data/ transcoder.log +owncast.log* chat.db .yp.key backup/ diff --git a/config/config.go b/config/config.go index 333f2c77b..dadc5db47 100644 --- a/config/config.go +++ b/config/config.go @@ -1,7 +1,6 @@ package config import ( - "path/filepath" "fmt" ) @@ -42,7 +41,3 @@ func GetReleaseString() string { return fmt.Sprintf("Owncast v%s-%s (%s)", versionNumber, buildPlatform, gitCommit) } - -func GetTranscoderLogFilePath() string { - return filepath.Join(LogDirectory, "transcoder.log") -} diff --git a/core/transcoder/transcoder.go b/core/transcoder/transcoder.go index 5299d96df..39b809e5d 100644 --- a/core/transcoder/transcoder.go +++ b/core/transcoder/transcoder.go @@ -12,6 +12,7 @@ import ( "github.com/owncast/owncast/config" "github.com/owncast/owncast/core/data" + "github.com/owncast/owncast/logging" "github.com/owncast/owncast/models" "github.com/owncast/owncast/utils" ) @@ -101,7 +102,7 @@ func (t *Transcoder) Start() { err = _commandExec.Start() if err != nil { - log.Errorln("Transcoder error. See ", config.GetTranscoderLogFilePath(), " for full output to debug.") + log.Errorln("Transcoder error. See ", logging.GetTranscoderLogFilePath(), " for full output to debug.") log.Panicln(err, command) } @@ -119,7 +120,7 @@ func (t *Transcoder) Start() { } if err != nil { - log.Errorln("transcoding error. look at ", config.GetTranscoderLogFilePath(), " to help debug. your copy of ffmpeg may not support your selected codec of", t.codec.Name(), "https://owncast.online/docs/troubleshooting/#codecs") + log.Errorln("transcoding error. look at ", logging.GetTranscoderLogFilePath(), " to help debug. your copy of ffmpeg may not support your selected codec of", t.codec.Name(), "https://owncast.online/docs/troubleshooting/#codecs") } } @@ -142,7 +143,7 @@ func (t *Transcoder) getString() string { hlsOptionsString = "-hls_flags " + strings.Join(hlsOptionFlags, "+") } ffmpegFlags := []string{ - fmt.Sprintf(`FFREPORT=file="%s":level=32`, config.GetTranscoderLogFilePath()), + fmt.Sprintf(`FFREPORT=file="%s":level=32`, logging.GetTranscoderLogFilePath()), t.ffmpegPath, "-hide_banner", "-loglevel warning", diff --git a/go.mod b/go.mod index 230556daa..5fdfa1d3e 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,8 @@ require ( github.com/aws/aws-sdk-go v1.38.44 github.com/go-ole/go-ole v1.2.4 // indirect github.com/grafov/m3u8 v0.11.1 + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect + github.com/lestrrat-go/strftime v1.0.4 // indirect github.com/markbates/pkger v0.17.1 github.com/mattn/go-sqlite3 v1.14.7 github.com/microcosm-cc/bluemonday v1.0.9 @@ -16,6 +18,7 @@ require ( github.com/nareix/joy5 v0.0.0-20200712071056-a55089207c88 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/oschwald/geoip2-golang v1.5.0 + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 // indirect github.com/schollz/sqlite3dump v1.2.4 github.com/shirou/gopsutil v3.21.4+incompatible github.com/sirupsen/logrus v1.8.1 diff --git a/go.sum b/go.sum index 7968f4933..d8a100fc1 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,11 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= +github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8= +github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= github.com/markbates/pkger v0.17.1 h1:/MKEtWqtc0mZvu9OinB9UzVN9iYCwLWuyUv4Bw+PCno= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -44,9 +49,13 @@ github.com/oschwald/geoip2-golang v1.5.0 h1:igg2yQIrrcRccB1ytFXqBfOHCjXWIoMv85lV github.com/oschwald/geoip2-golang v1.5.0/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s= github.com/oschwald/maxminddb-golang v1.8.0 h1:Uh/DSnGoxsyp/KYbY1AuP0tYEwfs0sCph9p/UMXK/Hk= github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= github.com/schollz/sqlite3dump v1.2.4 h1:b3dgcKLsHZhF6OsB2EK+e/oA77vh4P/45TAh2R35OFI= github.com/schollz/sqlite3dump v1.2.4/go.mod h1:SEajZA5udi52Taht5xQYlFfHwr7AIrqPrLDrAoFv17o= github.com/shirou/gopsutil v3.21.4+incompatible h1:fuHcTm5mX+wzo542cmYcV9RTGQLbnHLI5SyQ5ryTVck= @@ -57,6 +66,7 @@ github.com/spf13/cobra v0.0.4-0.20190109003409-7547e83b2d85/go.mod h1:1l0Ry5zgKv github.com/spf13/pflag v1.0.4-0.20181223182923-24fa6976df40/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= diff --git a/logging/logging.go b/logging/logging.go index 5a8e4b451..ea2ba14ec 100644 --- a/logging/logging.go +++ b/logging/logging.go @@ -7,7 +7,10 @@ import ( "math" "os" "sync" + "time" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" + "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" logger "github.com/sirupsen/logrus" ) @@ -21,14 +24,50 @@ type OCLogger struct { } var Logger *OCLogger +var _level logrus.Level // Setup configures our custom logging destinations. -func Setup() { - logger.SetOutput(os.Stdout) // Send all logs to console +func Setup(enableDebugOptions bool, enableVerboseLogging bool) { + // Write logs to a file + path := getLogFilePath() + writer, _ := rotatelogs.New( + path+".%Y%m%d%H%M", + rotatelogs.WithLinkName(path), + rotatelogs.WithMaxAge(time.Duration(86400)*time.Second), + rotatelogs.WithRotationTime(time.Duration(604800)*time.Second), + ) + logMapping := lfshook.WriterMap{ + logrus.InfoLevel: writer, + logrus.DebugLevel: writer, + logrus.TraceLevel: writer, + logrus.WarnLevel: writer, + logrus.ErrorLevel: writer, + logrus.FatalLevel: writer, + } + + logger.AddHook(lfshook.NewHook( + logMapping, + &logger.TextFormatter{}, + )) + + if enableVerboseLogging { + logrus.SetLevel(logrus.TraceLevel) + } else { + logrus.SetLevel(logrus.InfoLevel) + } + + // Write to stdout console + logger.SetOutput(os.Stdout) + + // Write to our custom logging hook for the log API _logger := new(OCLogger) logger.AddHook(_logger) + if enableDebugOptions { + logrus.SetReportCaller(true) + } + Logger = _logger } diff --git a/logging/paths.go b/logging/paths.go new file mode 100644 index 000000000..09c0b3593 --- /dev/null +++ b/logging/paths.go @@ -0,0 +1,15 @@ +package logging + +import ( + "path/filepath" + + "github.com/owncast/owncast/config" +) + +func GetTranscoderLogFilePath() string { + return filepath.Join(config.LogDirectory, "transcoder.log") +} + +func getLogFilePath() string { + return filepath.Join(config.LogDirectory, "owncast.log") +} diff --git a/main.go b/main.go index e685bcadf..354b1115e 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,6 @@ import ( "github.com/markbates/pkger" "github.com/owncast/owncast/logging" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/owncast/owncast/config" @@ -30,7 +29,6 @@ var ( ) func main() { - configureLogging() // Enable bundling of admin assets _ = pkger.Include("/admin") @@ -57,12 +55,14 @@ func main() { if BuildPlatform != "" { config.BuildPlatform = BuildPlatform } - log.Infoln(config.GetReleaseString()) if *logDirectory != "" { config.LogDirectory = *logDirectory } + configureLogging(*enableDebugOptions, *enableVerboseLogging) + log.Infoln(config.GetReleaseString()) + // Create the data directory if needed if !utils.DoesFileExists("data") { os.Mkdir("./data", 0700) @@ -83,16 +83,6 @@ func main() { log.Exit(0) } - if *enableDebugOptions { - logrus.SetReportCaller(true) - } - - if *enableVerboseLogging { - log.SetLevel(log.TraceLevel) - } else { - log.SetLevel(log.InfoLevel) - } - config.EnableDebugFeatures = *enableDebugOptions if *dbFile != "" { @@ -144,11 +134,10 @@ func main() { if err := router.Start(); err != nil { log.Fatalln("failed to start/run the router", err) } - } -func configureLogging() { - logging.Setup() +func configureLogging(enableDebugFeatures bool, enableVerboseLogging bool) { + logging.Setup(enableDebugFeatures, enableVerboseLogging) log.SetFormatter(&log.TextFormatter{ FullTimestamp: true, })