diff --git a/harness/app.go b/harness/app.go index 36749c4..bb37069 100644 --- a/harness/app.go +++ b/harness/app.go @@ -60,9 +60,9 @@ func NewAppCmd(binPath string, port int) AppCmd { func (cmd AppCmd) Start() error { listeningWriter := &startupListeningWriter{os.Stdout, make(chan bool)} cmd.Stdout = listeningWriter - revel.TRACE.Println("Exec app:", cmd.Path, cmd.Args) + revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args) if err := cmd.Cmd.Start(); err != nil { - revel.ERROR.Fatalln("Error running:", err) + revel.RevelLog.Fatal("Error running:","error", err) } select { @@ -70,7 +70,7 @@ func (cmd AppCmd) Start() error { return errors.New("revel/harness: app died") case <-time.After(30 * time.Second): - revel.TRACE.Println("Killing revel server process did not respond after wait timeout", cmd.Process.Pid) + revel.RevelLog.Debug("Killing revel server process did not respond after wait timeout", cmd.Process.Pid) cmd.Kill() return errors.New("revel/harness: app timed out") @@ -84,19 +84,19 @@ func (cmd AppCmd) Start() error { // Run the app server inline. Never returns. func (cmd AppCmd) Run() { - revel.TRACE.Println("Exec app:", cmd.Path, cmd.Args) + revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args) if err := cmd.Cmd.Run(); err != nil { - revel.ERROR.Fatalln("Error running:", err) + revel.RevelLog.Fatal("Error running:","error", err) } } // Kill terminates the app server if it's running. func (cmd AppCmd) Kill() { if cmd.Cmd != nil && (cmd.ProcessState == nil || !cmd.ProcessState.Exited()) { - revel.TRACE.Println("Killing revel server pid", cmd.Process.Pid) + revel.RevelLog.Debug("Killing revel server pid","pid", cmd.Process.Pid) err := cmd.Process.Kill() if err != nil { - revel.ERROR.Fatalln("Failed to kill revel server:", err) + revel.RevelLog.Fatal("Failed to kill revel server:","error", err) } } } diff --git a/harness/build.go b/harness/build.go index 5f6627b..f8a3e12 100755 --- a/harness/build.go +++ b/harness/build.go @@ -59,12 +59,12 @@ func Build(buildFlags ...string) (app *App, compileError *revel.Error) { // It relies on the user having "go" installed. goPath, err := exec.LookPath("go") if err != nil { - revel.ERROR.Fatalf("Go executable not found in PATH.") + revel.RevelLog.Fatalf("Go executable not found in PATH.") } pkg, err := build.Default.Import(revel.ImportPath, "", build.FindOnly) if err != nil { - revel.ERROR.Fatalln("Failure importing", revel.ImportPath) + revel.RevelLog.Fatal("Failure importing", "path", revel.ImportPath) } // Binary path is a combination of $GOBIN/revel.d directory, app's import path and its name. @@ -109,14 +109,14 @@ func Build(buildFlags ...string) (app *App, compileError *revel.Error) { flags = append(flags, path.Join(revel.ImportPath, "app", "tmp")) buildCmd := exec.Command(goPath, flags...) - revel.TRACE.Println("Exec:", buildCmd.Args) + revel.RevelLog.Debug("Exec:", "args", buildCmd.Args) output, err := buildCmd.CombinedOutput() // If the build succeeded, we're done. if err == nil { return NewApp(binName), nil } - revel.ERROR.Println(string(output)) + revel.RevelLog.Error(string(output)) // See if it was an import error that we can go get. matches := importErrorPattern.FindStringSubmatch(string(output)) @@ -133,10 +133,10 @@ func Build(buildFlags ...string) (app *App, compileError *revel.Error) { // Execute "go get " getCmd := exec.Command(goPath, "get", pkgName) - revel.TRACE.Println("Exec:", getCmd.Args) + revel.RevelLog.Debug("Exec:", "args", getCmd.Args) getOutput, err := getCmd.CombinedOutput() if err != nil { - revel.ERROR.Println(string(getOutput)) + revel.RevelLog.Error(string(getOutput)) return nil, newCompileError(output) } @@ -144,7 +144,7 @@ func Build(buildFlags ...string) (app *App, compileError *revel.Error) { } // TODO remove this unreachable code and document it - revel.ERROR.Fatalf("Not reachable") + revel.RevelLog.Fatalf("Not reachable") return nil, nil } @@ -168,11 +168,11 @@ func getAppVersion() string { return "" } gitCmd := exec.Command(gitPath, "--git-dir="+gitDir, "describe", "--always", "--dirty") - revel.TRACE.Println("Exec:", gitCmd.Args) + revel.RevelLog.Debug("Exec:", "args", gitCmd.Args) output, err := gitCmd.Output() if err != nil { - revel.WARN.Println("Cannot determine git repository version:", err) + revel.RevelLog.Warn("Cannot determine git repository version:", "error", err) return "" } @@ -189,12 +189,12 @@ func cleanSource(dirs ...string) { } func cleanDir(dir string) { - revel.INFO.Println("Cleaning dir " + dir) + revel.RevelLog.Info("Cleaning dir " + dir) tmpPath := filepath.Join(revel.AppPath, dir) f, err := os.Open(tmpPath) if err != nil { if !os.IsNotExist(err) { - revel.ERROR.Println("Failed to clean dir:", err) + revel.RevelLog.Error("Failed to clean dir:", "error", err) } } else { defer func() { @@ -204,20 +204,20 @@ func cleanDir(dir string) { infos, err := f.Readdir(0) if err != nil { if !os.IsNotExist(err) { - revel.ERROR.Println("Failed to clean dir:", err) + revel.RevelLog.Error("Failed to clean dir:", "error", err) } } else { for _, info := range infos { - path := filepath.Join(tmpPath, info.Name()) + pathName := filepath.Join(tmpPath, info.Name()) if info.IsDir() { - err := os.RemoveAll(path) + err := os.RemoveAll(pathName) if err != nil { - revel.ERROR.Println("Failed to remove dir:", err) + revel.RevelLog.Error("Failed to remove dir:", "error", err) } } else { - err := os.Remove(path) + err := os.Remove(pathName) if err != nil { - revel.ERROR.Println("Failed to remove file:", err) + revel.RevelLog.Error("Failed to remove file:", "error", err) } } } @@ -237,20 +237,20 @@ func genSource(dir, filename, templateSource string, args map[string]interface{} tmpPath := filepath.Join(revel.AppPath, dir) err := os.Mkdir(tmpPath, 0777) if err != nil && !os.IsExist(err) { - revel.ERROR.Fatalf("Failed to make '%v' directory: %v", dir, err) + revel.RevelLog.Fatalf("Failed to make '%v' directory: %v", dir, err) } // Create the file file, err := os.Create(filepath.Join(tmpPath, filename)) if err != nil { - revel.ERROR.Fatalf("Failed to create file: %v", err) + revel.RevelLog.Fatalf("Failed to create file: %v", err) } defer func() { _ = file.Close() }() if _, err = file.WriteString(sourceCode); err != nil { - revel.ERROR.Fatalf("Failed to write to file: %v", err) + revel.RevelLog.Fatalf("Failed to write to file: %v", err) } } @@ -287,7 +287,7 @@ func calcImportAliases(src *SourceInfo) map[string]string { } func addAlias(aliases map[string]string, importPath, pkgName string) { - alias, ok := aliases[importPath] + alias, ok := aliases[importPath] if ok { return } @@ -298,7 +298,7 @@ func addAlias(aliases map[string]string, importPath, pkgName string) { func makePackageAlias(aliases map[string]string, pkgName string) string { i := 0 alias := pkgName - for containsValue(aliases, alias) || alias=="revel" { + for containsValue(aliases, alias) || alias == "revel" { alias = fmt.Sprintf("%s%d", pkgName, i) i++ } @@ -323,7 +323,7 @@ func newCompileError(output []byte) *revel.Error { errorMatch = regexp.MustCompile(`(?m)^(.*?)\:(\d+)\:\s(.*?)$`).FindSubmatch(output) if errorMatch == nil { - revel.ERROR.Println("Failed to parse build errors:\n", string(output)) + revel.RevelLog.Error("Failed to parse build errors", "error", string(output)) return &revel.Error{ SourceType: "Go code", Title: "Go Compilation Error", @@ -333,7 +333,7 @@ func newCompileError(output []byte) *revel.Error { errorMatch = append(errorMatch, errorMatch[3]) - revel.ERROR.Println("Build errors:\n", string(output)) + revel.RevelLog.Error("Build errors", "errors", string(output)) } // Read the source for the offending file. @@ -360,7 +360,7 @@ func newCompileError(output []byte) *revel.Error { fileStr, err := revel.ReadLines(absFilename) if err != nil { compileError.MetaError = absFilename + ": " + err.Error() - revel.ERROR.Println(compileError.MetaError) + revel.RevelLog.Error(compileError.MetaError) return compileError } diff --git a/harness/harness.go b/harness/harness.go index b503909..1c9be43 100644 --- a/harness/harness.go +++ b/harness/harness.go @@ -97,7 +97,7 @@ func NewHarness() *Harness { revel.MainTemplateLoader = revel.NewTemplateLoader( []string{filepath.Join(revel.RevelPath, "templates")}) if err := revel.MainTemplateLoader.Refresh(); err != nil { - revel.ERROR.Println(err) + revel.RevelLog.Error("Template loader error", "error", err) } addr := revel.HTTPAddr @@ -118,7 +118,7 @@ func NewHarness() *Harness { serverURL, _ := url.ParseRequestURI(fmt.Sprintf(scheme+"://%s:%d", addr, port)) - harness := &Harness{ + serverHarness := &Harness{ port: port, serverHost: serverURL.String()[len(scheme+"://"):], proxy: httputil.NewSingleHostReverseProxy(serverURL), @@ -126,11 +126,11 @@ func NewHarness() *Harness { } if revel.HTTPSsl { - harness.proxy.Transport = &http.Transport{ + serverHarness.proxy.Transport = &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } } - return harness + return serverHarness } // Refresh method rebuilds the Revel application and run it on the given port. @@ -143,7 +143,7 @@ func (h *Harness) Refresh() (err *revel.Error) { h.app.Kill() } - revel.TRACE.Println("Rebuild") + revel.RevelLog.Debug("Rebuild Called") h.app, err = Build() if err != nil { return @@ -187,7 +187,7 @@ func (h *Harness) Run() { go func() { addr := fmt.Sprintf("%s:%d", revel.HTTPAddr, revel.HTTPPort) - revel.INFO.Printf("Listening on %s", addr) + revel.RevelLog.Infof("Listening on %s", addr) var err error if revel.HTTPSsl { @@ -200,7 +200,7 @@ func (h *Harness) Run() { err = http.ListenAndServe(addr, h) } if err != nil { - revel.ERROR.Fatalln("Failed to start reverse proxy:", err) + revel.RevelLog.Error("Failed to start reverse proxy:", "error", err) } }() @@ -218,13 +218,13 @@ func (h *Harness) Run() { func getFreePort() (port int) { conn, err := net.Listen("tcp", ":0") if err != nil { - revel.ERROR.Fatal(err) + revel.RevelLog.Fatal("Unable to fetch a freee port address", "error", err) } port = conn.Addr().(*net.TCPAddr).Port err = conn.Close() if err != nil { - revel.ERROR.Fatal(err) + revel.RevelLog.Fatal("Unable to close port", "error", err) } return port } @@ -246,7 +246,7 @@ func proxyWebsocket(w http.ResponseWriter, r *http.Request, host string) { } if err != nil { http.Error(w, "Error contacting backend server.", 500) - revel.ERROR.Printf("Error dialing websocket backend %s: %v", host, err) + revel.RevelLog.Error("Error dialing websocket backend ", "host", host, "error", err) return } hj, ok := w.(http.Hijacker) @@ -256,21 +256,21 @@ func proxyWebsocket(w http.ResponseWriter, r *http.Request, host string) { } nc, _, err := hj.Hijack() if err != nil { - revel.ERROR.Printf("Hijack error: %v", err) + revel.RevelLog.Error("Hijack error", "error", err) return } defer func() { if err = nc.Close(); err != nil { - revel.ERROR.Println(err) + revel.RevelLog.Error("Connection close error", "error", err) } if err = d.Close(); err != nil { - revel.ERROR.Println(err) + revel.RevelLog.Error("Dial close error", "error", err) } }() err = r.Write(d) if err != nil { - revel.ERROR.Printf("Error copying request to target: %v", err) + revel.RevelLog.Error("Error copying request to target", "error", err) return } diff --git a/harness/reflect.go b/harness/reflect.go index 24e0e94..d9bb6bb 100644 --- a/harness/reflect.go +++ b/harness/reflect.go @@ -13,7 +13,6 @@ import ( "go/parser" "go/scanner" "go/token" - "log" "os" "path/filepath" "strings" @@ -98,14 +97,14 @@ func ProcessSource(roots []string) (*SourceInfo, *revel.Error) { for _, root := range roots { rootImportPath := importPathFromPath(root) if rootImportPath == "" { - revel.WARN.Println("Skipping code path", root) + revel.RevelLog.Warn("Skipping empty code path", "path", root) continue } // Start walking the directory tree. _ = revel.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { - log.Println("Error scanning app source:", err) + revel.RevelLog.Error("Error scanning app source:", "error", err) return nil } @@ -149,7 +148,7 @@ func ProcessSource(roots []string) (*SourceInfo, *revel.Error) { // This is exception, err alredy checked above. Here just a print ast.Print(nil, err) - log.Fatalf("Failed to parse dir: %s", err) + revel.RevelLog.Fatal("Failed to parse dir", "error", err) } // Skip "main" packages. @@ -174,7 +173,7 @@ func ProcessSource(roots []string) (*SourceInfo, *revel.Error) { for i := range pkgs { println("Found package ", i) } - log.Println("Most unexpected! Multiple packages in a single directory:", pkgs) + revel.RevelLog.Error("Most unexpected! Multiple packages in a single directory:", "packages", pkgs) } var pkg *ast.Package @@ -199,7 +198,7 @@ func appendSourceInfo(srcInfo1, srcInfo2 *SourceInfo) *SourceInfo { srcInfo1.InitImportPaths = append(srcInfo1.InitImportPaths, srcInfo2.InitImportPaths...) for k, v := range srcInfo2.ValidationKeys { if _, ok := srcInfo1.ValidationKeys[k]; ok { - log.Println("Key conflict when scanning validation calls:", k) + revel.RevelLog.Warn("Key conflict when scanning validation calls:", "key", k) continue } srcInfo1.ValidationKeys[k] = v @@ -317,7 +316,7 @@ func addImports(imports map[string]string, decl ast.Decl, srcDir string) { // We expect this to happen for apps using reverse routing (since we // have not yet generated the routes). Don't log that. if !strings.HasSuffix(fullPath, "/app/routes") { - revel.TRACE.Println("Could not find import:", fullPath) + revel.RevelLog.Debug("Could not find import:", "path", fullPath) } continue } @@ -395,7 +394,7 @@ func appendStruct(specs []*TypeInfo, pkgImportPath string, pkg *ast.Package, dec } else { var ok bool if importPath, ok = imports[pkgName]; !ok { - log.Print("Failed to find import path for ", pkgName, ".", typeName) + revel.RevelLog.Error("Failed to find import path for ", "package", pkgName, "type", typeName) continue } } @@ -454,13 +453,13 @@ func appendAction(fset *token.FileSet, mm methodMap, decl ast.Decl, pkgImportPat var importPath string typeExpr := NewTypeExpr(pkgName, field.Type) if !typeExpr.Valid { - log.Printf("Didn't understand argument '%s' of action %s. Ignoring.\n", name, getFuncName(funcDecl)) + revel.RevelLog.Warnf("Didn't understand argument '%s' of action %s. Ignoring.", name, getFuncName(funcDecl)) return // We didn't understand one of the args. Ignore this action. } if typeExpr.PkgName != "" { var ok bool if importPath, ok = imports[typeExpr.PkgName]; !ok { - log.Println("Failed to find import for arg of type:", typeExpr.TypeName("")) + revel.RevelLog.Errorf("Failed to find import for arg of type:", typeExpr.TypeName("")) } } method.Args = append(method.Args, &MethodArg{ @@ -646,7 +645,7 @@ func getStructTypeDecl(decl ast.Decl, fset *token.FileSet) (spec *ast.TypeSpec, } if len(genDecl.Specs) == 0 { - revel.WARN.Printf("Surprising: %s:%d Decl contains no specifications", fset.Position(decl.Pos()).Filename, fset.Position(decl.Pos()).Line) + revel.RevelLog.Warnf("Surprising: %s:%d Decl contains no specifications", fset.Position(decl.Pos()).Filename, fset.Position(decl.Pos()).Line) return } @@ -751,7 +750,7 @@ func NewTypeExpr(pkgName string, expr ast.Expr) TypeExpr { e := NewTypeExpr(pkgName, t.Elt) return TypeExpr{"[]" + e.Expr, e.PkgName, e.pkgIndex + 2, e.Valid} default: - log.Println("Failed to generate name for field. Make sure the field name is valid.") + revel.RevelLog.Error("Failed to generate name for field. Make sure the field name is valid.") } return TypeExpr{Valid: false} } @@ -799,10 +798,10 @@ func importPathFromPath(root string) string { srcPath := filepath.Join(build.Default.GOROOT, "src", "pkg") if strings.HasPrefix(root, srcPath) { - revel.WARN.Println("Code path should be in GOPATH, but is in GOROOT:", root) + revel.RevelLog.Warn("Code path should be in GOPATH, but is in GOROOT:", "path", root) return filepath.ToSlash(root[len(srcPath)+1:]) } - revel.ERROR.Println("Unexpected! Code path is not in GOPATH:", root) + revel.RevelLog.Error("Unexpected! Code path is not in GOPATH:", "path", root) return "" } diff --git a/harness/reflect_test.go b/harness/reflect_test.go index 18116ba..3bf7e23 100644 --- a/harness/reflect_test.go +++ b/harness/reflect_test.go @@ -8,8 +8,6 @@ import ( "go/ast" "go/parser" "go/token" - "io/ioutil" - "log" "reflect" "strings" "testing" @@ -183,7 +181,7 @@ NEXT_TEST: func BenchmarkProcessBookingSource(b *testing.B) { revel.Init("", "github.com/revel/examples/booking", "") - revel.TRACE = log.New(ioutil.Discard, "", 0) + revel.GetRootLogHandler().Disable() b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/revel/build.go b/revel/build.go index 6de71e9..3e0d56b 100644 --- a/revel/build.go +++ b/revel/build.go @@ -60,11 +60,11 @@ func buildApp(args []string) { } if err := os.RemoveAll(destPath); err != nil && !os.IsNotExist(err) { - revel.ERROR.Fatalln(err) + revel.RevelLog.Fatal("Remove all error","error", err) } if err := os.MkdirAll(destPath, 0777); err != nil { - revel.ERROR.Fatalln(err) + revel.RevelLog.Fatal("makedir error","error",err) } app, reverr := harness.Build() @@ -101,7 +101,7 @@ func buildApp(args []string) { } modulePath, err := revel.ResolveImportPath(moduleImportPath) if err != nil { - revel.ERROR.Fatalln("Failed to load module %s: %s", key[len("module."):], err) + revel.RevelLog.Fatalf("Failed to load module %s: %s", key[len("module."):], err) } modulePaths[moduleImportPath] = modulePath } diff --git a/revel/new.go b/revel/new.go index c893fbd..42f20d1 100644 --- a/revel/new.go +++ b/revel/new.go @@ -8,7 +8,6 @@ import ( "bytes" "fmt" "go/build" - "log" "math/rand" "os" "os/exec" @@ -67,8 +66,6 @@ func newApp(args []string) { errorf("Too many arguments provided.\nRun 'revel help new' for usage.\n") } - revel.ERROR.SetFlags(log.LstdFlags) - // checking and setting go paths initGoPaths() @@ -129,7 +126,7 @@ func initGoPaths() { } if len(srcRoot) == 0 { - revel.ERROR.Fatalln("Abort: could not create a Revel application outside of GOPATH.") + revel.RevelLog.Fatal("Abort: could not create a Revel application outside of GOPATH.") } // set go src path diff --git a/revel/package.go b/revel/package.go index 31b5ff3..33db250 100644 --- a/revel/package.go +++ b/revel/package.go @@ -53,7 +53,7 @@ func packageApp(args []string) { // Remove the archive if it already exists. destFile := filepath.Base(revel.BasePath) + ".tar.gz" if err := os.Remove(destFile); err != nil && !os.IsNotExist(err) { - revel.ERROR.Fatal(err) + revel.RevelLog.Fatal("Unable to remove target file","error",err,"file",destFile) } // Collect stuff in a temp directory. diff --git a/revel/skeleton/conf/app.conf.template b/revel/skeleton/conf/app.conf.template index 7debe6b..f091181 100644 --- a/revel/skeleton/conf/app.conf.template +++ b/revel/skeleton/conf/app.conf.template @@ -84,15 +84,6 @@ format.datetime = 2006-01-02 15:04 results.chunked = false -# Prefixes for each log message line. -# User can override these prefix values within any section -# For e.g: [dev], [prod], etc -log.trace.prefix = "TRACE " -log.info.prefix = "INFO " -log.warn.prefix = "WARN " -log.error.prefix = "ERROR " - - # The default language of this application. i18n.default_language = en @@ -179,36 +170,12 @@ module.testrunner = github.com/revel/modules/testrunner # Log to Os's standard error output. Default value. # "relative/path/to/log" # Log to file. -log.trace.output = off -log.info.output = stderr -log.warn.output = stderr -log.error.output = stderr - - -# Revel log flags. Possible flags defined by the Go `log` package. Go log is -# "Bits OR'ed together to control what's printed -# See: -# https://golang.org/pkg/log/#pkg-constants -# Values: -# "0" -# Just log the message, turn off the flags. -# "3" -# log.LstdFlags (log.Ldate|log.Ltime) -# "19" -# log.Ldate|log.Ltime|log.Lshortfile -# "23" -# log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile -log.trace.flags = 19 -log.info.flags = 19 -log.warn.flags = 19 -log.error.flags = 19 - +log.all.filter.module.app = stdout # Log all loggers for the application to the stdout +log.error.output = stderr # Log all loggers for Revel errors to the stderr # Revel request access log # Access log line format: -# RequestStartTime ClientIP ResponseStatus RequestLatency HTTPMethod URLPath -# Sample format: -# 2016/05/25 17:46:37.112 127.0.0.1 200 270.157µs GET / +# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog log.request.output = stderr @@ -229,30 +196,12 @@ watch = false module.testrunner = -log.trace.output = off -log.info.output = off -log.warn.output = log/%(app.name)s.log -log.error.output = log/%(app.name)s.log - -# Revel log flags. Possible flags defined by the Go `log` package, -# please refer https://golang.org/pkg/log/#pkg-constants -# Go log is "Bits or'ed together to control what's printed" -# Examples: -# 0 => just log the message, turn off the flags -# 3 => log.LstdFlags (log.Ldate|log.Ltime) -# 19 => log.Ldate|log.Ltime|log.Lshortfile -# 23 => log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile -log.trace.flags = 3 -log.info.flags = 3 -log.warn.flags = 3 -log.error.flags = 3 - +log.warn.output = log/%(app.name)s.log # Log all loggers for the application to the stdout +log.error.output = log/%(app.name)s.log # Log all errors to the stdout # Revel request access log # Access log line format: -# RequestStartTime ClientIP ResponseStatus RequestLatency HTTPMethod URLPath -# Sample format: -# 2016/05/25 17:46:37.112 127.0.0.1 200 270.157µs GET / +# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog # Example: -# log.request.output = %(app.name)s-request.log -log.request.output = off +# log.request.output = %(app.name)s-request.json +log.request.output = log/requests.json