为了账号安全,请及时绑定邮箱和手机立即绑定

如何禁用日志记录器

如何禁用日志记录器

Go
PIPIONE 2021-04-27 17:45:26
我有一些使用该log程序包的工具化代码。现在该关闭日志记录了,我无法确定如何关闭标准记录器。我错过了什么吗?我应该在进行日志调用之前检查标志,还是在生产中将其注释掉?
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

要完全禁用日志,最好调用log.SetFlags(0)Joril并将输出设置为无操作io.Writer(例如log.SetOutput(ioutil.Discard)

但即使在此之后,操作仍将闲置约500-600 ns / op 1

这仍然可切断短路(左右为100 ns / OP)通过使用自定义Logger的实现,并实现所有功能进行任何操作-这表现在这里(只覆盖Println了bervity)。

所有这些的替代方法是使用具有级别的自定义日志记录框架并将其设置为OFF。

但是请注意,常用的日志记录库之一(logrus会对性能产生影响-在基准测试中,它的性能均达到3K + ns / op,无论如何。

偏见的意见:从基准,图书馆去,记录在参数与自定义执行Logger执行设定时,Level-1,无论后端和格式

(可以在此处找到基准源)

基准的输出如下:

testing: warning: no tests to run

PASS

BenchmarkGoLogging-4                                             1000000          2068 ns/op

BenchmarkGoLoggingNullBackend-4                                  5000000           308 ns/op

BenchmarkGoLoggingNullBackendWithFancyFormatter-4                3000000           435 ns/op

BenchmarkGoLoggingOffLevel-4                                    20000000           109 ns/op

BenchmarkGoLoggingNullBackendAndOffLevel-4                      20000000           108 ns/op

BenchmarkGoLoggingNullBackendWithFancyFormatterAndOffLevel-4    20000000           109 ns/op

BenchmarkLog15-4                                                  200000          7359 ns/op

BenchmarkLog15WithDiscardHandler-4                               2000000           922 ns/op

BenchmarkLog15WithDiscardHandlerAndOffLevel-4                    2000000           926 ns/op

BenchmarkLog15WithNopLogger-4                                   20000000           108 ns/op

BenchmarkLog15WithNopLoggerDiscardHandlerA-4                    20000000           112 ns/op

BenchmarkLog15WithNopLoggerAndDiscardHandlerAndOffLevel-4       20000000           112 ns/op

BenchmarkLog-4                                                   1000000          1217 ns/op

BenchmarkLogIoDiscardWriter-4                                    2000000           724 ns/op

BenchmarkLogIoDiscardWriterWithoutFlags-4                        3000000           543 ns/op

BenchmarkLogCustomNullWriter-4                                   2000000           731 ns/op

BenchmarkLogCustomNullWriterWithoutFlags-4                       3000000           549 ns/op

BenchmarkNopLogger-4                                            20000000           113 ns/op

BenchmarkNopLoggerWithoutFlags-4                                20000000           112 ns/op

BenchmarkLogrus-4                                                 300000          3832 ns/op

BenchmarkLogrusWithDiscardWriter-4                                500000          3032 ns/op

BenchmarkLogrusWithNullFormatter-4                                500000          3814 ns/op

BenchmarkLogrusWithPanicLevel-4                                   500000          3872 ns/op

BenchmarkLogrusWithDiscardWriterAndPanicLevel-4                   500000          3085 ns/op

BenchmarkLogrusWithDiscardWriterAndNullFormatterAndPanicLevel-4   500000          3064 ns/op

ok      log-benchmarks  51.378s

go test -bench .  62.17s user 3.90s system 126% cpu 52.065 total


查看完整回答
反对 回复 2021-05-10
?
心有法竹

TA贡献1866条经验 获得超5个赞

当io / ioutil包中存在通用io.Writer时,没有理由创建自己的类型。


import (

    "log"

    "io/ioutil"

)


func init() {

    log.SetOutput(ioutil.Discard)

}


查看完整回答
反对 回复 2021-05-10
?
青春有我

TA贡献1784条经验 获得超8个赞

这种方法使您可以在运行时打开和关闭日志记录:


type LogWriter struct{

    enabled bool

}


func (l *LogWriter) Enable() {

    l.enabled = true

}


func (l *LogWriter) Disable() {

    l.enabled = false

}


func (l *LogWriter) Write([]byte) (int, error) {

    if l.enabled {

        //...

    }

    return 0, nil

}

这种方法可以启用或禁用整个运行时的日志记录:


type LogWriter struct{}


func (l *LogWriter) Write([]byte) (int, error) {

    if some.Constant {

        //...

    }

    return 0, nil

}

其中some.Constant可能是您在编译前设置的常量(产生“生产”二进制文件),或者是通过命令行标志运行程序时仅设置一次的变量(类似myprogram --enable-logging=true)


两种方法都可以使您当前的代码几乎完全保持不变。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信