loghelper.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. package util
  2. import (
  3. "bytes"
  4. "log"
  5. "os"
  6. "runtime"
  7. "strconv"
  8. "sync"
  9. "time"
  10. )
  11. const (
  12. Trace = iota
  13. Debug
  14. Info
  15. Warning
  16. Error
  17. Fatal
  18. )
  19. const Max_File_Bites = 1024 * 1024 * 500 //500M
  20. var logger *log.Logger
  21. var uniLogger *log.Logger
  22. //var (
  23. // logMu sync.Mutex
  24. // path string = "./log"
  25. // prefix string
  26. // fileName string
  27. // uniLogFileName string
  28. // level int
  29. // fileLogging *os.File
  30. // fileIndex int
  31. // logMaxSize int64
  32. //)
  33. type LogStInfo struct {
  34. logMu sync.Mutex
  35. path string
  36. prefix string
  37. fileName string
  38. level int
  39. fileLogging *os.File
  40. fileIndex int
  41. logMaxSize int64
  42. }
  43. var commonLogInfo *LogStInfo
  44. var uniLogInfo *LogStInfo
  45. func logFileName(index int, info *LogStInfo) string {
  46. //format格式説明https://segmentfault.com/q/1010000010976398/a-1020000010982052
  47. if index == 0 {
  48. loc := GetLoc()
  49. strbuf := bytes.NewBufferString(info.path)
  50. strbuf.WriteString("/")
  51. strbuf.WriteString(info.prefix)
  52. strbuf.WriteString(time.Now().In(loc).Format("2006010215"))
  53. strbuf.WriteString(".log")
  54. return strbuf.String()
  55. //return fmt.Sprintf("%v/%v%v.log", path, prefix, time.Now().Format("2006010215"))
  56. } else {
  57. loc := GetLoc()
  58. strbuf := bytes.NewBufferString(info.path)
  59. strbuf.WriteString("/")
  60. strbuf.WriteString(info.prefix)
  61. strbuf.WriteString(time.Now().In(loc).Format("2006010215"))
  62. strbuf.WriteString("_")
  63. strbuf.WriteString(strconv.Itoa(index))
  64. strbuf.WriteString(".log")
  65. return strbuf.String()
  66. //return fmt.Sprintf("%v/%v%v_%v.log", path, prefix, time.Now().Format("2006010215"),index)
  67. }
  68. }
  69. func pathExist(path string) (bool, error) {
  70. _, err := os.Stat(path)
  71. ret := err == nil
  72. if err != nil && os.IsNotExist(err) {
  73. err = nil
  74. }
  75. return ret, nil
  76. }
  77. func InitLog(logLevel, maxSize int, pathStr, prefixStr string, uniPathStr string) error {
  78. if pathStr != "" {
  79. if ret, err := pathExist(pathStr); !ret {
  80. if err != nil {
  81. return err
  82. }
  83. err := os.MkdirAll(pathStr, os.ModePerm)
  84. if err != nil {
  85. return err
  86. }
  87. }
  88. }
  89. if uniPathStr != "" {
  90. if ret, err := pathExist(uniPathStr); !ret {
  91. if err != nil {
  92. return err
  93. }
  94. err := os.MkdirAll(uniPathStr, os.ModePerm)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. }
  100. commonLogInfo = &LogStInfo{}
  101. commonLogInfo.path = pathStr
  102. commonLogInfo.prefix = prefixStr
  103. commonLogInfo.level = logLevel
  104. commonLogInfo.fileName = logFileName(0, commonLogInfo)
  105. commonLogInfo.fileIndex = 0
  106. commonLogInfo.logMaxSize = int64(maxSize) * 1024 * 1024
  107. if commonLogInfo.logMaxSize <= 0 {
  108. commonLogInfo.logMaxSize = Max_File_Bites
  109. }
  110. uniLogInfo = &LogStInfo{}
  111. uniLogInfo.path = uniPathStr
  112. uniLogInfo.prefix = "gamestatistic_" + prefixStr
  113. uniLogInfo.fileName = logFileName(0, uniLogInfo)
  114. uniLogInfo.fileIndex = 0
  115. uniLogInfo.logMaxSize = int64(maxSize) * 1024 * 1024
  116. if uniLogInfo.logMaxSize <= 0 {
  117. uniLogInfo.logMaxSize = Max_File_Bites
  118. }
  119. //path = pathStr
  120. //prefix = prefixStr
  121. //level = logLevel
  122. //fileName = logFileName(0)
  123. //fileIndex = 0
  124. //logMaxSize = int64(maxSize) * 1024 * 1024
  125. //if logMaxSize <= 0 {
  126. // logMaxSize = Max_File_Bites
  127. //}
  128. newLogger()
  129. if uniPathStr != "" {
  130. newUniLogger()
  131. }
  132. return nil
  133. }
  134. func newLogger() {
  135. var err error = nil
  136. commonLogInfo.fileLogging, err = os.OpenFile(commonLogInfo.fileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
  137. //fileLogging, err = os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0660)
  138. if err != nil {
  139. panic(err)
  140. }
  141. logger = log.New(commonLogInfo.fileLogging, "", log.LstdFlags)
  142. }
  143. func newUniLogger() {
  144. var err error = nil
  145. uniLogInfo.fileLogging, err = os.OpenFile(uniLogInfo.fileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
  146. //fileLogging, err = os.OpenFile(uniLogFileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0660)
  147. if err != nil {
  148. panic(err)
  149. }
  150. uniLogger = log.New(uniLogInfo.fileLogging, "", log.LUTC)
  151. }
  152. func DebugF(fmt string, v ...interface{}) {
  153. writeLog(commonLogInfo, Debug, fmt, v...)
  154. }
  155. func InfoF(fmt string, v ...interface{}) {
  156. writeLog(commonLogInfo, Info, fmt, v...)
  157. }
  158. func WarnF(fmt string, v ...interface{}) {
  159. writeLog(commonLogInfo, Warning, fmt, v...)
  160. }
  161. func ErrorF(fmt string, v ...interface{}) {
  162. writeLog(commonLogInfo, Error, fmt, v...)
  163. }
  164. func FatalF(fmt string, v ...interface{}) {
  165. writeLog(commonLogInfo, Fatal, fmt, v...)
  166. }
  167. func PanicF(fmt string, v ...interface{}) {
  168. writeLog(commonLogInfo, Fatal, fmt, v...)
  169. panic(v)
  170. }
  171. func SpecialF(fmt string, v ...interface{}) {
  172. specialWriteLog(uniLogInfo, Info, fmt, v...)
  173. }
  174. func writeLog(info *LogStInfo, logLevel int, logFmt string, v ...interface{}) {
  175. if logLevel < info.level {
  176. return
  177. }
  178. info.logMu.Lock()
  179. newFileName := logFileName(0, info)
  180. if info.fileName != newFileName {
  181. if info.fileLogging != nil {
  182. info.fileLogging.Close()
  183. }
  184. info.fileName = newFileName
  185. info.fileIndex = 0
  186. newLogger()
  187. } else {
  188. for {
  189. fi, err := info.fileLogging.Stat()
  190. if err == nil {
  191. if fi.Size() >= info.logMaxSize {
  192. info.fileIndex++
  193. info.fileLogging.Close()
  194. info.fileName = logFileName(info.fileIndex, info)
  195. newLogger()
  196. } else {
  197. break
  198. }
  199. } else {
  200. break
  201. }
  202. }
  203. }
  204. //info.logMu.Unlock()
  205. switch logLevel {
  206. case Trace:
  207. logger.SetPrefix("[TRACE] ")
  208. case Debug:
  209. logger.SetPrefix("[DEBUG] ")
  210. case Info:
  211. logger.SetPrefix("[INFO] ")
  212. case Warning:
  213. logger.SetPrefix("[WARN] ")
  214. case Error:
  215. logger.SetPrefix("[ERROR] ")
  216. case Fatal:
  217. logger.SetPrefix("[FATAL] ")
  218. }
  219. info.logMu.Unlock()
  220. _, file, line, ok := runtime.Caller(2)
  221. if !ok {
  222. file = "???"
  223. line = 0
  224. }
  225. //logMu.Lock()
  226. strbuf := bytes.NewBufferString(file)
  227. strbuf.WriteString(":")
  228. strbuf.WriteString(strconv.Itoa(line))
  229. strbuf.WriteString(" ")
  230. strbuf.WriteString(logFmt)
  231. logFmt = strbuf.String()
  232. //logFmt = fmt.Sprintf("%v:%v %v",file, line, logFmt)
  233. //logMu.Unlock()
  234. logger.Printf(logFmt, v...)
  235. //for console
  236. //log.SetPrefix(logger.Prefix())
  237. log.Printf(logFmt, v...)
  238. }
  239. func specialWriteLog(info *LogStInfo, logLevel int, logFmt string, v ...interface{}) {
  240. if info.path == "" {
  241. return
  242. }
  243. info.logMu.Lock()
  244. newFileName := logFileName(0, info)
  245. if info.fileName != newFileName {
  246. if info.fileLogging != nil {
  247. info.fileLogging.Close()
  248. }
  249. info.fileName = newFileName
  250. info.fileIndex = 0
  251. newUniLogger()
  252. } else {
  253. for {
  254. fi, err := info.fileLogging.Stat()
  255. if err == nil {
  256. if fi.Size() >= info.logMaxSize {
  257. info.fileIndex++
  258. info.fileLogging.Close()
  259. info.fileName = logFileName(info.fileIndex, info)
  260. newUniLogger()
  261. } else {
  262. break
  263. }
  264. } else {
  265. break
  266. }
  267. }
  268. }
  269. info.logMu.Unlock()
  270. uniLogger.SetPrefix("")
  271. uniLogger.Printf(logFmt, v...)
  272. log.Printf(logFmt, v...)
  273. }