From f8c4b3aa4c9a2eee65e5686c99075fa0573c9212 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Wed, 3 Feb 2016 17:03:57 +0800 Subject: [PATCH] add files logger to separate different logs --- logs/files.go | 71 +++++++++++++++++++++++++++++++++++++++++--------- logs/log.go | 2 -- logs/logger.go | 15 +++++++++++ 3 files changed, 73 insertions(+), 15 deletions(-) diff --git a/logs/files.go b/logs/files.go index 42528660..617af1ec 100644 --- a/logs/files.go +++ b/logs/files.go @@ -1,25 +1,71 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package logs -import "time" +import ( + "encoding/json" + "time" +) +// A filesLogWriter manages several fileLogWriter +// filesLogWriter will write logs to the file in json configuration and write the same level log to correspond file +// means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log +// and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log +// the rotate attribute also acts like fileLogWriter type filesLogWriter struct { - writers [LevelDebug + 1]*fileLogWriter + writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter + fullLogWriter *fileLogWriter + Separate []string `json:"separate"` } +var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"} + +// Init file logger with json config. +// jsonConfig like: +// { +// "filename":"logs/beego.log", +// "maxLines":0, +// "maxsize":0, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":0600, +// "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"], +// } + func (f *filesLogWriter) Init(config string) error { writer := newFileWriter().(*fileLogWriter) err := writer.Init(config) if err != nil { return err } - f.writers[0] = writer + f.fullLogWriter = writer + f.writers[LevelDebug+1] = writer - for i := LevelEmergency; i <= f.writers[0].Level; i++ { - writer = newFileWriter().(*fileLogWriter) - writer.Init(config) - writer.Level = i - writer.fileNameOnly += "." + levelNames[i] - f.writers[i+1] = writer + json.Unmarshal([]byte(config), f) + + for i := LevelEmergency; i < LevelDebug+1; i++ { + for _, v := range f.Separate { + if v == levelNames[i] { + writer = newFileWriter().(*fileLogWriter) + writer.Init(config) + writer.Level = i + writer.fileNameOnly += "." + levelNames[i] + f.writers[i] = writer + } + } } return nil @@ -34,10 +80,10 @@ func (f *filesLogWriter) Destroy() { } func (f *filesLogWriter) WriteMsg(when time.Time, msg string, level int) error { - if f.writers[0] != nil { - f.writers[0].WriteMsg(when, msg, level) + if f.fullLogWriter != nil { + f.fullLogWriter.WriteMsg(when, msg, level) } - for i := 1; i < len(f.writers); i++ { + for i := 0; i < len(f.writers)-1; i++ { if f.writers[i] != nil { if level == f.writers[i].Level { f.writers[i].WriteMsg(when, msg, level) @@ -55,7 +101,6 @@ func (f *filesLogWriter) Flush() { } } - // newFilesWriter create a FileLogWriter returning as LoggerInterface. func newFilesWriter() Logger { return &filesLogWriter{} diff --git a/logs/log.go b/logs/log.go index e5c14dc1..b93b276e 100644 --- a/logs/log.go +++ b/logs/log.go @@ -64,8 +64,6 @@ const ( LevelWarn = LevelWarning ) -var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"} - type loggerType func() Logger // Logger defines the behavior of a log provider. diff --git a/logs/logger.go b/logs/logger.go index ffcead2b..323c41c5 100644 --- a/logs/logger.go +++ b/logs/logger.go @@ -1,3 +1,18 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + package logs import (