百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

爱上开源之log4go, 一款简洁的golang的日志包

lipiwang 2024-10-27 13:32 8 浏览 0 评论


前言


日志服务是应用程序里不可缺少的一个模块, 在golang里也有不少比较优秀的日志服务框架,比如很多项目都是用的Zap,就是比较常用的golang的日志框架,不过深深的java的使用经历,所以在使用其zap起来,总是觉得不是那么的舒服, 所以在自己的项目里都是使用那个自己封装的log4go的日志包, 注意这里并没有从框架的模式上去进行实现, 所以我这里也称之为一个简洁的golang的日志包。



说他简洁,功能并不简单


简洁,核心代码只有10K左右,但是功能并不简单。


配置文件


配置文件log4o.xml, 也支持json格式的配置文件, 通过配置log4go.xml文件即可定义需要使用的日志服务内容。


看起来特别亲切的配置文件


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender enabled="true" name="console">
    <type>console</type>
    <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
    <!-- level is (:?FINEST|FINE|DEBUG|TRACE|INFO|WARNING|ERROR) -->
  </appender>
  <appender enabled="true" name="file">
    <type>file</type>
    <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
    <property name="filename">test.log</property>
    <!--
       %T - Time (15:04:05 MST)
       %t - Time (15:04)
       %D - Date (2006/01/02)
       %d - Date (01/02/06)
       %L - Level (FNST, FINE, DEBG, TRAC, WARN, EROR, CRIT)
       %S - Source
       %M - Message
       It ignores unknown format strings (and removes them)
       Recommended: "[%D %T] [%L] (%S) %M"
    -->
    <property name="rotate">false</property> <!-- true enables log rotation, otherwise append -->
    <property name="maxsize">0M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->
    <property name="maxlines">0K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands -->
    <property name="daily">true</property> <!-- Automatically rotates when a log message is written after midnight -->
  </appender>
  <appender enabled="true" name="testfile">
    <type>file</type>
    <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
    <property name="filename">trace.xml</property>
    <property name="rotate">false</property> <!-- true enables log rotation, otherwise append -->
    <property name="maxsize">100M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->
    <property name="maxlines">6K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands -->
    <property name="daily">false</property> <!-- Automatically rotates when a log message is written after midnight -->
  </appender>
  <appender enabled="true" name="logstash"><!-- enabled=false means this logger won't actually be created -->
    <type>socket</type>
    <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
    <property name="endpoint">192.168.56.1:12124</property> <!-- recommend UDP broadcast -->
    <property name="protocol">tcp</property> <!-- tcp or udp -->
    <property name="retry">-1</property> <!-- 断线重连,设置为负数,反复重连,设置为正数,重连测试后失败 -->
    <property name="interval">30</property> <!-- 失败重连的间隔时间,默认30秒 -->
    <property name="check">false</property> <!-- 启动日志是否检查连接成功,如果检查,不成功会失败 -->
  </appender>
  <!-- 这个就是自定义的一个logger -->
  <!-- 输出级别是info级别及以上的日志,不要怕,StreamOperateFile已经过滤,只输出info级别的日志 -->
  <!-- additivity 这个默认是true,即继承父类 root logger -->
  <!-- 也就是说,你的这个日志也会在root的logger里面输出的,我这里配置false,就是不继承,各走各的。 -->
  <!-- appender-ref 也就是说这个logger的输出目的地是哪里,ref就是关联到上面声明的一个file,一个console -->
  <logger name="Sample">
    <level>info</level>
    <appender-ref ref="file" />
    <appender-ref ref="console" />
  </logger>

  <logger name="Demo">
    <level>info</level>
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </logger>

  <!-- 输出级别是info级别及以上的日志,下面的ref关联的两个appender没有filter设置,所以,info及以上的日志都是会输出到这2个appender的 -->
  <root>
    <level>info</level>
    <appender-ref ref="console" />
    <appender-ref ref="logstash" />
  </root>

</configuration>



配置文件是不是很熟悉,做过java的开发人员对个日志的配置文件就会相当的熟悉了, 这里基本上和java里的log4j和logback的配置项非常的相近了,


appender对应着一种logAppend的实现, 目前log4go里,支持Console,Fille,Channel,TCP,UCP这样几种方式。 其中的TCP,UDP,Channel的Append主要是考虑日志对外Logstach, Kafka, Zipkin的需要的相关扩展。


使用简单


使用非常简单, 在配置文件里,配置好Append,配置好需要日志的级别,日志的TAG, 通过几行代码就可以实现日志的使用


## 引入包

import
(	"github.com/gohutool/log4go"
	"testing"
	"time"
)

# 定义日志对象
var logger = log4go.LoggerManager.GetLogger("com.hello")

#使用日志
log4go.LoggerManager.InitWithXML("./example.xml")
logger.Info("hello")
logger.Info("hello")
time.Sleep(1 * time.Second)
logger.Error("hello")



不同的logger实例对象,可以有各自不同的日志级别, log4go的日志是异步协程进行实现的,所以在使用Log4go进行日志处理时,对主业务的性能并行完成,不影响主业务处理的处理时间。




控制台日志输出



=== RUN   TestLoggerExample
[2022/06/17 11:17:59 CST 299] [INFO][com.hello] (github.com/gohutool/log4go/examples.TestLoggerExample:73) hello
[2022/06/17 11:17:59 CST 299] [INFO][com.hello] (github.com/gohutool/log4go/examples.TestLoggerExample:72) hello
[2022/06/17 11:18:00 CST 299] [EROR][com.hello] (github.com/gohutool/log4go/examples.TestLoggerExample:75) hello
--- PASS: TestLoggerExample (4.00s)
PASS

Debugger finished with the exit code 0



UDP日志支持



UDP相关配置


<appender enabled="true" name="logstash"><!-- enabled=false means this logger won't actually be created -->
  <type>socket</type>
  <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
  <property name="endpoint">192.168.56.1:12124</property> <!-- recommend UDP broadcast -->
  <property name="protocol">udp</property> <!-- tcp or udp -->
</appender>



TCP日志支持



TCP相关配置


<appender enabled="true" name="logstash"><!-- enabled=false means this logger won't actually be created -->
  <type>socket</type>
  <pattern>[%D %T %m] [%L][%l] (%S) %M</pattern>
  <property name="endpoint">192.168.56.1:12124</property> <!-- recommend UDP broadcast -->
  <property name="protocol">tcp</property> <!-- tcp or udp -->
  <property name="retry">-1</property> <!-- 断线重连,设置为负数,反复重连,设置为正数,重连测试后失败 -->
  <property name="interval">30</property> <!-- 失败重连的间隔时间,默认30秒 -->
  <property name="check">false</property> <!-- 启动日志是否检查连接成功,如果检查,不成功会失败 -->
</appender>



结语


如标题所说, Log4go的实现并不是以框架的方式实现,所以功能上更多的偏向于如何去处理各种日志需要的实现上,同时基于微服务里的日志集中处理的实际场景,实现了channel,TCP,UDP方式的日志处理模式, 是一个专门的日志包工具。 可以在github里搜索gohutool/log4go,

相关推荐

《每日电讯报》研发数字工具,教你更有效率地报道新闻

为鼓励新闻编辑部持续创新,《每日电讯报》正在尝试有战略地研发数字工具。网站的数字媒体主任马尔科姆o科尔斯(MalcolmColes)表示,《每日电讯报》正试图去“创建一些可持续资产”,以便于让记者们...

html5学得好不好,看掌握多少标签

html5你了解了多少?如果你还是入门阶段的话,或者还是一知半解的话,那么我们专门为你们收集的html5常用的标签大全对你就很有帮助了,你需要了解了html5有哪些标签你才能够更好的。驾驭html5...

前端分享-少年了解过iframe么(我想了解少年)

iframe就像是HTML的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:独立上下文:每个iframe都拥有独立的DOM/CSS/JS环境(类似浏...

做SEO要知道什么是AJAX(人能看到但搜索引擎看不到的内容)

一个明显的,人能看到但搜索引擎不能看到的内容是AJAX。那么什么是AJAX呢?其实,了解过的基本上也都清楚,AJAX不是新的编程语言,而是一种使用现有标准的新方法。AJAX最大的优点是在不重新加...

介绍最前沿的人工智能创新,‘无反向传播’神经网络训练方法?

图像由GoogleImageFX生成前言:本文整理自NoProp原始论文与实践代码,并结合多个公开实现细节进行了全流程复现。对神经网络训练机制的探索仍在不断演进,如果你也在研究反向传播之...

说说我们对HTML6的期许(对html的看法)

HTML5概述HTML5是HTML语言最受欢迎的版本之一,它支持音频和视频、离线存储、移动端、和标签属性等等。还提供了article,section,header这样的标签来帮助开发者更好...

浏览器中在线预览pdf文件,pdf.mjs插件实现web预览pdf

背景:本来只是淘宝上卖卖袜子,想着扩展一下业务,准备做同名“来家居”海外袜子馆外贸项目,碰到pdf在线预览的需求,就找了pdf.js插件进行实践后把此方法记录下来,可以通过多种方法来实现,每种方法都有...

SVG 在前端的7种使用方法,你还知道哪几种?

本文简介点赞+关注+收藏=学会了技术一直在演变,在网页中使用SVG的方法也层出不穷。每个时期都有对应的最优解。所以我打算把我知道的7种SVG的使用方法列举出来,有备无患~如果你还...

HTML5常用标签大全(html5em标签)

HTML前端开发最终取决于掌握标签的多少HTML大概有七八百个标签楼主这里给大家总结了下HTML常用标签标签描述<!--...-->定义注释。<!DOCTYPE>定义文档类型...

&quot;伪君子Snoop Dogg!&quot;... WHAT?| MetroDaily 24/7

TUE.01-新作品-虽说年纪大了会有点糊涂,但是最近SnoopDogg的这波操作实在是让粉丝们有点迷,甚至有人表示没想到他是这样的"伪君子"......而这一切都源于他近日在IG上Po出的一...

史努比snoopy卡通手机壁纸屏保(史努比壁纸无水印)

...

莎夏·班克斯盼望表哥Snoop Dogg为其作出场曲

NXT女子冠军莎夏·班克斯(SashaBanks)近日接受了迈阿密先驱报采访,访谈纪要如下:关于她出众的形象:“我一向喜欢与众不同。为了能让人眼前一亮,我的装束总是非常前卫、非常抢眼,这样才能让观众...

喜欢Snoop!全球第一间「史努比博物馆」海外分馆在东京!

1950年起,由美國漫畫家CharlesM.Schulz創作的作品《Snoopy》史努比,其鮮明的可愛角色與幽默的劇情內容,至今仍成為許多大朋友與小朋友心中的最愛。為了紀念作者所設立的全球首...

Vetements 推出 Snoop Dogg 肖像「天价」T-Shirt

Vetements的CEOGuramGvasalia早前才透露品牌经营策略的秘密–Vetements如何成为人人热议的话题品牌。但似乎他仍有更多需要解释的东西–这个法国奢侈品牌最新...

狗爷Snoop Dogg的《I Wanna Thank Me》巡回演唱会旧金山站

西海岸匪帮说唱歌手SnoopDogg在《IWannaThankMe》巡回演唱会旧金山站表演(图片来自ICphoto)西海岸匪帮说唱歌手SnoopDogg(图片来自ICphoto)西海...

取消回复欢迎 发表评论: