glog_logger_chaining.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. package glog
  7. import (
  8. "context"
  9. "github.com/gogf/gf/internal/intlog"
  10. "io"
  11. "github.com/gogf/gf/os/gfile"
  12. )
  13. // Ctx is a chaining function,
  14. // which sets the context for current logging.
  15. func (l *Logger) Ctx(ctx context.Context, keys ...interface{}) *Logger {
  16. if ctx == nil {
  17. return l
  18. }
  19. logger := (*Logger)(nil)
  20. if l.parent == nil {
  21. logger = l.Clone()
  22. } else {
  23. logger = l
  24. }
  25. logger.ctx = ctx
  26. if len(keys) > 0 {
  27. logger.SetCtxKeys(keys...)
  28. }
  29. return logger
  30. }
  31. // To is a chaining function,
  32. // which redirects current logging content output to the specified <writer>.
  33. func (l *Logger) To(writer io.Writer) *Logger {
  34. logger := (*Logger)(nil)
  35. if l.parent == nil {
  36. logger = l.Clone()
  37. } else {
  38. logger = l
  39. }
  40. logger.SetWriter(writer)
  41. return logger
  42. }
  43. // Path is a chaining function,
  44. // which sets the directory path to <path> for current logging content output.
  45. //
  46. // Note that the parameter <path> is a directory path, not a file path.
  47. func (l *Logger) Path(path string) *Logger {
  48. logger := (*Logger)(nil)
  49. if l.parent == nil {
  50. logger = l.Clone()
  51. } else {
  52. logger = l
  53. }
  54. if path != "" {
  55. if err := logger.SetPath(path); err != nil {
  56. // panic(err)
  57. intlog.Error(err)
  58. }
  59. }
  60. return logger
  61. }
  62. // Cat is a chaining function,
  63. // which sets the category to <category> for current logging content output.
  64. // Param <category> can be hierarchical, eg: module/user.
  65. func (l *Logger) Cat(category string) *Logger {
  66. logger := (*Logger)(nil)
  67. if l.parent == nil {
  68. logger = l.Clone()
  69. } else {
  70. logger = l
  71. }
  72. if logger.config.Path != "" {
  73. if err := logger.SetPath(gfile.Join(logger.config.Path, category)); err != nil {
  74. // panic(err)
  75. intlog.Error(err)
  76. }
  77. }
  78. return logger
  79. }
  80. // File is a chaining function,
  81. // which sets file name <pattern> for the current logging content output.
  82. func (l *Logger) File(file string) *Logger {
  83. logger := (*Logger)(nil)
  84. if l.parent == nil {
  85. logger = l.Clone()
  86. } else {
  87. logger = l
  88. }
  89. logger.SetFile(file)
  90. return logger
  91. }
  92. // Level is a chaining function,
  93. // which sets logging level for the current logging content output.
  94. func (l *Logger) Level(level int) *Logger {
  95. logger := (*Logger)(nil)
  96. if l.parent == nil {
  97. logger = l.Clone()
  98. } else {
  99. logger = l
  100. }
  101. logger.SetLevel(level)
  102. return logger
  103. }
  104. // LevelStr is a chaining function,
  105. // which sets logging level for the current logging content output using level string.
  106. func (l *Logger) LevelStr(levelStr string) *Logger {
  107. logger := (*Logger)(nil)
  108. if l.parent == nil {
  109. logger = l.Clone()
  110. } else {
  111. logger = l
  112. }
  113. if err := logger.SetLevelStr(levelStr); err != nil {
  114. // panic(err)
  115. intlog.Error(err)
  116. }
  117. return logger
  118. }
  119. // Skip is a chaining function,
  120. // which sets stack skip for the current logging content output.
  121. // It also affects the caller file path checks when line number printing enabled.
  122. func (l *Logger) Skip(skip int) *Logger {
  123. logger := (*Logger)(nil)
  124. if l.parent == nil {
  125. logger = l.Clone()
  126. } else {
  127. logger = l
  128. }
  129. logger.SetStackSkip(skip)
  130. return logger
  131. }
  132. // Stack is a chaining function,
  133. // which sets stack options for the current logging content output .
  134. func (l *Logger) Stack(enabled bool, skip ...int) *Logger {
  135. logger := (*Logger)(nil)
  136. if l.parent == nil {
  137. logger = l.Clone()
  138. } else {
  139. logger = l
  140. }
  141. logger.SetStack(enabled)
  142. if len(skip) > 0 {
  143. logger.SetStackSkip(skip[0])
  144. }
  145. return logger
  146. }
  147. // StackWithFilter is a chaining function,
  148. // which sets stack filter for the current logging content output .
  149. func (l *Logger) StackWithFilter(filter string) *Logger {
  150. logger := (*Logger)(nil)
  151. if l.parent == nil {
  152. logger = l.Clone()
  153. } else {
  154. logger = l
  155. }
  156. logger.SetStack(true)
  157. logger.SetStackFilter(filter)
  158. return logger
  159. }
  160. // Stdout is a chaining function,
  161. // which enables/disables stdout for the current logging content output.
  162. // It's enabled in default.
  163. func (l *Logger) Stdout(enabled ...bool) *Logger {
  164. logger := (*Logger)(nil)
  165. if l.parent == nil {
  166. logger = l.Clone()
  167. } else {
  168. logger = l
  169. }
  170. // stdout printing is enabled if <enabled> is not passed.
  171. if len(enabled) > 0 && !enabled[0] {
  172. logger.config.StdoutPrint = false
  173. } else {
  174. logger.config.StdoutPrint = true
  175. }
  176. return logger
  177. }
  178. // Header is a chaining function,
  179. // which enables/disables log header for the current logging content output.
  180. // It's enabled in default.
  181. func (l *Logger) Header(enabled ...bool) *Logger {
  182. logger := (*Logger)(nil)
  183. if l.parent == nil {
  184. logger = l.Clone()
  185. } else {
  186. logger = l
  187. }
  188. // header is enabled if <enabled> is not passed.
  189. if len(enabled) > 0 && !enabled[0] {
  190. logger.SetHeaderPrint(false)
  191. } else {
  192. logger.SetHeaderPrint(true)
  193. }
  194. return logger
  195. }
  196. // Line is a chaining function,
  197. // which enables/disables printing its caller file path along with its line number.
  198. // The parameter <long> specified whether print the long absolute file path, eg: /a/b/c/d.go:23,
  199. // or else short one: d.go:23.
  200. func (l *Logger) Line(long ...bool) *Logger {
  201. logger := (*Logger)(nil)
  202. if l.parent == nil {
  203. logger = l.Clone()
  204. } else {
  205. logger = l
  206. }
  207. if len(long) > 0 && long[0] {
  208. logger.config.Flags |= F_FILE_LONG
  209. } else {
  210. logger.config.Flags |= F_FILE_SHORT
  211. }
  212. return logger
  213. }
  214. // Async is a chaining function,
  215. // which enables/disables async logging output feature.
  216. func (l *Logger) Async(enabled ...bool) *Logger {
  217. logger := (*Logger)(nil)
  218. if l.parent == nil {
  219. logger = l.Clone()
  220. } else {
  221. logger = l
  222. }
  223. // async feature is enabled if <enabled> is not passed.
  224. if len(enabled) > 0 && !enabled[0] {
  225. logger.SetAsync(false)
  226. } else {
  227. logger.SetAsync(true)
  228. }
  229. return logger
  230. }