log.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package log
  2. import (
  3. _ "errors"
  4. "fmt"
  5. "github.com/mattn/go-colorable"
  6. "log"
  7. "os"
  8. "path"
  9. "strings"
  10. "time"
  11. )
  12. // levels
  13. const (
  14. debugLevel = 0
  15. releaseLevel = 1
  16. errorLevel = 2
  17. fatalLevel = 3
  18. )
  19. const (
  20. printDebugLevel = "[D]"
  21. printReleaseLevel = "[R]"
  22. printErrorLevel = "[E]"
  23. printFatalLevel = "[F]"
  24. )
  25. const (
  26. Green = "\033[97;42m"
  27. White = "\033[90;47m"
  28. Yellow = "\033[90;43m"
  29. Red = "\033[97;41m"
  30. Blue = "\033[97;44m"
  31. Magenta = "\033[97;45m"
  32. Cyan = "\033[97;46m"
  33. Reset = "\033[0m"
  34. )
  35. type Logger struct {
  36. console_level int
  37. console_Logger *log.Logger
  38. file_level int
  39. file_Logger *log.Logger
  40. file *os.File
  41. error_logger *log.Logger
  42. file_error *os.File
  43. }
  44. func createFileLogger(pathName string, flag int, level int) (*log.Logger, *os.File) {
  45. if pathName == "" {
  46. return nil, nil
  47. }
  48. // 如果文件夹不存在则创建
  49. os.MkdirAll(pathName, 0777)
  50. now := time.Now()
  51. var filename string
  52. // debug 分时间段写日志文件,以免文件过大
  53. if level == debugLevel {
  54. filename = fmt.Sprintf("%d%02d%02d%02d.log",
  55. now.Year(), now.Month(), now.Day(), now.Hour())
  56. } else { // 写一个日志文件
  57. filename = fmt.Sprintf("%d%02d%02d.log",
  58. now.Year(), now.Month(), now.Day())
  59. }
  60. fmt.Printf("createFileLogger pathName=%s fileName=%s level=%d\n", pathName, filename, level)
  61. file, err := os.OpenFile(path.Join(pathName, filename), os.O_APPEND|os.O_CREATE, 0644)
  62. if err != nil {
  63. return nil, nil
  64. }
  65. return log.New(file, "", flag), file
  66. }
  67. func getColor(level int) string {
  68. switch level {
  69. case releaseLevel:
  70. return Cyan
  71. case errorLevel:
  72. return Red
  73. case fatalLevel:
  74. return Magenta
  75. }
  76. return Reset
  77. }
  78. func getLevelByString(strLevel string) int {
  79. var level int
  80. switch strings.ToLower(strLevel) {
  81. case "debug":
  82. level = debugLevel
  83. case "release":
  84. level = releaseLevel
  85. case "error":
  86. level = errorLevel
  87. case "fatal":
  88. level = fatalLevel
  89. default:
  90. return debugLevel
  91. }
  92. return level
  93. }
  94. func New(consoleLevel string, fileLevel string, pathname string, flag int) (*Logger, error) {
  95. flag = log.Lmsgprefix
  96. // level
  97. cLevel := getLevelByString(consoleLevel)
  98. fLevel := getLevelByString(fileLevel)
  99. consoleLogger := log.New(colorable.NewColorableStdout(), "", flag)
  100. fileLogger, file := createFileLogger(pathname, flag, fLevel)
  101. // new
  102. logger := new(Logger)
  103. logger.console_level = cLevel
  104. logger.file_level = fLevel
  105. logger.console_Logger = consoleLogger
  106. logger.file_Logger = fileLogger
  107. logger.file = file
  108. return logger, nil
  109. }
  110. func NewWithError(consoleLevel string, fileLevel string, pathname string, flag int, errorFile string) (*Logger, error) {
  111. flag = log.Lmsgprefix
  112. // level
  113. cLevel := getLevelByString(consoleLevel)
  114. fLevel := getLevelByString(fileLevel)
  115. consoleLogger := log.New(colorable.NewColorableStdout(), "", flag)
  116. fileLogger, file := createFileLogger(pathname, flag, fLevel)
  117. // new
  118. logger := new(Logger)
  119. logger.console_level = cLevel
  120. logger.file_level = fLevel
  121. logger.console_Logger = consoleLogger
  122. logger.file_Logger = fileLogger
  123. logger.file = file
  124. errorLogger, errfile := createFileLogger(errorFile, flag, errorLevel)
  125. logger.error_logger = errorLogger
  126. logger.file_error = errfile
  127. return logger, nil
  128. }
  129. func RecreateFileLog(pathname string, flag int) {
  130. flag = log.Lmsgprefix
  131. logger, file := createFileLogger(pathname, flag, gLogger.file_level)
  132. if gLogger.file != nil {
  133. gLogger.file.Close()
  134. }
  135. gLogger.file_Logger = logger
  136. gLogger.file = file
  137. //gLogger.file_Logger, gLogger.file = createFileLogger(pathname, flag, gLogger.file_level)
  138. }
  139. // It's dangerous to call the method on logging
  140. func (logger *Logger) Close() {
  141. if logger.file != nil {
  142. logger.file.Close()
  143. }
  144. logger.console_Logger = nil
  145. logger.file_Logger = nil
  146. logger.file = nil
  147. }
  148. func getTimeHeaser() string {
  149. t := time.Now()
  150. _, month, day := t.Date()
  151. hour, min, sec := t.Clock()
  152. return fmt.Sprintf("%02d-%02d %02d:%02d:%02d", month, day, hour, min, sec)
  153. }
  154. func (logger *Logger) doPrintf(color string, level int, printLevel string, format string, a ...interface{}) {
  155. if level >= errorLevel && logger.error_logger != nil {
  156. logger.error_logger.Output(3, getTimeHeaser()+fmt.Sprintf(format, a...))
  157. } else {
  158. if (level >= logger.console_level) && (logger.console_Logger != nil) {
  159. f := fmt.Sprintf("%s %s %v %s %v", getTimeHeaser(), color, printLevel, Reset, format)
  160. logger.console_Logger.Output(3, fmt.Sprintf(f, a...))
  161. }
  162. format = getTimeHeaser() + printLevel + format
  163. if (level >= logger.file_level) && (logger.file_Logger != nil) {
  164. logger.file_Logger.Output(3, fmt.Sprintf(format, a...))
  165. }
  166. }
  167. if level == fatalLevel {
  168. os.Exit(1)
  169. }
  170. }
  171. func (logger *Logger) Debug(format string, a ...interface{}) {
  172. logger.doPrintf(getColor(debugLevel), debugLevel, printDebugLevel, format, a...)
  173. }
  174. func (logger *Logger) Release(format string, a ...interface{}) {
  175. logger.doPrintf(getColor(releaseLevel), releaseLevel, printReleaseLevel, format, a...)
  176. }
  177. func (logger *Logger) Error(format string, a ...interface{}) {
  178. logger.doPrintf(getColor(errorLevel), errorLevel, printErrorLevel, format, a...)
  179. }
  180. func (logger *Logger) Fatal(format string, a ...interface{}) {
  181. logger.doPrintf(getColor(fatalLevel), fatalLevel, printFatalLevel, format, a...)
  182. }
  183. func (logger *Logger) Color(color string, format string, a ...interface{}) {
  184. logger.doPrintf(color, debugLevel, printDebugLevel, format, a...)
  185. }
  186. var gLogger, _ = New("debug", "debug", "", log.Lmsgprefix)
  187. // It's dangerous to call the method on logging
  188. func Export(logger *Logger) {
  189. if logger != nil {
  190. gLogger = logger
  191. }
  192. }
  193. func Debug(format string, a ...interface{}) {
  194. gLogger.Debug(format, a...)
  195. }
  196. func Color(color, format string, a ...interface{}) {
  197. gLogger.Color(color, format, a...)
  198. }
  199. func Release(format string, a ...interface{}) {
  200. gLogger.Release(format, a...)
  201. }
  202. func Error(format string, a ...interface{}) {
  203. gLogger.Error(format, a...)
  204. }
  205. func Fatal(format string, a ...interface{}) {
  206. gLogger.Fatal(format, a...)
  207. }
  208. func Close() {
  209. gLogger.Close()
  210. }
  211. func GetDebugLogger() *log.Logger {
  212. return gLogger.console_Logger
  213. }