diff --git a/commands/hugo.go b/commands/hugo.go index ffc6f0228f1..4f9168e2392 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -131,7 +131,7 @@ func (c *commandeer) createLogger(cfg config.Provider, running bool) (*loggers.L logThreshold = jww.LevelWarn logFile = cfg.GetString("logFile") outHandle = os.Stdout - stdoutThreshold = jww.LevelError + stdoutThreshold = jww.LevelWarn ) if c.h.verboseLog || c.h.logging || (c.h.logFile != "") { @@ -294,7 +294,7 @@ func (c *commandeer) fullBuild() error { if !os.IsNotExist(err) { return errors.Wrap(err, "Error copying static files") } - c.logger.WARN.Println("No Static directory found") + c.logger.INFO.Println("No Static directory found") } langCount = cnt langCount = cnt @@ -405,7 +405,7 @@ func (c *commandeer) doWithPublishDirs(f func(sourceFs *filesystems.SourceFilesy staticFilesystems := c.hugo.BaseFs.SourceFilesystems.Static if len(staticFilesystems) == 0 { - c.logger.WARN.Println("No static directories found to sync") + c.logger.INFO.Println("No static directories found to sync") return langCount, nil } diff --git a/hugolib/page.go b/hugolib/page.go index d91082b3bc6..31c30c663ae 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -326,7 +326,7 @@ func (p *Page) initContent() { select { case <-ctx.Done(): - p.s.Log.WARN.Printf("WARNING: Timed out creating content for page %q (.Content will be empty). This is most likely a circular shortcode content loop that should be fixed. If this is just a shortcode calling a slow remote service, try to set \"timeout=20000\" (or higher, value is in milliseconds) in config.toml.\n", p.pathOrTitle()) + p.s.Log.WARN.Printf("Timed out creating content for page %q (.Content will be empty). This is most likely a circular shortcode content loop that should be fixed. If this is just a shortcode calling a slow remote service, try to set \"timeout=30000\" (or higher, value is in milliseconds) in config.toml.\n", p.pathOrTitle()) case err := <-c: if err != nil { p.s.SendError(err) @@ -1456,7 +1456,7 @@ func (p *Page) updateMetaData(frontmatter map[string]interface{}) error { if draft != nil && published != nil { p.Draft = *draft - p.s.Log.WARN.Printf("page %q has both draft and published settings in its frontmatter. Using draft.", p.File.Path()) + p.s.Log.INFO.Printf("page %q has both draft and published settings in its frontmatter. Using draft.", p.File.Path()) } else if draft != nil { p.Draft = *draft } else if published != nil { @@ -1973,8 +1973,6 @@ func (p *Page) initLanguage() { language := ml.Language(p.lang) if language == nil { - // It can be a file named stefano.chiodino.md. - p.s.Log.WARN.Printf("Page language (if it is that) not found in multilang setup: %s.", p.lang) language = ml.DefaultLang } diff --git a/hugolib/page_content.go b/hugolib/page_content.go index dc043f8241a..75124a1df9e 100644 --- a/hugolib/page_content.go +++ b/hugolib/page_content.go @@ -188,7 +188,7 @@ func (p *Page) parse(reader io.Reader) error { if gi != nil { p.GitInfo = gi } else if enabled { - p.s.Log.WARN.Printf("Failed to find GitInfo for page %q", p.Path()) + p.s.Log.INFO.Printf("Failed to find GitInfo for page %q", p.Path()) } } diff --git a/hugolib/pagebundler_capture.go b/hugolib/pagebundler_capture.go index c152262cc6e..446d3b0c741 100644 --- a/hugolib/pagebundler_capture.go +++ b/hugolib/pagebundler_capture.go @@ -679,7 +679,7 @@ func (c *capturer) isSeen(dirname string) bool { seen := c.seen[dirname] c.seen[dirname] = true if seen { - c.logger.WARN.Printf("Content dir %q already processed; skipped to avoid infinite recursion.", dirname) + c.logger.INFO.Printf("Content dir %q already processed; skipped to avoid infinite recursion.", dirname) return true } diff --git a/hugolib/site.go b/hugolib/site.go index e58dd39b29f..26244c0153e 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -956,14 +956,14 @@ func (s *Site) handleDataFile(r source.ReadableFile) error { higherPrecedentMap := higherPrecedentData.(map[string]interface{}) for key, value := range data.(map[string]interface{}) { if _, exists := higherPrecedentMap[key]; exists { - s.Log.WARN.Printf("Data for key '%s' in path '%s' is overridden higher precedence data already in the data tree", key, r.Path()) + s.Log.INFO.Printf("Data for key '%s' in path '%s' is overridden by higher precedence data already in the data tree", key, r.Path()) } else { higherPrecedentMap[key] = value } } default: // can't merge: higherPrecedentData is not a map - s.Log.WARN.Printf("The %T data from '%s' overridden by "+ + s.Log.INFO.Printf("The %T data from '%s' overridden by "+ "higher precedence %T data already in the data tree", data, r.Path(), higherPrecedentData) } @@ -972,7 +972,7 @@ func (s *Site) handleDataFile(r source.ReadableFile) error { current[r.BaseFileName()] = data } else { // we don't merge array data - s.Log.WARN.Printf("The %T data from '%s' overridden by "+ + s.Log.INFO.Printf("The %T data from '%s' overridden by "+ "higher precedence %T data already in the data tree", data, r.Path(), higherPrecedentData) } @@ -1759,24 +1759,49 @@ func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath s return s.publisher.Publish(pd) } +var infoOnMissingLayout = map[string]bool{ + // The 404 layout is very much optional in Hugo, but we do look for it. + "404": true, +} + func (s *Site) renderForLayouts(name string, d interface{}, w io.Writer, layouts ...string) (err error) { var templ tpl.Template templ = s.findFirstTemplate(layouts...) if templ == nil { - s.Log.WARN.Printf("[%s] Unable to locate layout for %q: %s\n", s.Language.Lang, name, layouts) + log := s.Log.WARN + if infoOnMissingLayout[name] { + log = s.Log.INFO + } + + if p, ok := d.(*PageOutput); ok { + log.Printf("Found no layout for %q, language %q, output format %q: create a template below /layouts with one of these filenames: %s\n", name, s.Language.Lang, p.outputFormat.Name, layoutsLogFormat(layouts)) + } else { + log.Printf("Found no layout for %q, language %q: create a template below /layouts with one of these filenames: %s\n", name, s.Language.Lang, layoutsLogFormat(layouts)) + } return nil } if err = templ.Execute(w, d); err != nil { - if p, ok := d.(*PageOutput); ok { - return p.errorf(err, "render of %q failed", name) - } return _errors.Wrapf(err, "render of %q failed", name) } return } +func layoutsLogFormat(layouts []string) string { + var filtered []string + for _, l := range layouts { + // This is a technical prefix of no interest to the user. + lt := strings.TrimPrefix(l, "_text/") + // We have this in the lookup path for historical reasons. + lt = strings.TrimPrefix(lt, "page/") + filtered = append(filtered, lt) + } + + filtered = helpers.UniqueStrings(filtered) + return strings.Join(filtered, ", ") +} + func (s *Site) findFirstTemplate(layouts ...string) tpl.Template { for _, layout := range layouts { if templ, found := s.Tmpl.Lookup(layout); found { diff --git a/i18n/i18n.go b/i18n/i18n.go index d395bbf62bd..25f2d300e40 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -45,11 +45,11 @@ func (t Translator) Func(lang string) bundle.TranslateFunc { if f, ok := t.translateFuncs[lang]; ok { return f } - t.logger.WARN.Printf("Translation func for language %v not found, use default.", lang) + t.logger.INFO.Printf("Translation func for language %v not found, use default.", lang) if f, ok := t.translateFuncs[t.cfg.GetString("defaultContentLanguage")]; ok { return f } - t.logger.WARN.Println("i18n not initialized, check that you have language file (in i18n) that matches the site language or the default language.") + t.logger.INFO.Println("i18n not initialized; if you need string translations, check that you have a bundle in /i18n that matches the site language or the default language.") return func(translationID string, args ...interface{}) string { return "" } @@ -61,7 +61,7 @@ func (t Translator) initFuncs(bndl *bundle.Bundle) { defaultT, err := bndl.Tfunc(defaultContentLanguage) if err != nil { - t.logger.WARN.Printf("No translation bundle found for default language %q", defaultContentLanguage) + t.logger.INFO.Printf("No translation bundle found for default language %q", defaultContentLanguage) } enableMissingTranslationPlaceholders := t.cfg.GetBool("enableMissingTranslationPlaceholders") diff --git a/tpl/data/data.go b/tpl/data/data.go index 8b3eb8292ef..cecce4b4574 100644 --- a/tpl/data/data.go +++ b/tpl/data/data.go @@ -50,7 +50,7 @@ func (ns *Namespace) GetCSV(sep string, urlParts ...string) (d [][]string, err e url := strings.Join(urlParts, "") var clearCacheSleep = func(i int, u string) { - ns.deps.Log.WARN.Printf("Retry #%d for %s and sleeping for %s", i, url, resSleep) + ns.deps.Log.INFO.Printf("Retry #%d for %s and sleeping for %s", i, url, resSleep) time.Sleep(resSleep) deleteCache(url, ns.deps.Fs.Source, ns.deps.Cfg) } @@ -109,8 +109,8 @@ func (ns *Namespace) GetJSON(urlParts ...string) (v interface{}, err error) { } err = json.Unmarshal(c, &v) if err != nil { - ns.deps.Log.WARN.Printf("Cannot read JSON from resource %s: %s", url, err) - ns.deps.Log.WARN.Printf("Retry #%d for %s and sleeping for %s", i, url, resSleep) + ns.deps.Log.INFO.Printf("Cannot read JSON from resource %s: %s", url, err) + ns.deps.Log.INFO.Printf("Retry #%d for %s and sleeping for %s", i, url, resSleep) time.Sleep(resSleep) deleteCache(url, ns.deps.Fs.Source, ns.deps.Cfg) continue