log.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package log
  2. /*
  3. log module is used to write log info to log file
  4. open a log file when log was created, and close it when log was destroyed
  5. */
  6. import (
  7. "fmt"
  8. go_log "log"
  9. "os"
  10. "time"
  11. )
  12. type Log struct {
  13. Level int
  14. //File of log
  15. File *os.File
  16. path string
  17. }
  18. const (
  19. LOG_LEVEL_DEBUG = 0
  20. LOG_LEVEL_INFO = 1
  21. LOG_LEVEL_WARN = 2
  22. LOG_LEVEL_ERROR = 3
  23. )
  24. func (l *Log) Debug(format string, stdout bool, v ...interface{}) {
  25. if l.Level <= LOG_LEVEL_DEBUG {
  26. l.writeLog("DEBUG", format, stdout, v...)
  27. }
  28. }
  29. func (l *Log) Info(format string, stdout bool, v ...interface{}) {
  30. if l.Level <= LOG_LEVEL_INFO {
  31. l.writeLog("INFO", format, stdout, v...)
  32. }
  33. }
  34. func (l *Log) Warn(format string, stdout bool, v ...interface{}) {
  35. if l.Level <= LOG_LEVEL_WARN {
  36. l.writeLog("WARN", format, stdout, v...)
  37. }
  38. }
  39. func (l *Log) Error(format string, stdout bool, v ...interface{}) {
  40. if l.Level <= LOG_LEVEL_ERROR {
  41. l.writeLog("ERROR", format, stdout, v...)
  42. }
  43. }
  44. func (l *Log) Panic(format string, stdout bool, v ...interface{}) {
  45. l.writeLog("PANIC", format, stdout, v...)
  46. panic("")
  47. }
  48. func (l *Log) writeLog(level string, format string, stdout bool, v ...interface{}) {
  49. //if the next day is coming, reopen file
  50. if time.Now().Format("/2006-01-02.log") != l.File.Name() {
  51. l.File.Close()
  52. l.OpenFile()
  53. }
  54. //test if file is closed
  55. if l.File == nil {
  56. //open file
  57. err := l.OpenFile()
  58. if err != nil {
  59. panic(err)
  60. }
  61. }
  62. //write log
  63. format = fmt.Sprintf("["+level+"]"+format, v...)
  64. if show_log && stdout {
  65. logger.Output(4, format)
  66. }
  67. _, err := l.File.Write([]byte(format + "\n"))
  68. if err != nil {
  69. //reopen file
  70. l.File.Close()
  71. l.OpenFile()
  72. }
  73. }
  74. func (l *Log) SetLogLevel(level int) {
  75. l.Level = level
  76. }
  77. func (l *Log) OpenFile() error {
  78. //test if file is closed
  79. if l.File == nil {
  80. //open file
  81. file, err := os.OpenFile(l.path+time.Now().Format("/2006-01-02.log"), os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
  82. if err != nil {
  83. return err
  84. }
  85. l.File = file
  86. }
  87. //test if file is writable
  88. _, err := l.File.Write([]byte(" "))
  89. if err != nil {
  90. //reopen file
  91. l.File.Close()
  92. file, err := os.OpenFile(l.path+time.Now().Format("/2006-01-02.log"), os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
  93. if err != nil {
  94. return err
  95. }
  96. l.File = file
  97. }
  98. return nil
  99. }
  100. func NewLog(path string) (*Log, error) {
  101. if path == "" {
  102. path = "log"
  103. }
  104. //test if path is exist
  105. _, err := os.Stat(path)
  106. if err != nil {
  107. //create path
  108. err = os.MkdirAll(path, 0777)
  109. if err != nil {
  110. return nil, err
  111. }
  112. }
  113. // test if path is a directory
  114. fileInfo, err := os.Stat(path)
  115. if err != nil {
  116. return nil, err
  117. }
  118. if !fileInfo.IsDir() {
  119. return nil, fmt.Errorf("log file path %s is not a directory", path)
  120. }
  121. log := &Log{
  122. Level: LOG_LEVEL_DEBUG,
  123. path: path,
  124. }
  125. //open file
  126. err = log.OpenFile()
  127. if err != nil {
  128. return nil, err
  129. }
  130. return log, nil
  131. }
  132. func init() {
  133. // why logger will cause panic when call
  134. initlog()
  135. }
  136. func initlog() {
  137. var err error
  138. main_log, err = NewLog("./logs")
  139. if err != nil {
  140. panic(err)
  141. }
  142. }
  143. var main_log *Log // wapper of go_log
  144. var show_log bool = true
  145. var logger = go_log.New(os.Stdout, "", go_log.Ldate|go_log.Ltime|go_log.Lshortfile)
  146. func SetShowLog(show bool) {
  147. show_log = show
  148. }
  149. func SetLogLevel(level int) {
  150. if main_log == nil {
  151. initlog()
  152. }
  153. main_log.SetLogLevel(level)
  154. }
  155. func Debug(format string, v ...interface{}) {
  156. if main_log == nil {
  157. initlog()
  158. }
  159. main_log.Debug(format, true, v...)
  160. }
  161. func Info(format string, v ...interface{}) {
  162. if main_log == nil {
  163. initlog()
  164. }
  165. main_log.Info(format, true, v...)
  166. }
  167. func Warn(format string, v ...interface{}) {
  168. if main_log == nil {
  169. initlog()
  170. }
  171. main_log.Warn(format, true, v...)
  172. }
  173. func Error(format string, v ...interface{}) {
  174. if main_log == nil {
  175. initlog()
  176. }
  177. main_log.Error(format, true, v...)
  178. }
  179. func Panic(format string, v ...interface{}) {
  180. if main_log == nil {
  181. initlog()
  182. }
  183. main_log.Panic(format, true, v...)
  184. }
  185. func SlientDebug(format string, v ...interface{}) {
  186. if main_log == nil {
  187. initlog()
  188. }
  189. main_log.Debug(format, false, v...)
  190. }
  191. func SlientInfo(format string, v ...interface{}) {
  192. if main_log == nil {
  193. initlog()
  194. }
  195. main_log.Info(format, false, v...)
  196. }
  197. func SlientWarn(format string, v ...interface{}) {
  198. if main_log == nil {
  199. initlog()
  200. }
  201. main_log.Warn(format, false, v...)
  202. }
  203. func SlientError(format string, v ...interface{}) {
  204. if main_log == nil {
  205. initlog()
  206. }
  207. main_log.Error(format, false, v...)
  208. }
  209. func SlientPanic(format string, v ...interface{}) {
  210. if main_log == nil {
  211. initlog()
  212. }
  213. main_log.Panic(format, false, v...)
  214. }