mirror of
https://github.com/kataras/iris.git
synced 2025-02-02 15:30:36 +01:00
Nothing special: when iris.DevLogger() used then group logs based on time.
Former-commit-id: 921e2d5baabd3d299f4a719ef0a0abd924bc3bc9
This commit is contained in:
parent
abf2be4296
commit
b214df742b
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,5 +1,6 @@
|
||||||
.settings
|
.settings
|
||||||
.project
|
.project
|
||||||
|
.vscode
|
||||||
2M_donation_timeline.cpd
|
2M_donation_timeline.cpd
|
||||||
performance_tips.txt
|
performance_tips.txt
|
||||||
notes.txt
|
notes.txt
|
||||||
|
|
|
@ -70,4 +70,4 @@ I'm grateful for all the generous donations. Iris is fully funded by these dona
|
||||||
- **Thanks** to all of **You**, 424 EUR donated to [Holy Metropolis of Ioannina](http://www.imioanninon.gr/main/) for clothes, foods and medications for our fellow human beings.
|
- **Thanks** to all of **You**, 424 EUR donated to [Holy Metropolis of Ioannina](http://www.imioanninon.gr/main/) for clothes, foods and medications for our fellow human beings.
|
||||||
|
|
||||||
|
|
||||||
**Available**: VAT(50) + VAT(20) + VAT(20) + VAT(50) + VAT(6) + VAT(20) + VAT(100) + VAT(20) + VAT(20) + VAT(50) + VAT(30) + VAT(50) + VAT(20) + VAT(5) + VAT(25) + VAT(20) + VAT(20) + VAT(20) - 424 - 13 = 47,45 + 18,97 + 18,61 + 47,05 + 5,34 + 18,97 + 98,04 + 18,97 + 18,61 + 47,95 + 28,24 + 47,05 + 18,97 + 4,59 + 23,80 + 18,77 + 18,97 + 18,61 + 33,76 - 424 - 13 = **114,83 EUR**
|
**Available**: VAT(50) + VAT(20) + VAT(20) + VAT(50) + VAT(6) + VAT(20) + VAT(100) + VAT(20) + VAT(20) + VAT(50) + VAT(30) + VAT(50) + VAT(20) + VAT(5) + VAT(25) + VAT(20) + VAT(20) + VAT(20) + VAT(35) - 424 - 13 = 47,45 + 18,97 + 18,61 + 47,05 + 5,34 + 18,97 + 98,04 + 18,97 + 18,61 + 47,95 + 28,24 + 47,05 + 18,97 + 4,59 + 23,80 + 18,77 + 18,97 + 18,61 + 33,76 - 424 - 13 = **114,83 EUR**
|
||||||
|
|
|
@ -55,10 +55,11 @@ func New() iris.Policies {
|
||||||
|
|
||||||
var logger func(iris.LogMode, string)
|
var logger func(iris.LogMode, string)
|
||||||
return iris.Policies{
|
return iris.Policies{
|
||||||
EventPolicy: iris.EventPolicy{Boot: func(s *iris.Framework) {
|
EventPolicy: iris.EventPolicy{
|
||||||
logger = s.Log
|
Boot: func(s *iris.Framework) {
|
||||||
s.Set(iris.OptionOther(iris.RouterNameConfigKey, Name))
|
logger = s.Log
|
||||||
}},
|
s.Set(iris.OptionOther(iris.RouterNameConfigKey, Name))
|
||||||
|
}},
|
||||||
RouterReversionPolicy: iris.RouterReversionPolicy{
|
RouterReversionPolicy: iris.RouterReversionPolicy{
|
||||||
// path normalization done on iris' side
|
// path normalization done on iris' side
|
||||||
StaticPath: staticPath,
|
StaticPath: staticPath,
|
||||||
|
|
|
@ -518,8 +518,7 @@ func New() iris.Policies {
|
||||||
Boot: func(s *iris.Framework) {
|
Boot: func(s *iris.Framework) {
|
||||||
logger = s.Log
|
logger = s.Log
|
||||||
s.Set(iris.OptionOther(iris.RouterNameConfigKey, Name))
|
s.Set(iris.OptionOther(iris.RouterNameConfigKey, Name))
|
||||||
},
|
}},
|
||||||
},
|
|
||||||
RouterReversionPolicy: iris.RouterReversionPolicy{
|
RouterReversionPolicy: iris.RouterReversionPolicy{
|
||||||
// path normalization done on iris' side
|
// path normalization done on iris' side
|
||||||
StaticPath: func(path string) string {
|
StaticPath: func(path string) string {
|
||||||
|
|
|
@ -76,6 +76,7 @@ func (s *sessions) Adapt(frame *iris.Policies) {
|
||||||
}
|
}
|
||||||
|
|
||||||
policy.Adapt(frame)
|
policy.Adapt(frame)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UseDatabase adds a session database to the manager's provider,
|
// UseDatabase adds a session database to the manager's provider,
|
||||||
|
|
|
@ -6,6 +6,11 @@ import (
|
||||||
"gopkg.in/kataras/iris.v6/adaptors/typescript"
|
"gopkg.in/kataras/iris.v6/adaptors/typescript"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NOTE: Some machines don't allow to install typescript automatically, so if you don't have typescript installed
|
||||||
|
// and the typescript adaptor doesn't works for you then follow the below steps:
|
||||||
|
// 1. close the iris server
|
||||||
|
// 2. open your terminal and execute: npm install -g typescript
|
||||||
|
// 3. start your iris server, it should be work, as expected, now.
|
||||||
func main() {
|
func main() {
|
||||||
app := iris.New()
|
app := iris.New()
|
||||||
app.Adapt(iris.DevLogger())
|
app.Adapt(iris.DevLogger())
|
||||||
|
|
|
@ -172,12 +172,13 @@ func (e *Editor) start() {
|
||||||
|
|
||||||
cmd := npm.CommandBuilder("node", npm.NodeModuleAbs("alm/src/server.js"))
|
cmd := npm.CommandBuilder("node", npm.NodeModuleAbs("alm/src/server.js"))
|
||||||
cmd.AppendArguments("-a", e.config.Username+":"+e.config.Password,
|
cmd.AppendArguments("-a", e.config.Username+":"+e.config.Password,
|
||||||
"-h", e.config.Hostname, "-t", strconv.Itoa(e.config.Port), "-d", e.config.WorkingDir[0:len(e.config.WorkingDir)-1])
|
"-h", e.config.Hostname, "-t", strconv.Itoa(e.config.Port), "-d", e.config.WorkingDir)
|
||||||
// for auto-start in the browser: cmd.AppendArguments("-o")
|
// for auto-start in the browser: cmd.AppendArguments("-o")
|
||||||
if e.config.KeyFile != "" && e.config.CertFile != "" {
|
if e.config.KeyFile != "" && e.config.CertFile != "" {
|
||||||
cmd.AppendArguments("--httpskey", e.config.KeyFile, "--httpscert", e.config.CertFile)
|
cmd.AppendArguments("--httpskey", e.config.KeyFile, "--httpscert", e.config.CertFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prefix := ""
|
||||||
// when debug is not disabled
|
// when debug is not disabled
|
||||||
// show any messages to the user( they are useful here)
|
// show any messages to the user( they are useful here)
|
||||||
// to the io.Writer that iris' user is defined from configuration
|
// to the io.Writer that iris' user is defined from configuration
|
||||||
|
@ -189,7 +190,7 @@ func (e *Editor) start() {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for outputScanner.Scan() {
|
for outputScanner.Scan() {
|
||||||
e.logger(iris.DevMode, "Editor: "+outputScanner.Text())
|
e.logger(iris.DevMode, prefix+outputScanner.Text())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -198,7 +199,7 @@ func (e *Editor) start() {
|
||||||
errScanner := bufio.NewScanner(errReader)
|
errScanner := bufio.NewScanner(errReader)
|
||||||
go func() {
|
go func() {
|
||||||
for errScanner.Scan() {
|
for errScanner.Scan() {
|
||||||
e.logger(iris.DevMode, "Editor: "+errScanner.Text())
|
e.logger(iris.DevMode, prefix+errScanner.Text())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
@ -207,7 +208,7 @@ func (e *Editor) start() {
|
||||||
|
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.logger(iris.ProdMode, "Error while running alm-tools. Trace: "+err.Error())
|
e.logger(iris.ProdMode, prefix+err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,15 +104,15 @@ func (t *TsAdaptor) start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
t.logger(iris.DevMode, fmt.Sprintf("%d Typescript project(s) compiled ( %d monitored by a background file watcher ) ", len(projects), watchedProjects))
|
// t.logger(iris.DevMode, fmt.Sprintf("%d Typescript project(s) compiled ( %d monitored by a background file watcher ) ", len(projects), watchedProjects))
|
||||||
} else {
|
} else {
|
||||||
//search for standalone typescript (.ts) files and compile them
|
//search for standalone typescript (.ts) files and compile them
|
||||||
files := t.getTypescriptFiles()
|
files := t.getTypescriptFiles()
|
||||||
if len(files) > 0 {
|
if len(files) > 0 {
|
||||||
watchedFiles := 0
|
/* watchedFiles := 0
|
||||||
if t.Config.Tsconfig.CompilerOptions.Watch {
|
if t.Config.Tsconfig.CompilerOptions.Watch {
|
||||||
watchedFiles = len(files)
|
watchedFiles = len(files)
|
||||||
}
|
}*/
|
||||||
//it must be always > 0 if we came here, because of if hasTypescriptFiles == true.
|
//it must be always > 0 if we came here, because of if hasTypescriptFiles == true.
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
absPath, err := filepath.Abs(file)
|
absPath, err := filepath.Abs(file)
|
||||||
|
@ -142,7 +142,7 @@ func (t *TsAdaptor) start() {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
}
|
}
|
||||||
t.logger(iris.DevMode, fmt.Sprintf("%d Typescript file(s) compiled ( %d monitored by a background file watcher )", len(files), watchedFiles))
|
// t.logger(iris.DevMode, fmt.Sprintf("%d Typescript file(s) compiled ( %d monitored by a background file watcher )", len(files), watchedFiles))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,12 @@ func (s *server) Adapt(frame *iris.Policies) {
|
||||||
// serve the client side on domain:port/iris-ws.js
|
// serve the client side on domain:port/iris-ws.js
|
||||||
f.StaticContent(wsClientSidePath, "application/javascript", ClientSource).ChangeName(clientSideLookupName)
|
f.StaticContent(wsClientSidePath, "application/javascript", ClientSource).ChangeName(clientSideLookupName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we want to show configuration fields... I'm not sure for this yet, so let it commented: f.Logf(iris.DevMode, "%#v", s.config)
|
||||||
|
},
|
||||||
|
|
||||||
|
Build: func(f *iris.Framework) {
|
||||||
|
f.Log(iris.DevMode, "Serving Websockets on "+f.Config.VHost+s.config.Endpoint)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
80
iris.go
80
iris.go
|
@ -133,7 +133,7 @@ type Framework struct {
|
||||||
once sync.Once // used to 'Boot' once
|
once sync.Once // used to 'Boot' once
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultGlobalLoggerOuput = log.New(os.Stdout, "[Iris] ", log.LstdFlags)
|
var defaultGlobalLoggerOuput = log.New(os.Stdout, "", log.LstdFlags)
|
||||||
|
|
||||||
// DevLogger returns a new Logger which prints both ProdMode and DevMode messages
|
// DevLogger returns a new Logger which prints both ProdMode and DevMode messages
|
||||||
// to the default global logger printer.
|
// to the default global logger printer.
|
||||||
|
@ -144,8 +144,26 @@ var defaultGlobalLoggerOuput = log.New(os.Stdout, "[Iris] ", log.LstdFlags)
|
||||||
// Users can always ignore that and adapt a custom LoggerPolicy,
|
// Users can always ignore that and adapt a custom LoggerPolicy,
|
||||||
// which will use your custom printer instead.
|
// which will use your custom printer instead.
|
||||||
func DevLogger() LoggerPolicy {
|
func DevLogger() LoggerPolicy {
|
||||||
|
lastLog := time.Now()
|
||||||
|
distanceDuration := 850 * time.Millisecond
|
||||||
return func(mode LogMode, logMessage string) {
|
return func(mode LogMode, logMessage string) {
|
||||||
defaultGlobalLoggerOuput.Println(logMessage)
|
if strings.Contains(logMessage, banner) {
|
||||||
|
fmt.Print(logMessage)
|
||||||
|
lastLog = time.Now()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
nowLog := time.Now()
|
||||||
|
if nowLog.Before(lastLog.Add(distanceDuration)) {
|
||||||
|
// don't use the log.Logger to print this message
|
||||||
|
// if the last one was printed before some seconds.
|
||||||
|
fmt.Println(logMessage)
|
||||||
|
lastLog = nowLog
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// begin with new line in order to have the time once at the top
|
||||||
|
// and the child logs below it.
|
||||||
|
defaultGlobalLoggerOuput.Println("\u2192\n" + logMessage)
|
||||||
|
lastLog = nowLog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +204,11 @@ func New(setters ...OptionSetter) *Framework {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
s.Adapt(EventPolicy{Boot: func(*Framework) {
|
||||||
|
// Print the banner first, even if we have to print errors later.
|
||||||
|
s.Log(DevMode, banner+"\n\n")
|
||||||
|
}})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// +------------------------------------------------------------+
|
// +------------------------------------------------------------+
|
||||||
|
@ -382,11 +405,52 @@ func (s *Framework) Set(setters ...OptionSetter) {
|
||||||
|
|
||||||
// Log logs to the defined logger policy.
|
// Log logs to the defined logger policy.
|
||||||
//
|
//
|
||||||
// The default outputs to the os.Stdout when EnvMode is 'ProductionEnv'
|
// The default outputs to the os.Stdout when EnvMode is 'iris.ProdMode'
|
||||||
func (s *Framework) Log(mode LogMode, log string) {
|
func (s *Framework) Log(mode LogMode, log string) {
|
||||||
s.policies.LoggerPolicy(mode, log)
|
s.policies.LoggerPolicy(mode, log)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Author's note:
|
||||||
|
//
|
||||||
|
// I implemented this and worked for configuration fields logs but I'm not sure
|
||||||
|
// if users want to print adaptor's configuration, i.e: websocket, sessions
|
||||||
|
// so comment this feature, and
|
||||||
|
// if/when I get good feedback from the private beta testers I'll uncomment these on public repo too.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Logf same as .Log but receives arguments like fmt.Printf.
|
||||||
|
// Note: '%#v' and '%+v' named arguments are being printed, pretty.
|
||||||
|
//
|
||||||
|
// The default outputs to the os.Stdout when EnvMode is 'iris.ProdMode'
|
||||||
|
// func (s *Framework) Logf(mode LogMode, format string, v ...interface{}) {
|
||||||
|
// if mode == DevMode {
|
||||||
|
// marker := 0
|
||||||
|
// for i := 0; i < len(format); i++ {
|
||||||
|
// if format[i] == '%' {
|
||||||
|
// if i < len(format)-2 {
|
||||||
|
// if part := format[i : i+3]; part == "%#v" || part == "%+v" {
|
||||||
|
// if len(v) > marker {
|
||||||
|
// spew.Config.Indent = "\t\t\t"
|
||||||
|
// spew.Config.DisablePointerAddresses = true
|
||||||
|
// spew.Config.DisableCapacities = true
|
||||||
|
// spew.Config.DisablePointerMethods = true
|
||||||
|
// spew.Config.DisableMethods = true
|
||||||
|
// arg := v[marker]
|
||||||
|
// format = strings.Replace(format, part, "%s", 1)
|
||||||
|
// v[marker] = spew.Sdump(arg)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// marker++
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// log := fmt.Sprintf(format, v...)
|
||||||
|
//
|
||||||
|
// s.policies.LoggerPolicy(mode, log)
|
||||||
|
// }
|
||||||
|
|
||||||
// Must checks if the error is not nil, if it isn't
|
// Must checks if the error is not nil, if it isn't
|
||||||
// panics on registered iris' logger or
|
// panics on registered iris' logger or
|
||||||
// to a recovery event handler, otherwise does nothing.
|
// to a recovery event handler, otherwise does nothing.
|
||||||
|
@ -499,7 +563,15 @@ func (s *Framework) Serve(ln net.Listener) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Framework) postServe() {
|
func (s *Framework) postServe() {
|
||||||
bannerMessage := fmt.Sprintf("| Running at %s\n\n%s\n", s.Config.VHost, banner)
|
routerInfo := ""
|
||||||
|
if routerNameVal := s.Config.Other[RouterNameConfigKey]; routerNameVal != nil {
|
||||||
|
if routerName, ok := routerNameVal.(string); ok {
|
||||||
|
routerInfo = "using " + routerName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bannerMessage := fmt.Sprintf("Serving HTTP on %s port %d %s", ParseHostname(s.Config.VHost), ParsePort(s.Config.VHost), routerInfo)
|
||||||
|
|
||||||
s.Log(DevMode, bannerMessage)
|
s.Log(DevMode, bannerMessage)
|
||||||
|
|
||||||
ch := make(chan os.Signal, 1)
|
ch := make(chan os.Signal, 1)
|
||||||
|
|
|
@ -92,7 +92,7 @@ const (
|
||||||
// ProdMode the production level logger write mode,
|
// ProdMode the production level logger write mode,
|
||||||
// responsible to fatal errors, errors that happen which
|
// responsible to fatal errors, errors that happen which
|
||||||
// your app can't continue running.
|
// your app can't continue running.
|
||||||
ProdMode LogMode = iota
|
ProdMode LogMode = 1 << iota
|
||||||
// DevMode is the development level logger write mode,
|
// DevMode is the development level logger write mode,
|
||||||
// responsible to the rest of the errors, for example
|
// responsible to the rest of the errors, for example
|
||||||
// if you set a app.Favicon("myfav.ico"..) and that fav doesn't exists
|
// if you set a app.Favicon("myfav.ico"..) and that fav doesn't exists
|
||||||
|
|
Loading…
Reference in New Issue
Block a user