高热共公日志库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.3 KiB

  1. // Copyright 2014 beego Author. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package logs
  15. import (
  16. "encoding/json"
  17. "time"
  18. )
  19. // A filesLogWriter manages several fileLogWriter
  20. // filesLogWriter will write logs to the file in json configuration and write the same level log to correspond file
  21. // means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log
  22. // and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log
  23. // the rotate attribute also acts like fileLogWriter
  24. type multiFileLogWriter struct {
  25. writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter
  26. fullLogWriter *fileLogWriter
  27. Separate []string `json:"separate"`
  28. }
  29. var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"}
  30. // Init file logger with json config.
  31. // jsonConfig like:
  32. // {
  33. // "filename":"logs/beego.log",
  34. // "maxLines":0,
  35. // "maxsize":0,
  36. // "daily":true,
  37. // "maxDays":15,
  38. // "rotate":true,
  39. // "perm":0600,
  40. // "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"],
  41. // }
  42. func (f *multiFileLogWriter) Init(config string) error {
  43. writer := newFileWriter().(*fileLogWriter)
  44. err := writer.Init(config)
  45. if err != nil {
  46. return err
  47. }
  48. f.fullLogWriter = writer
  49. f.writers[LevelDebug+1] = writer
  50. //unmarshal "separate" field to f.Separate
  51. json.Unmarshal([]byte(config), f)
  52. jsonMap := map[string]interface{}{}
  53. json.Unmarshal([]byte(config), &jsonMap)
  54. for i := LevelEmergency; i < LevelDebug+1; i++ {
  55. for _, v := range f.Separate {
  56. if v == levelNames[i] {
  57. jsonMap["filename"] = f.fullLogWriter.fileNameOnly + "." + levelNames[i] + f.fullLogWriter.suffix
  58. jsonMap["level"] = i
  59. bs, _ := json.Marshal(jsonMap)
  60. writer = newFileWriter().(*fileLogWriter)
  61. err := writer.Init(string(bs))
  62. if err != nil {
  63. return err
  64. }
  65. f.writers[i] = writer
  66. }
  67. }
  68. }
  69. return nil
  70. }
  71. func (f *multiFileLogWriter) Destroy() {
  72. for i := 0; i < len(f.writers); i++ {
  73. if f.writers[i] != nil {
  74. f.writers[i].Destroy()
  75. }
  76. }
  77. }
  78. func (f *multiFileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
  79. if f.fullLogWriter != nil {
  80. f.fullLogWriter.WriteMsg(when, msg, level)
  81. }
  82. for i := 0; i < len(f.writers)-1; i++ {
  83. if f.writers[i] != nil {
  84. if level == f.writers[i].Level {
  85. f.writers[i].WriteMsg(when, msg, level)
  86. }
  87. }
  88. }
  89. return nil
  90. }
  91. func (f *multiFileLogWriter) Flush() {
  92. for i := 0; i < len(f.writers); i++ {
  93. if f.writers[i] != nil {
  94. f.writers[i].Flush()
  95. }
  96. }
  97. }
  98. // newFilesWriter create a FileLogWriter returning as LoggerInterface.
  99. func newFilesWriter() Logger {
  100. return &multiFileLogWriter{}
  101. }
  102. func init() {
  103. Register(AdapterMultiFile, newFilesWriter)
  104. }