log4go日志配置使用

二、配置文件log4go.xml

 
  1. <!--

  2. ~ Copyright (c) 2017 - 3. by ZanderWong. All rights reserved.

  3. ~ Lorem ipsum dolor sit amet, consectetur adipiscing elit.

  4. -->

  5.  
  6. <logging>

  7. <filter enabled="true">

  8. <tag>stdout</tag>

  9. <type>console</type>

  10. <!-- level is (:?FINEST|FINE|DEBUG|TRACE|INFO|WARNING|ERROR) -->

  11. <level>INFO</level>

  12. </filter>

  13. <filter enabled="true">

  14. <tag>file</tag>

  15. <type>file</type>

  16. <level>DEBUG</level>

  17. <property name="filename">test_client.log</property>

  18. <!--

  19. %T - Time (15:04:05 MST)

  20. %t - Time (15:04)

  21. %D - Date (2006/01/02)

  22. %d - Date (01/02/06)

  23. %L - Level (FNST, FINE, DEBG, TRAC, WARN, EROR, CRIT)

  24. %S - Source

  25. %M - Message

  26. It ignores unknown format strings (and removes them)

  27. Recommended: "[%D %T] [%L] (%S) %M"

  28. -->

  29. <property name="format">[%D %T] [%L] (%S) %M</property>

  30. <property name="rotate">true</property> <!-- true enables log rotation, otherwise append -->

  31. <property name="maxsize">10M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->

  32. <property name="maxlines">0K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands -->

  33. <property name="daily">false

  34. </property> <!-- Automatically rotates when a log message is written after midnight -->

  35. </filter>

  36. <filter enabled="false">

  37. <tag>xmllog</tag>

  38. <type>xml</type>

  39. <level>TRACE</level>

  40. <property name="filename">trace.xml</property>

  41. <property name="rotate">true</property> <!-- true enables log rotation, otherwise append -->

  42. <property name="maxsize">100M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->

  43. <property name="maxrecords">6K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands -->

  44. <property name="daily">false

  45. </property> <!-- Automatically rotates when a log message is written after midnight -->

  46. </filter>

  47. <filter enabled="false"><!-- enabled=false means this logger won't actually be created -->

  48. <tag>donotopen</tag>

  49. <type>socket</type>

  50. <level>FINEST</level>

  51. <property name="endpoint">192.168.1.255:12124</property> <!-- recommend UDP broadcast -->

  52. <property name="protocol">udp</property> <!-- tcp or udp -->

  53. </filter>

  54. </logging>

三、使用

log4go.LoadConfiguration("log4go.xml")

这样将会在go项目的当前文件夹里生成一个test_client.log的日志文件。项目中通过log4go.Info(""),log4go.Error("")等写入日志

四、拓展

参考第二步配置文件的红色部分,若改为

 

<property name="filename">log/test_client.log</property>

再运行就会报错

 
  1. FileLogWriter("log/test_client.log"): open log/test_client.log: The system cannot find the path specified.

  2. panic: runtime error: invalid memory address or nil pointer dereference [recovered]

  3. panic: runtime error: invalid memory address or nil pointer dereference

因为找不到目录log。为此对log4go的filelog.go的NewFileLogWriter(fname string,rotate bool)方法进行了修改。

 
  1. func NewFileLogWriter(fname string, rotate bool) *FileLogWriter {

  2. var end, endL, endR int

  3. endL = strings.LastIndex(fname, "/")

  4. endR = strings.LastIndex(fname, "\\")

  5. if endL > endR {

  6. end = endL

  7. } else {

  8. end = endR

  9. }

  10. if end != -1 {

  11. folder := fname[0:end]

  12. res, err := PathExists(folder)

  13. if err != nil {

  14. fmt.Println("err:", err)

  15. }

  16. if !res {

  17. err := os.MkdirAll(folder, 0777)

  18. if err != nil {

  19. fmt.Println("err:", err)

  20. } else {

  21. fmt.Println("create directory success!")

  22. }

  23. }

  24. }

  25. w := &FileLogWriter{

  26. rec: make(chan *LogRecord, LogBufferLength),

  27. rot: make(chan bool),

  28. filename: fname,

  29. format: "[%D %T] [%L] (%S) %M",

  30. rotate: rotate,

  31. maxbackup: 999,

  32. }

  33. // open the file for the first time

  34. if err := w.intRotate(); err != nil {

  35. fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err)

  36. return nil

  37. }

  38. go func() {

  39. defer func() {

  40. if w.file != nil {

  41. fmt.Fprint(w.file, FormatLogRecord(w.trailer, &LogRecord{Created: time.Now()}))

  42. w.file.Close()

  43. }

  44. }()

  45. for {

  46. select {

  47. case <-w.rot:

  48. if err := w.intRotate(); err != nil {

  49. fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err)

  50. return

  51. }

  52. case rec, ok := <-w.rec:

  53. if !ok {

  54. return

  55. }

  56. now := time.Now()

  57. if (w.maxlines > 0 && w.maxlines_curlines >= w.maxlines) ||

  58. (w.maxsize > 0 && w.maxsize_cursize >= w.maxsize) ||

  59. (w.daily && now.Day() != w.daily_opendate) {

  60. if err := w.intRotate(); err != nil {

  61. fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err)

  62. return

  63. }

  64. }

  65. // Perform the write

  66. n, err := fmt.Fprint(w.file, FormatLogRecord(w.format, rec))

  67. if err != nil {

  68. fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err)

  69. return

  70. }

  71. // Update the counts

  72. w.maxlines_curlines++

  73. w.maxsize_cursize += n

  74. }

  75. }

  76. }()

  77. return w

  78. }

  79. //determine if a file or folder exists

  80. //if bool is true,the file or folder exists

  81. func PathExists(path string) (bool, error) {

  82. _, err := os.Stat(path)

  83. if err == nil {

  84. return true, nil

  85. }

  86. if os.IsNotExist(err) {

  87. return false, nil

  88. }

  89. return false, err

  90. }

再次运行,就会在go项目的当前文件夹里生成log/test_client.log。 --------------------- 本文来自 会飞的蜗牛_ 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yuyinghua0302/article/details/79640716?utm_source=copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值