diff --git a/go.mod b/go.mod index 4b053ed3b..e615d981e 100644 --- a/go.mod +++ b/go.mod @@ -47,6 +47,7 @@ require ( github.com/stretchr/testify v1.3.0 github.com/tensorflow/tensorflow v1.13.1 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 // indirect + github.com/toorop/gin-logrus v0.0.0-20190324082946-8887861896bb github.com/twinj/uuid v1.0.0 // indirect github.com/uber-go/atomic v1.3.2 // indirect github.com/uber/jaeger-client-go v2.15.0+incompatible // indirect diff --git a/go.sum b/go.sum index 958ea1bdc..65867b9b3 100644 --- a/go.sum +++ b/go.sum @@ -265,6 +265,8 @@ github.com/tensorflow/tensorflow v1.13.1 h1:ygn0+ztXusm6RGVP4Od5IF+8h5sAgD5qbeTv github.com/tensorflow/tensorflow v1.13.1/go.mod h1:itOSERT4trABok4UOoG+X4BoKds9F3rIsySdn+Lvu90= github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc= github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/toorop/gin-logrus v0.0.0-20190324082946-8887861896bb h1:tafzp7Ps8UI91PThlRjtZzQUzPh4ajZg5IyAoYDfbKc= +github.com/toorop/gin-logrus v0.0.0-20190324082946-8887861896bb/go.mod h1:X3Dd1SB8Gt1V968NTzpKFjMM6O8ccta2NPC6MprOxZQ= github.com/twinj/uuid v0.0.0-20150629100731-70cac2bcd273/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY= github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk= github.com/twinj/uuid v1.0.0/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY= diff --git a/internal/api/photos.go b/internal/api/photos.go index 59935d9c9..2bb65338a 100644 --- a/internal/api/photos.go +++ b/internal/api/photos.go @@ -1,10 +1,11 @@ package api import ( - "log" "net/http" "strconv" + log "github.com/sirupsen/logrus" + "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/photoprism/photoprism/internal/forms" diff --git a/internal/api/thumbnails.go b/internal/api/thumbnails.go index dd5e9960e..b05997a45 100644 --- a/internal/api/thumbnails.go +++ b/internal/api/thumbnails.go @@ -2,9 +2,10 @@ package api import ( "fmt" - "log" "strconv" + log "github.com/sirupsen/logrus" + "github.com/gin-gonic/gin" "github.com/photoprism/photoprism/internal/photoprism" ) diff --git a/internal/commands/config.go b/internal/commands/config.go index c2b619ec9..29cf2a9cb 100644 --- a/internal/commands/config.go +++ b/internal/commands/config.go @@ -19,6 +19,7 @@ func configAction(ctx *cli.Context) error { fmt.Printf("NAME VALUE\n") fmt.Printf("debug %t\n", conf.Debug()) + fmt.Printf("log-level %s\n", conf.LogLevel()) fmt.Printf("config-file %s\n", conf.ConfigFile()) fmt.Printf("app-name %s\n", conf.AppName()) fmt.Printf("app-version %s\n", conf.AppVersion()) diff --git a/internal/commands/convert.go b/internal/commands/convert.go index ecb68e004..76d7c41c9 100644 --- a/internal/commands/convert.go +++ b/internal/commands/convert.go @@ -1,10 +1,9 @@ package commands import ( - "fmt" - "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/photoprism" + log "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -22,13 +21,13 @@ func convertAction(ctx *cli.Context) error { return err } - fmt.Printf("Converting RAW images in %s to JPEG...\n", conf.OriginalsPath()) + log.Infof("converting RAW images in %s to JPEG", conf.OriginalsPath()) converter := photoprism.NewConverter(conf.DarktableCli()) converter.ConvertAll(conf.OriginalsPath()) - fmt.Println("Done.") + log.Infof("image conversion complete") return nil } diff --git a/internal/commands/export.go b/internal/commands/export.go index c73a71075..4c24fab92 100644 --- a/internal/commands/export.go +++ b/internal/commands/export.go @@ -3,6 +3,8 @@ package commands import ( "fmt" + log "github.com/sirupsen/logrus" + "github.com/araddon/dateparse" "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/photoprism" @@ -48,7 +50,7 @@ func exportAction(ctx *cli.Context) error { after := ctx.String("after") if before == "" || after == "" { - fmt.Println("You need to provide before and after dates for export, e.g.\n\nphotoprism export --after 2018/04/10 --before '2018/04/15 23:00:00'") + log.Infoln("you need to provide before and after dates for export, e.g.\n\nphotoprism export --after 2018/04/10 --before '2018/04/15 23:00:00'") return nil } @@ -72,11 +74,11 @@ func exportAction(ctx *cli.Context) error { size := ctx.Int("size") originals := photoprism.FindOriginalsByDate(conf.OriginalsPath(), afterDate, beforeDate) - fmt.Printf("Exporting photos to %s...\n", exportPath) + log.Infof("exporting photos to %s", exportPath) photoprism.ExportPhotosFromOriginals(originals, conf.ThumbnailsPath(), exportPath, size) - fmt.Println("Done.") + log.Infof("photo export complete") return nil } diff --git a/internal/commands/import.go b/internal/commands/import.go index e8137975a..3f4f321d3 100644 --- a/internal/commands/import.go +++ b/internal/commands/import.go @@ -1,10 +1,9 @@ package commands import ( - "fmt" - "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/photoprism" + log "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -24,7 +23,7 @@ func importAction(ctx *cli.Context) error { conf.MigrateDb() - fmt.Printf("Importing photos from %s...\n", conf.ImportPath()) + log.Infof("importing photos from %s", conf.ImportPath()) tensorFlow := photoprism.NewTensorFlow(conf.TensorFlowModelPath()) @@ -36,7 +35,7 @@ func importAction(ctx *cli.Context) error { importer.ImportPhotosFromDirectory(conf.ImportPath()) - fmt.Println("Done.") + log.Info("photo import complete") return nil } diff --git a/internal/commands/index.go b/internal/commands/index.go index 4b463d582..3cc1a1b03 100644 --- a/internal/commands/index.go +++ b/internal/commands/index.go @@ -1,10 +1,9 @@ package commands import ( - "fmt" - "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/photoprism" + log "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -24,15 +23,15 @@ func indexAction(ctx *cli.Context) error { conf.MigrateDb() - fmt.Printf("Indexing photos in %s...\n", conf.OriginalsPath()) + log.Infof("indexing photos in %s", conf.OriginalsPath()) tensorFlow := photoprism.NewTensorFlow(conf.TensorFlowModelPath()) indexer := photoprism.NewIndexer(conf.OriginalsPath(), tensorFlow, conf.Db()) - indexer.IndexAll() + files := indexer.IndexAll() - fmt.Println("Done.") + log.Infof("indexed %d files", len(files)) return nil } diff --git a/internal/commands/migrate.go b/internal/commands/migrate.go index 4032accae..3465cc03f 100644 --- a/internal/commands/migrate.go +++ b/internal/commands/migrate.go @@ -1,9 +1,8 @@ package commands import ( - "fmt" - "github.com/photoprism/photoprism/internal/context" + log "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -17,11 +16,11 @@ var MigrateCommand = cli.Command{ func migrateAction(ctx *cli.Context) error { conf := context.NewConfig(ctx) - fmt.Println("Migrating database...") + log.Infoln("migrating database") conf.MigrateDb() - fmt.Println("Done.") + log.Infoln("database migration complete") return nil } diff --git a/internal/commands/start.go b/internal/commands/start.go index b8b6d68bc..a6fdb0dfe 100644 --- a/internal/commands/start.go +++ b/internal/commands/start.go @@ -1,8 +1,7 @@ package commands import ( - "fmt" - "log" + log "github.com/sirupsen/logrus" "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/server" @@ -42,7 +41,7 @@ func startAction(ctx *cli.Context) error { conf := context.NewConfig(ctx) if conf.HttpServerPort() < 1 { - log.Fatal("Server port must be a positive integer") + log.Fatal("server port must be a positive integer") } if err := conf.CreateDirectories(); err != nil { @@ -51,11 +50,9 @@ func startAction(ctx *cli.Context) error { conf.MigrateDb() - fmt.Printf("Starting web server at %s:%d...\n", ctx.String("http-host"), ctx.Int("http-port")) + log.Infof("starting web server at %s:%d", conf.HttpServerHost(), conf.HttpServerPort()) server.Start(conf) - fmt.Println("Done.") - return nil } diff --git a/internal/commands/thumbnails.go b/internal/commands/thumbnails.go index b94190d5c..13aef1813 100644 --- a/internal/commands/thumbnails.go +++ b/internal/commands/thumbnails.go @@ -1,10 +1,9 @@ package commands import ( - "fmt" - "github.com/photoprism/photoprism/internal/context" "github.com/photoprism/photoprism/internal/photoprism" + log "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -36,7 +35,7 @@ func thumbnailsAction(ctx *cli.Context) error { return err } - fmt.Printf("Creating thumbnails in %s...\n", conf.ThumbnailsPath()) + log.Infof("creating thumbnails in %s", conf.ThumbnailsPath()) sizes := ctx.IntSlice("size") @@ -45,7 +44,7 @@ func thumbnailsAction(ctx *cli.Context) error { } if len(sizes) == 0 { - fmt.Println("No sizes selected. Nothing to do.") + log.Warn("no thumbnail size selected") return nil } @@ -53,7 +52,7 @@ func thumbnailsAction(ctx *cli.Context) error { photoprism.CreateThumbnailsFromOriginals(conf.OriginalsPath(), conf.ThumbnailsPath(), size, ctx.Bool("square")) } - fmt.Println("Done.") + log.Info("thumbnails created") return nil } diff --git a/internal/context/config.go b/internal/context/config.go index 6107a5d28..8e9a418b9 100644 --- a/internal/context/config.go +++ b/internal/context/config.go @@ -1,7 +1,6 @@ package context import ( - "fmt" "os" "time" @@ -35,6 +34,7 @@ type Config struct { appVersion string appCopyright string debug bool + logLevel string configFile string assetsPath string cachePath string @@ -62,26 +62,32 @@ type Config struct { // 2. SetValuesFromCliContext: Which comes after SetValuesFromFile and overrides // any previous values giving an option two override file configs through the CLI. func NewConfig(ctx *cli.Context) *Config { - log.SetLevel(log.InfoLevel) - c := &Config{} + + if ctx.GlobalBool("debug") { + c.debug = ctx.GlobalBool("debug") + } + c.appName = ctx.App.Name c.appCopyright = ctx.App.Copyright c.appVersion = ctx.App.Version + log.SetLevel(c.LogLevel()) + + log.SetFormatter(&log.TextFormatter{ + DisableColors: false, + FullTimestamp: true, + }) + if err := c.SetValuesFromFile(fsutil.ExpandedFilename(ctx.GlobalString("config-file"))); err != nil { - log.Error(err) + log.Info(err) } if err := c.SetValuesFromCliContext(ctx); err != nil { log.Error(err) } - if c.Debug() { - log.SetLevel(log.DebugLevel) - } else { - log.SetLevel(log.ErrorLevel) - } + log.SetLevel(c.LogLevel()) return c } @@ -99,6 +105,10 @@ func (c *Config) SetValuesFromFile(fileName string) error { c.debug = debug } + if logLevel, err := yamlConfig.Get("log-level"); err == nil { + c.logLevel = logLevel + } + if sqlServerHost, err := yamlConfig.Get("sql-host"); err == nil { c.sqlServerHost = sqlServerHost } @@ -173,6 +183,10 @@ func (c *Config) SetValuesFromCliContext(ctx *cli.Context) error { c.debug = ctx.GlobalBool("debug") } + if ctx.GlobalIsSet("log-level") || c.logLevel == "" { + c.logLevel = ctx.GlobalString("log-level") + } + if ctx.GlobalIsSet("assets-path") || c.assetsPath == "" { c.assetsPath = fsutil.ExpandedFilename(ctx.GlobalString("assets-path")) } @@ -288,7 +302,7 @@ func (c *Config) connectToDatabase() error { if err != nil || db == nil { if isTiDB { - fmt.Printf("Starting database server at %s:%d...\n", c.SqlServerHost(), c.SqlServerPort()) + log.Infof("starting database server at %s:%d\n", c.SqlServerHost(), c.SqlServerPort()) go tidb.Start(c.SqlServerPath(), c.SqlServerPort(), c.SqlServerHost(), c.Debug()) } @@ -306,7 +320,7 @@ func (c *Config) connectToDatabase() error { err = tidb.InitDatabase(c.SqlServerPort(), c.SqlServerPassword()) if err != nil { - log.Println(err) + log.Debug(err) } else { initSuccess = true } @@ -343,6 +357,19 @@ func (c *Config) Debug() bool { return c.debug } +// LogLevel returns the logrus log level. +func (c *Config) LogLevel() log.Level { + if c.Debug() { + c.logLevel = "debug" + } + + if logLevel, err := log.ParseLevel(c.logLevel); err == nil { + return logLevel + } else { + return log.ErrorLevel + } +} + // ConfigFile returns the config file name. func (c *Config) ConfigFile() string { return c.configFile @@ -374,6 +401,10 @@ func (c *Config) SqlServerPassword() string { // HttpServerHost returns the built-in HTTP server host name or IP address (empty for all interfaces). func (c *Config) HttpServerHost() string { + if c.httpServerHost == "" { + return "0.0.0.0" + } + return c.httpServerHost } diff --git a/internal/photoprism/colors.go b/internal/photoprism/colors.go index 8fb3ce82e..df6a6ec50 100644 --- a/internal/photoprism/colors.go +++ b/internal/photoprism/colors.go @@ -4,9 +4,10 @@ import ( "fmt" "image" "image/color" - "log" "math" + log "github.com/sirupsen/logrus" + "github.com/disintegration/imaging" "github.com/lucasb-eyer/go-colorful" ) diff --git a/internal/photoprism/config.go b/internal/photoprism/config.go index 2518f01b4..b3d4b7a5d 100644 --- a/internal/photoprism/config.go +++ b/internal/photoprism/config.go @@ -5,11 +5,13 @@ import ( _ "github.com/jinzhu/gorm/dialects/mysql" _ "github.com/jinzhu/gorm/dialects/sqlite" "github.com/photoprism/photoprism/internal/frontend" + "github.com/sirupsen/logrus" ) // Config interface implemented in context (cli) and test packages type Config interface { Debug() bool + LogLevel() logrus.Level Db() *gorm.DB CreateDirectories() error diff --git a/internal/photoprism/converter.go b/internal/photoprism/converter.go index f44ed4316..6402db9c0 100644 --- a/internal/photoprism/converter.go +++ b/internal/photoprism/converter.go @@ -2,10 +2,11 @@ package photoprism import ( "fmt" - "log" "os" "os/exec" "path/filepath" + + log "github.com/sirupsen/logrus" ) // Converter wraps a darktable cli binary. @@ -17,9 +18,9 @@ type Converter struct { // cli binary location. func NewConverter(darktableCli string) *Converter { if stat, err := os.Stat(darktableCli); err != nil { - log.Print("Darktable CLI binary could not be found at " + darktableCli) + log.Errorf("darktable CLI binary could not be found at %s", darktableCli) } else if stat.IsDir() { - log.Print("Darktable CLI must be a file, not a directory") + log.Error("darktable CLI must be a file, not a directory") } return &Converter{darktableCli: darktableCli} @@ -31,7 +32,7 @@ func (c *Converter) ConvertAll(path string) { err := filepath.Walk(path, func(filename string, fileInfo os.FileInfo, err error) error { if err != nil { - log.Print(err.Error()) + log.Error(err.Error()) return nil } @@ -46,14 +47,14 @@ func (c *Converter) ConvertAll(path string) { } if _, err := c.ConvertToJpeg(mediaFile); err != nil { - log.Print(err.Error()) + log.Error(err.Error()) } return nil }) if err != nil { - log.Print(err.Error()) + log.Error(err.Error()) } } @@ -77,7 +78,7 @@ func (c *Converter) ConvertToJpeg(image *MediaFile) (*MediaFile, error) { return mediaFile, nil } - log.Printf("Converting \"%s\" to \"%s\"\n", image.filename, jpegFilename) + log.Errorf("converting \"%s\" to \"%s\"", image.filename, jpegFilename) xmpFilename := baseFilename + ".xmp" diff --git a/internal/photoprism/export.go b/internal/photoprism/export.go index 0113ac91a..2a62dfadb 100644 --- a/internal/photoprism/export.go +++ b/internal/photoprism/export.go @@ -2,11 +2,12 @@ package photoprism import ( "fmt" - "log" "os" "path/filepath" "strings" "time" + + log "github.com/sirupsen/logrus" ) // FindOriginalsByDate searches the originalsPath given a time frame in the format of @@ -45,19 +46,28 @@ func ExportPhotosFromOriginals(originals []*MediaFile, thumbnailsPath string, ex return nil } - log.Printf("Exporting %s as %dpx JPEG", mediaFile.GetFilename(), size) + log.Infof("exporting %s as %dpx JPEG", mediaFile.GetFilename(), size) thumbnail, err := mediaFile.GetThumbnail(thumbnailsPath, size) if err != nil { - log.Print(err.Error()) + log.Error(err.Error()) } - os.MkdirAll(exportPath, os.ModePerm) + if thumbnail == nil { + log.Error("thumbnail is nil") + return err + } + + if err := os.MkdirAll(exportPath, os.ModePerm); err != nil { + log.Error(err.Error()) + } destinationFilename := fmt.Sprintf("%s/%s_%dpx.jpg", exportPath, mediaFile.GetCanonicalName(), size) - thumbnail.Copy(destinationFilename) + if err := thumbnail.Copy(destinationFilename); err != nil { + log.Error(err.Error()) + } } return nil diff --git a/internal/photoprism/importer.go b/internal/photoprism/importer.go index caf6d37a5..7a4a632c4 100644 --- a/internal/photoprism/importer.go +++ b/internal/photoprism/importer.go @@ -3,13 +3,14 @@ package photoprism import ( "fmt" "io" - "log" "os" "path" "path/filepath" "sort" "strings" + log "github.com/sirupsen/logrus" + "github.com/photoprism/photoprism/internal/fsutil" ) @@ -46,7 +47,6 @@ func (i *Importer) ImportPhotosFromDirectory(importPath string) { var destinationMainFilename string if err != nil { - // log.Print(err.Error()) return nil } @@ -72,7 +72,7 @@ func (i *Importer) ImportPhotosFromDirectory(importPath string) { relatedFiles, mainFile, err := mediaFile.GetRelatedFiles() if err != nil { - log.Printf("Could not import \"%s\": %s", mediaFile.GetRelativeFilename(importPath), err.Error()) + log.Errorf("could not import \"%s\": %s", mediaFile.GetRelativeFilename(importPath), err.Error()) return nil } @@ -83,15 +83,15 @@ func (i *Importer) ImportPhotosFromDirectory(importPath string) { if mainFile.HasSameFilename(relatedMediaFile) { destinationMainFilename = destinationFilename - log.Printf("Moving main %s file \"%s\" to \"%s\"", relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(importPath), destinationFilename) + log.Infof("moving main %s file \"%s\" to \"%s\"", relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(importPath), destinationFilename) } else { - log.Printf("Moving related %s file \"%s\" to \"%s\"", relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(importPath), destinationFilename) + log.Infof("moving related %s file \"%s\" to \"%s\"", relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(importPath), destinationFilename) } relatedMediaFile.Move(destinationFilename) } else if i.removeExistingFiles { relatedMediaFile.Remove() - log.Printf("Deleted \"%s\" (already exists)", relatedMediaFile.GetRelativeFilename(importPath)) + log.Infof("deleted \"%s\" (already exists)", relatedMediaFile.GetRelativeFilename(importPath)) } } @@ -99,7 +99,7 @@ func (i *Importer) ImportPhotosFromDirectory(importPath string) { importedMainFile, err := NewMediaFile(destinationMainFilename) if err != nil { - log.Printf("Could not index \"%s\" after import: %s", destinationMainFilename, err.Error()) + log.Errorf("could not index \"%s\" after import: %s", destinationMainFilename, err.Error()) return nil } @@ -122,14 +122,17 @@ func (i *Importer) ImportPhotosFromDirectory(importPath string) { // Remove empty directories from import path for _, directory := range directories { if directoryIsEmpty(directory) { - os.Remove(directory) - log.Printf("Deleted empty directory \"%s\"", directory) + if err := os.Remove(directory); err != nil { + log.Errorf("could not deleted empty directory \"%s\": %s", directory, err) + } else { + log.Infof("deleted empty directory \"%s\"", directory) + } } } } if err != nil { - log.Print(err.Error()) + log.Error(err.Error()) } } diff --git a/internal/photoprism/indexer.go b/internal/photoprism/indexer.go index 386010ff0..19c679929 100644 --- a/internal/photoprism/indexer.go +++ b/internal/photoprism/indexer.go @@ -2,19 +2,20 @@ package photoprism import ( "fmt" - "log" "os" "path/filepath" "strings" "time" + log "github.com/sirupsen/logrus" + "github.com/jinzhu/gorm" "github.com/photoprism/photoprism/internal/models" ) const ( - indexResultUpdated = "Updated" - indexResultAdded = "Added" + indexResultUpdated = "updated" + indexResultAdded = "added" ) // Indexer defines an indexer with originals path tensorflow and a db. @@ -121,7 +122,7 @@ func (i *Indexer) indexMediaFile(mediaFile *MediaFile) string { photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocCounty, location.LocCountry, mediaFile.GetDateCreated().Format("2006")) } } else { - log.Printf("No location: %s", err) + log.Infof("no location: %s", err) var recentPhoto models.Photo @@ -232,7 +233,7 @@ func (i *Indexer) IndexRelated(mediaFile *MediaFile) map[string]bool { relatedFiles, mainFile, err := mediaFile.GetRelatedFiles() if err != nil { - log.Printf("Could not index \"%s\": %s", mediaFile.GetRelativeFilename(i.originalsPath), err.Error()) + log.Warnf("could not index \"%s\": %s", mediaFile.GetRelativeFilename(i.originalsPath), err.Error()) return indexed } @@ -240,7 +241,7 @@ func (i *Indexer) IndexRelated(mediaFile *MediaFile) map[string]bool { mainIndexResult := i.indexMediaFile(mainFile) indexed[mainFile.GetFilename()] = true - log.Printf("%s main %s file \"%s\"", mainIndexResult, mainFile.GetType(), mainFile.GetRelativeFilename(i.originalsPath)) + log.Infof("%s main %s file \"%s\"", mainIndexResult, mainFile.GetType(), mainFile.GetRelativeFilename(i.originalsPath)) for _, relatedMediaFile := range relatedFiles { if indexed[relatedMediaFile.GetFilename()] { @@ -250,7 +251,7 @@ func (i *Indexer) IndexRelated(mediaFile *MediaFile) map[string]bool { indexResult := i.indexMediaFile(relatedMediaFile) indexed[relatedMediaFile.GetFilename()] = true - log.Printf("%s related %s file \"%s\"", indexResult, relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(i.originalsPath)) + log.Infof("%s related %s file \"%s\"", indexResult, relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(i.originalsPath)) } return indexed @@ -283,7 +284,7 @@ func (i *Indexer) IndexAll() map[string]bool { }) if err != nil { - log.Print(err.Error()) + log.Warn(err.Error()) } return indexed diff --git a/internal/photoprism/mediafile.go b/internal/photoprism/mediafile.go index eed777401..849eee0cc 100644 --- a/internal/photoprism/mediafile.go +++ b/internal/photoprism/mediafile.go @@ -7,7 +7,6 @@ import ( _ "image/jpeg" _ "image/png" "io" - "log" "math" "net/http" "os" @@ -16,6 +15,8 @@ import ( "strings" "time" + log "github.com/sirupsen/logrus" + "github.com/djherbis/times" "github.com/photoprism/photoprism/internal/fsutil" "github.com/photoprism/photoprism/internal/models" @@ -151,7 +152,7 @@ func (m *MediaFile) GetDateCreated() time.Time { t, err := times.Stat(m.GetFilename()) if err != nil { - log.Println(err.Error()) + log.Debug(err.Error()) return m.dateCreated } @@ -375,7 +376,7 @@ func (m *MediaFile) GetMimeType() string { handle, err := m.openFile() if err != nil { - log.Println("Error: Could not open file to determine mime type") + log.Errorf("could not read file to determine mime type: %s", m.GetFilename()) return "" } @@ -387,7 +388,7 @@ func (m *MediaFile) GetMimeType() string { _, err = handle.Read(buffer) if err != nil { - log.Println("Error: Could not read file to determine mime type: " + m.GetFilename()) + log.Errorf("could not read file to determine mime type: %s", m.GetFilename()) return "" } @@ -399,7 +400,7 @@ func (m *MediaFile) GetMimeType() string { func (m *MediaFile) openFile() (*os.File, error) { handle, err := os.Open(m.filename) if err != nil { - log.Println(err.Error()) + log.Error(err.Error()) return nil, err } return handle, nil @@ -437,7 +438,7 @@ func (m *MediaFile) Copy(destinationFilename string) error { file, err := m.openFile() if err != nil { - log.Println(err.Error()) + log.Error(err.Error()) return err } @@ -446,7 +447,7 @@ func (m *MediaFile) Copy(destinationFilename string) error { destination, err := os.OpenFile(destinationFilename, os.O_RDWR|os.O_CREATE, 0666) if err != nil { - log.Println(err.Error()) + log.Error(err.Error()) return err } @@ -455,7 +456,7 @@ func (m *MediaFile) Copy(destinationFilename string) error { _, err = io.Copy(destination, file) if err != nil { - log.Println(err.Error()) + log.Error(err.Error()) return err } diff --git a/internal/photoprism/tensorflow.go b/internal/photoprism/tensorflow.go index 26f6967ef..68d7fbee5 100644 --- a/internal/photoprism/tensorflow.go +++ b/internal/photoprism/tensorflow.go @@ -6,7 +6,6 @@ import ( "errors" "image" "io/ioutil" - "log" "math" "os" "sort" @@ -45,12 +44,6 @@ func (a TensorFlowLabels) Len() int { return len(a) } func (a TensorFlowLabels) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a TensorFlowLabels) Less(i, j int) bool { return a[i].Probability > a[j].Probability } -func (t *TensorFlow) closeSession(s *tf.Session) { - if err := s.Close(); err != nil { - log.Print(err) - } -} - // GetImageTagsFromFile returns tags for a jpeg image file. func (t *TensorFlow) GetImageTagsFromFile(filename string) (result []TensorFlowLabel, err error) { imageBuffer, err := ioutil.ReadFile(filename) diff --git a/internal/photoprism/thumbnails.go b/internal/photoprism/thumbnails.go index ab43a0d8a..a0b59effe 100644 --- a/internal/photoprism/thumbnails.go +++ b/internal/photoprism/thumbnails.go @@ -2,11 +2,12 @@ package photoprism import ( "fmt" - "log" "os" "path/filepath" "strings" + log "github.com/sirupsen/logrus" + "github.com/disintegration/imaging" "github.com/photoprism/photoprism/internal/fsutil" ) @@ -26,15 +27,15 @@ func CreateThumbnailsFromOriginals(originalsPath string, thumbnailsPath string, if square { if thumbnail, err := mediaFile.GetSquareThumbnail(thumbnailsPath, size); err != nil { - log.Printf("Could not create thumbnail: %s", err.Error()) + log.Errorf("could not create thumbnail: %s", err.Error()) } else { - log.Printf("Created %dx%d px thumbnail for \"%s\"", thumbnail.GetWidth(), thumbnail.GetHeight(), mediaFile.GetRelativeFilename(originalsPath)) + log.Infof("created %dx%d px thumbnail for \"%s\"", thumbnail.GetWidth(), thumbnail.GetHeight(), mediaFile.GetRelativeFilename(originalsPath)) } } else { if thumbnail, err := mediaFile.GetThumbnail(thumbnailsPath, size); err != nil { - log.Printf("Could not create thumbnail: %s", err.Error()) + log.Errorf("could not create thumbnail: %s", err.Error()) } else { - log.Printf("Created %dx%d px thumbnail for \"%s\"", thumbnail.GetWidth(), thumbnail.GetHeight(), mediaFile.GetRelativeFilename(originalsPath)) + log.Infof("created %dx%d px thumbnail for \"%s\"", thumbnail.GetWidth(), thumbnail.GetHeight(), mediaFile.GetRelativeFilename(originalsPath)) } } @@ -42,7 +43,7 @@ func CreateThumbnailsFromOriginals(originalsPath string, thumbnailsPath string, }) if err != nil { - log.Print(err.Error()) + log.Error(err.Error()) } } @@ -69,7 +70,7 @@ func (m *MediaFile) CreateThumbnail(filename string, size int) (result *MediaFil img, err := imaging.Open(m.filename, imaging.AutoOrientation(true)) if err != nil { - log.Printf("can't open original: %s", err.Error()) + log.Errorf("can't open original: %s", err.Error()) return nil, err } @@ -108,7 +109,7 @@ func (m *MediaFile) CreateSquareThumbnail(filename string, size int) (result *Me img, err := imaging.Open(m.filename, imaging.AutoOrientation(true)) if err != nil { - log.Printf("can't open original: %s", err.Error()) + log.Errorf("can't open original: %s", err.Error()) return nil, err } diff --git a/internal/server/server.go b/internal/server/server.go index b74c3d3d5..14b5743aa 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -16,7 +16,8 @@ func Start(conf photoprism.Config) { gin.SetMode(gin.ReleaseMode) } - app := gin.Default() + app := gin.New() + app.Use(gin.Logger(), gin.Recovery()) // Set template directory app.LoadHTMLGlob(conf.HttpTemplatesPath() + "/*") diff --git a/internal/test/config.go b/internal/test/config.go index bf7d2be72..246a02425 100644 --- a/internal/test/config.go +++ b/internal/test/config.go @@ -2,11 +2,12 @@ package test import ( "fmt" - "log" "os" "testing" "time" + log "github.com/sirupsen/logrus" + "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" _ "github.com/jinzhu/gorm/dialects/sqlite" @@ -173,6 +174,11 @@ func (c *Config) Debug() bool { return false } +// LogLevel returns the logrus log level. +func (c *Config) LogLevel() log.Level { + return log.DebugLevel +} + // ConfigFile returns the config file name. func (c *Config) ConfigFile() string { return ConfigFile diff --git a/internal/tidb/init.go b/internal/tidb/init.go index 001f538d0..59297f116 100644 --- a/internal/tidb/init.go +++ b/internal/tidb/init.go @@ -8,44 +8,41 @@ import ( ) func InitDatabase(port uint, password string) error { - log.Print("init database: trying login without password") + log.Info("init database: trying login without password") db, err := sql.Open("mysql", fmt.Sprintf("root:@tcp(localhost:%d)/", port)) defer db.Close() if err != nil { - log.Print(err) - log.Print("init database: login as root with password") + log.Debugf("init database: %s", err) + log.Debug("init database: login as root with password") db, err = sql.Open("mysql", fmt.Sprintf("root:%s@tcp(localhost:%d)/", password, port)) } if err != nil { - log.Print(err) + log.Error(err) return err } - log.Print("init database: login was successful") + log.Debug("init database: login was successful") _, err = db.Exec(fmt.Sprintf("SET PASSWORD FOR 'root'@'%%' = '%s'", password)) if err != nil { - log.Print(err) + log.Error(err) } else { - log.Print("init database: FLUSH PRIVILEGES") + log.Debug("init database: FLUSH PRIVILEGES") _, err = db.Exec("FLUSH PRIVILEGES") - - log.Print(err) - } - log.Printf("init database: CREATE DATABASE IF NOT EXISTS photoprism") + log.Debug("init database: CREATE DATABASE IF NOT EXISTS photoprism") _, err = db.Exec("CREATE DATABASE IF NOT EXISTS photoprism") if err != nil { - log.Print(err) + log.Error(err) } return nil diff --git a/internal/tidb/server.go b/internal/tidb/server.go index e1418a626..05b0aeed2 100644 --- a/internal/tidb/server.go +++ b/internal/tidb/server.go @@ -106,7 +106,7 @@ func Start(path string, port uint, host string, debug bool) { } setupBinlogClient() - setupMetrics() + // setupMetrics() createStoreAndDomain() createServer() signal.SetupSignalHandler(serverShutdown)