教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang 库 - 日志库 logrus

Golang 库 - 日志库 logrus

发布时间:2022-02-23   编辑:jiaochengji.com
教程集为您提供Golang 库 - 日志库 logrus等资源,欢迎您收藏本站,我们将为您提供最新的Golang 库 - 日志库 logrus资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

<h3>文章目录</h3> <ul><li><ul><li>前言</li><li>1 它是什么</li><li>2 为什么是它</li><li><ul><li>golang 日志库</li><li>logrus特性</li></ul></li><li>3 logrus 的使用</li><li><ul><li>3.1 Basic Example</li><li>3.2 基础设置</li><li><ul><li>设置日志格式</li><li>设置日志级别</li><li>设置日志输出</li></ul></li><li>3.3 Fields用法</li><li><ul><li>为什么会有 log.WithFields().Fatal() 这种多次调用的写法?</li></ul></li><li>3.4 Hook 用法</li></ul></li><li>4 小结</li><li>END</li></ul></li></ul>

<h2>前言</h2> <blockquote>

我正在学习酷酷的 Golang,可点此查看帖子Golang学习笔记汇总。

</blockquote> <h2>1 它是什么</h2>

logrus,结构化的日志处理器。

名字来源于吉祥物海象,walrus。介绍中的各种示例都是以海象来展现。

<h2>
2 为什么是它</h2> <h3>golang 日志库</h3>

golang 标准库的日志框架非常简单,仅仅提供了print, panic 和 fatal三个函数。对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持. 所以催生了很多第三方的日志库,但是在golang的世界里,没有一个日志库像slf4j那样在Java中具有绝对统治地位.golang中,流行的日志框架包括logrus、zap、zerolog、seelog等.

logrus 是目前 Github 上 star 数量最多的日志库,目前(2018.12,下同)star数量为8119,fork数为1031. logrus功能强大,性能高效,而且具有高度灵活性,提供了自定义插件的功能.很多开源项目,如docker,prometheus,dejavuzhou/ginbro等,都是用了logrus来记录其日志.

<h3>
logrus特性</h3>

官方自己宣传的最大亮点是 结构化。

<ul><li>

完全兼容golang标准库日志模块:logrus拥有六种日志级别:debug、info、warn、error、fatal和panic,这是golang标准库日志模块的API的超集.如果您的项目使用标准库日志模块,完全可以以最低的代价迁移到logrus上.

<pre><code class="lang-golang hljs">logrus.Debug("Useful debugging information.") logrus.Info("Something noteworthy happened!") logrus.Warn("You should probably take a look at this.") logrus.Error("Something failed but I'm not quitting.") logrus.Fatal("Bye.") //log之后会调用os.Exit(1) logrus.Panic("I'm bailing.") //log之后会panic() </code></pre> </li><li>

可扩展的Hook机制:允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等.

</li><li>

可选的日志输出格式:logrus内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口Formatter,来定义自己的日志格式.

</li><li>

Field机制:logrus鼓励通过 Field 机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志.

</li></ul><h2>
3 logrus 的使用</h2> <h3>3.1 Basic Example</h3>

一开始先玩个官方给出的基础示例。

这个 example 讲了一个去海边看海象的故事。

<pre><code class="lang-go hljs"><span class="token keyword">var</span> log <span class="token operator">=</span> logrus<span class="token punctuation">.</span><span class="token function">New</span><span class="token punctuation">(</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span>Formatter <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>JSONFormatter<span class="token punctuation">)</span> log<span class="token punctuation">.</span>Formatter <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>TextFormatter<span class="token punctuation">)</span> <span class="token comment">//default</span> log<span class="token punctuation">.</span>Formatter<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>logrus<span class="token punctuation">.</span>TextFormatter<span class="token punctuation">)</span><span class="token punctuation">.</span>DisableColors <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token comment">// remove colors</span> log<span class="token punctuation">.</span>Formatter<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>logrus<span class="token punctuation">.</span>TextFormatter<span class="token punctuation">)</span><span class="token punctuation">.</span>DisableTimestamp <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token comment">// remove timestamp from test output</span> log<span class="token punctuation">.</span>Level <span class="token operator">=</span> logrus<span class="token punctuation">.</span>TraceLevel log<span class="token punctuation">.</span>Out <span class="token operator">=</span> os<span class="token punctuation">.</span>Stdout <span class="token comment">// file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666)</span> <span class="token comment">// if err == nil {</span> <span class="token comment">// log.Out = file</span> <span class="token comment">// } else {</span> <span class="token comment">// log.Info("Failed to log to file, using default stderr")</span> <span class="token comment">// }</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> err <span class="token operator">:=</span> <span class="token function">recover</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> entry <span class="token operator">:=</span> err<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>logrus<span class="token punctuation">.</span>Entry<span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"omg"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"err_animal"</span><span class="token punctuation">:</span> entry<span class="token punctuation">.</span>Data<span class="token punctuation">[</span><span class="token string">"animal"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"err_size"</span><span class="token punctuation">:</span> entry<span class="token punctuation">.</span>Data<span class="token punctuation">[</span><span class="token string">"size"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"err_level"</span><span class="token punctuation">:</span> entry<span class="token punctuation">.</span>Level<span class="token punctuation">,</span> <span class="token string">"err_message"</span><span class="token punctuation">:</span> entry<span class="token punctuation">.</span>Message<span class="token punctuation">,</span> <span class="token string">"number"</span><span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">"The ice breaks!"</span><span class="token punctuation">)</span> <span class="token comment">// or use Fatal() to force the process to exit with a nonzero code</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"animal"</span><span class="token punctuation">:</span> <span class="token string">"walrus"</span><span class="token punctuation">,</span> <span class="token string">"number"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Trace</span><span class="token punctuation">(</span><span class="token string">"Went to the beach"</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"animal"</span><span class="token punctuation">:</span> <span class="token string">"walrus"</span><span class="token punctuation">,</span> <span class="token string">"number"</span><span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Debug</span><span class="token punctuation">(</span><span class="token string">"Started observing beach"</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"animal"</span><span class="token punctuation">:</span> <span class="token string">"walrus"</span><span class="token punctuation">,</span> <span class="token string">"size"</span><span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"A group of walrus emerges from the ocean"</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"omg"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"number"</span><span class="token punctuation">:</span> <span class="token number">122</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Warn</span><span class="token punctuation">(</span><span class="token string">"The group's number increased tremendously!"</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"temperature"</span><span class="token punctuation">:</span> <span class="token operator">-</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Debug</span><span class="token punctuation">(</span><span class="token string">"Temperature changes"</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"animal"</span><span class="token punctuation">:</span> <span class="token string">"orca"</span><span class="token punctuation">,</span> <span class="token string">"size"</span><span class="token punctuation">:</span> <span class="token number">9009</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Panic</span><span class="token punctuation">(</span><span class="token string">"It's over 9000!"</span><span class="token punctuation">)</span> </code></pre>

输出:

<pre><code class="lang-bash hljs">level<span class="token operator">=</span>trace msg<span class="token operator">=</span><span class="token string">"Went to the beach"</span> animal<span class="token operator">=</span>walrus number<span class="token operator">=</span>0 level<span class="token operator">=</span>debug msg<span class="token operator">=</span><span class="token string">"Started observing beach"</span> animal<span class="token operator">=</span>walrus number<span class="token operator">=</span>8 level<span class="token operator">=</span>info msg<span class="token operator">=</span><span class="token string">"A group of walrus emerges from the ocean"</span> animal<span class="token operator">=</span>walrus size<span class="token operator">=</span>10 level<span class="token operator">=</span>warning msg<span class="token operator">=</span><span class="token string">"The group's number increased tremendously!"</span> number<span class="token operator">=</span>122 omg<span class="token operator">=</span>true level<span class="token operator">=</span>debug msg<span class="token operator">=</span><span class="token string">"Temperature changes"</span> temperature<span class="token operator">=</span>-4 level<span class="token operator">=</span>panic msg<span class="token operator">=</span><span class="token string">"It's over 9000!"</span> animal<span class="token operator">=</span>orca size<span class="token operator">=</span>9009 level<span class="token operator">=</span>error msg<span class="token operator">=</span><span class="token string">"The ice breaks!"</span> err_animal<span class="token operator">=</span>orca err_level<span class="token operator">=</span>panic err_message<span class="token operator">=</span><span class="token string">"It's over 9000!"</span> err_size<span class="token operator">=</span>9009 number<span class="token operator">=</span>100 omg<span class="token operator">=</span>true </code></pre> <h3>
3.2 基础设置</h3> <h4>设置日志格式</h4>

将日志格式从默认格式调整为 JSON 格式,同时继续保留去除时间戳的配置。

JSON 格式有个好处,可以方便地被其他日志管理系统解析,诸如 logstash、Splunk。

<pre><code class="lang-go hljs">log<span class="token punctuation">.</span>Formatter <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>logrus<span class="token punctuation">.</span>JSONFormatter<span class="token punctuation">)</span> <span class="token comment">//log.Formatter = new(logrus.TextFormatter) </span> <span class="token comment">//log.Formatter.(*logrus.TextFormatter).DisableColors = true // remove colors</span> log<span class="token punctuation">.</span>Formatter<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>logrus<span class="token punctuation">.</span>JSONFormatter<span class="token punctuation">)</span><span class="token punctuation">.</span>DisableTimestamp <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token comment">// remove timestamp from test output</span> </code></pre> <pre><code class="lang-bash hljs"><span class="token punctuation">{</span><span class="token string">"animal"</span><span class="token keyword">:</span><span class="token string">"walrus"</span>,<span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"trace"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"Went to the beach"</span>,<span class="token string">"number"</span>:0<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"animal"</span><span class="token keyword">:</span><span class="token string">"walrus"</span>,<span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"debug"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"Started observing beach"</span>,<span class="token string">"number"</span>:8<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"animal"</span><span class="token keyword">:</span><span class="token string">"walrus"</span>,<span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"info"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"A group of walrus emerges from the ocean"</span>,<span class="token string">"size"</span>:10<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"warning"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"The group's number increased tremendously!"</span>,<span class="token string">"number"</span>:122,<span class="token string">"omg"</span>:true<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"debug"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"Temperature changes"</span>,<span class="token string">"temperature"</span>:-4<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"animal"</span><span class="token keyword">:</span><span class="token string">"orca"</span>,<span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"panic"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"It's over 9000!"</span>,<span class="token string">"size"</span>:9009<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token string">"err_animal"</span><span class="token keyword">:</span><span class="token string">"orca"</span>,<span class="token string">"err_level"</span><span class="token keyword">:</span><span class="token string">"panic"</span>,<span class="token string">"err_message"</span><span class="token keyword">:</span><span class="token string">"It's over 9000!"</span>,<span class="token string">"err_size"</span>:9009,<span class="token string">"level"</span><span class="token keyword">:</span><span class="token string">"error"</span>,<span class="token string">"msg"</span><span class="token keyword">:</span><span class="token string">"The ice breaks!"</span>,<span class="token string">"number"</span>:100,<span class="token string">"omg"</span>:true<span class="token punctuation">}</span> </code></pre> <h4>
设置日志级别</h4> <pre><code class="lang-go hljs"><span class="token comment">// These are the different logging levels. You can set the logging level to log</span> <span class="token comment">// on your instance of logger, obtained with `logrus.New()`.</span> <span class="token keyword">const</span> <span class="token punctuation">(</span> <span class="token comment">// PanicLevel level, highest level of severity. Logs and then calls panic with the</span> <span class="token comment">// message passed to Debug, Info, ...</span> PanicLevel Level <span class="token operator">=</span> <span class="token boolean">iota</span> <span class="token comment">// FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the</span> <span class="token comment">// logging level is set to Panic.</span> FatalLevel <span class="token comment">// ErrorLevel level. Logs. Used for errors that should definitely be noted.</span> <span class="token comment">// Commonly used for hooks to send errors to an error tracking service.</span> ErrorLevel <span class="token comment">// WarnLevel level. Non-critical entries that deserve eyes.</span> WarnLevel <span class="token comment">// InfoLevel level. General operational entries about what's going on inside the</span> <span class="token comment">// application.</span> InfoLevel <span class="token comment">// DebugLevel level. Usually only enabled when debugging. Very verbose logging.</span> DebugLevel <span class="token comment">// TraceLevel level. Designates finer-grained informational events than the Debug.</span> TraceLevel <span class="token punctuation">)</span> </code></pre>

将日志级别调整到 WarnLevel:

<code>log.Level = logrus.WarnLevel</code>

输出:

<pre><code class="lang-bash hljs">level<span class="token operator">=</span>warning msg<span class="token operator">=</span><span class="token string">"The group's number increased tremendously!"</span> number<span class="token operator">=</span>122 omg<span class="token operator">=</span>true level<span class="token operator">=</span>panic msg<span class="token operator">=</span><span class="token string">"It's over 9000!"</span> animal<span class="token operator">=</span>orca size<span class="token operator">=</span>9009 level<span class="token operator">=</span>error msg<span class="token operator">=</span><span class="token string">"The ice breaks!"</span> err_animal<span class="token operator">=</span>orca err_level<span class="token operator">=</span>panic err_message<span class="token operator">=</span><span class="token string">"It's over 9000!"</span> err_size<span class="token operator">=</span>9009 number<span class="token operator">=</span>100 omg<span class="token operator">=</span>true </code></pre> <h4>
设置日志输出</h4>

默认是 stderr,我们将其配置到了 stdout。

另外也可以输出到文件。

<pre><code class="lang-go hljs"> <span class="token comment">//log.Out = os.Stdout</span> file<span class="token punctuation">,</span> err <span class="token operator">:=</span> os<span class="token punctuation">.</span><span class="token function">OpenFile</span><span class="token punctuation">(</span><span class="token string">"logrus.log"</span><span class="token punctuation">,</span> os<span class="token punctuation">.</span>O_CREATE<span class="token operator">|</span>os<span class="token punctuation">.</span>O_WRONLY<span class="token punctuation">,</span> <span class="token number">0666</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span>Out <span class="token operator">=</span> file <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"Failed to log to file, using default stderr"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

这样运行之后,源文件目录下多了个 logrus.log,日志输出到了里面。

<h3>
3.3 Fields用法</h3>

logrus 不推荐使用冗长的消息来记录运行信息,它推荐使用 Fields 来进行精细化的、结构化的信息记录。

这应该是 logrus 的核心用法,所谓的结构化日志。

例如下面的记录日志的方式:

<pre><code class="lang-go hljs">log<span class="token punctuation">.</span><span class="token function">Fatalf</span><span class="token punctuation">(</span><span class="token string">"Failed to send event %s to topic %s with key %d"</span><span class="token punctuation">,</span> event<span class="token punctuation">,</span> topic<span class="token punctuation">,</span> key<span class="token punctuation">)</span> </code></pre>

在 logrus 中不太提倡,鼓励使用以下方式替代之:

<pre><code class="lang-go hljs">log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>log<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span> <span class="token string">"event"</span><span class="token punctuation">:</span> event<span class="token punctuation">,</span> <span class="token string">"topic"</span><span class="token punctuation">:</span> topic<span class="token punctuation">,</span> <span class="token string">"key"</span><span class="token punctuation">:</span> key<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Fatal</span><span class="token punctuation">(</span><span class="token string">"Failed to send event"</span><span class="token punctuation">)</span> </code></pre>

前面的WithFields API可以规范使用者按照其提倡的方式记录日志.但是WithFields依然是可选的,因为某些场景下,使用者确实只需要记录仪一条简单的消息.

通常,在一个应用中、或者应用的一部分中,都有一些固定的Field.比如在处理用户http请求时,上下文中,所有的日志都会有request_id和user_ip.为了避免每次记录日志都要使用log.WithFields(log.Fields{“request_id”: request_id, “user_ip”: user_ip}),我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,在上下文中使用这个logrus.Entry实例记录日志即可.

<pre><code class="lang-go hljs">requestLogger <span class="token operator">:=</span> log<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>log<span class="token punctuation">.</span>Fields<span class="token punctuation">{</span><span class="token string">"request_id"</span><span class="token punctuation">:</span> request_id<span class="token punctuation">,</span> <span class="token string">"user_ip"</span><span class="token punctuation">:</span> user_ip<span class="token punctuation">}</span><span class="token punctuation">)</span> requestLogger<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"something happened on that request"</span><span class="token punctuation">)</span> # will log request_id and user_ip requestLogger<span class="token punctuation">.</span><span class="token function">Warn</span><span class="token punctuation">(</span><span class="token string">"something not great happened"</span><span class="token punctuation">)</span> </code></pre> <h4>
为什么会有 log.WithFields().Fatal() 这种多次调用的写法?</h4>

因为 log.WithFields() 返回的是一个 Entry,这个 Entry 还能调用方法。

<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token punctuation">(</span>entry <span class="token operator">*</span>Entry<span class="token punctuation">)</span> <span class="token function">WithField</span><span class="token punctuation">(</span>key <span class="token builtin">string</span><span class="token punctuation">,</span> value <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">*</span>Entry <span class="token punctuation">{</span> <span class="token keyword">return</span> entry<span class="token punctuation">.</span><span class="token function">WithFields</span><span class="token punctuation">(</span>Fields<span class="token punctuation">{</span>key<span class="token punctuation">:</span> value<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h3>
3.4 Hook 用法</h3>

hook 有很多用法,可以将日志做进一步的处理,比如不同目的地的分发,比如额外添加字段。

这里先试试将日志写入 syslog ,根据官方说明,操作如下代码:

<pre><code class="lang-go hljs"><span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"os"</span> <span class="token string">"github.com/sirupsen/logrus"</span> logrus_syslog <span class="token string">"github.com/sirupsen/logrus/hooks/syslog"</span> <span class="token string">"log/syslog"</span> <span class="token punctuation">)</span> </code></pre> <pre><code class="lang-go hljs"> hook<span class="token punctuation">,</span> err <span class="token operator">:=</span> logrus_syslog<span class="token punctuation">.</span><span class="token function">NewSyslogHook</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">,</span> syslog<span class="token punctuation">.</span>LOG_INFO<span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">"Unable to connect to local syslog daemon"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">AddHook</span><span class="token punctuation">(</span>hook<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

运行过后,查看最新的系统日志,发现调试信息已经写入。

<pre><code># vim /var/log/messages Feb 27 17:03:20 VM_10_230_centos /root/test/log/__debug_bin[2194]: level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 Feb 27 17:03:20 VM_10_230_centos /root/test/log/__debug_bin[2194]: level=warning msg="The group's number increased tremendously!" number=122 omg=true Feb 27 17:03:20 VM_10_230_centos /root/test/log/__debug_bin[2194]: level=panic msg="It's over 9000!" animal=orca size=9009 Feb 27 17:03:20 VM_10_230_centos /root/test/log/__debug_bin[2194]: level=error msg="The ice breaks!" err_animal=orca err_level=panic err_message="It's over 9000!" err_size=9009 number=100 omg=true </code></pre> <h2>
4 小结</h2>

Logrus 最大的特色是结构化日志记录,可以携带field;另外结合 hook 可以实现非常灵活的日志分发和内容调整。

<h2>
END</h2>

到此这篇关于“Golang 库 - 日志库 logrus”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 日志分析_每日一库之 logrus 日志使用教程
Go进阶45:Golang简洁的日志收集系统(替代ELKB)
使用 Go 记录日志
go语言之日志,按文件大小日期轮询rotatelogs
Golang 库 - 日志库 logrus
go 杂谈一
20 个有用的 Go 语言微服务开发框架
20 个好用的 Go 语言微服务开发框架
使用bin-log日志还原数据库的例子
go语言之日志,按日期轮询file-rotatelogs

[关闭]
~ ~