gomobile: Hook logrus日志输出至android logcat

实际开发过程中,很多项目使用的日志输出是logrus,为了保持统一,同时又能把日志输出到Android Logcat,同时还带上Android的日志级别。

默认的log.Println,也能输出,但默认的Tag是GoLog,日志级别是info,显然不能满足要求。

定义文件: log_android.go

  1. package g
  2. /*
  3. #cgo LDFLAGS: -landroid -llog
  4. #include <android/log.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. */
  8. import "C"
  9. import (
  10. "unsafe"
  11. "github.com/Sirupsen/logrus"
  12. )
  13. var levels = []logrus.Level{
  14. logrus.PanicLevel,
  15. logrus.FatalLevel,
  16. logrus.ErrorLevel,
  17. logrus.WarnLevel,
  18. logrus.InfoLevel,
  19. logrus.DebugLevel,
  20. }
  21. type androidHook struct {
  22. tag *C.char
  23. fmt logrus.Formatter
  24. }
  25. type androidFormatter struct{}
  26. func (f *androidFormatter) Format(entry *logrus.Entry) ([]byte, error) {
  27. return []byte(entry.Message), nil
  28. }
  29. func (hook *androidHook) Levels() []logrus.Level {
  30. return levels
  31. }
  32. func (hook *androidHook) Fire(e *logrus.Entry) error {
  33. var priority C.int
  34. formatted, err := hook.fmt.Format(e)
  35. if err != nil {
  36. return err
  37. }
  38. str := C.CString(string(formatted))
  39. switch e.Level {
  40. case logrus.PanicLevel:
  41. priority = C.ANDROID_LOG_FATAL
  42. case logrus.FatalLevel:
  43. priority = C.ANDROID_LOG_FATAL
  44. case logrus.ErrorLevel:
  45. priority = C.ANDROID_LOG_ERROR
  46. case logrus.WarnLevel:
  47. priority = C.ANDROID_LOG_WARN
  48. case logrus.InfoLevel:
  49. priority = C.ANDROID_LOG_INFO
  50. case logrus.DebugLevel:
  51. priority = C.ANDROID_LOG_DEBUG
  52. }
  53. C.__android_log_write(priority, hook.tag, str)
  54. C.free(unsafe.Pointer(str))
  55. return nil
  56. }
  57. // create a logrus Hook that forward entries to logcat
  58. func AndroidLogHook(tag string) logrus.Hook {
  59. return &androidHook{
  60. tag: C.CString(tag),
  61. fmt: &androidFormatter{},
  62. }
  63. }

使用方法:

  1. logrus.AddHook(g.AndroidLogHook())

然后就可以开心地使用logrus.Debugf等接口了,很方便,不是吗。

参考链接:

ft_authoradmin  ft_create_time2019-03-30 17:28
 ft_update_time2019-03-30 17:29