如何禁用日志记录器

我有一些使用该log程序包的工具化代码。现在该关闭日志记录了,我无法确定如何关闭标准记录器。

我错过了什么吗?我应该在进行日志调用之前检查标志,还是在生产中将其注释掉?


PIPIONE
浏览 252回答 3
3回答

LEATH

要完全禁用日志,最好调用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 runPASSBenchmarkGoLogging-4                                             1000000          2068 ns/opBenchmarkGoLoggingNullBackend-4                                  5000000           308 ns/opBenchmarkGoLoggingNullBackendWithFancyFormatter-4                3000000           435 ns/opBenchmarkGoLoggingOffLevel-4                                    20000000           109 ns/opBenchmarkGoLoggingNullBackendAndOffLevel-4                      20000000           108 ns/opBenchmarkGoLoggingNullBackendWithFancyFormatterAndOffLevel-4    20000000           109 ns/opBenchmarkLog15-4                                                  200000          7359 ns/opBenchmarkLog15WithDiscardHandler-4                               2000000           922 ns/opBenchmarkLog15WithDiscardHandlerAndOffLevel-4                    2000000           926 ns/opBenchmarkLog15WithNopLogger-4                                   20000000           108 ns/opBenchmarkLog15WithNopLoggerDiscardHandlerA-4                    20000000           112 ns/opBenchmarkLog15WithNopLoggerAndDiscardHandlerAndOffLevel-4       20000000           112 ns/opBenchmarkLog-4                                                   1000000          1217 ns/opBenchmarkLogIoDiscardWriter-4                                    2000000           724 ns/opBenchmarkLogIoDiscardWriterWithoutFlags-4                        3000000           543 ns/opBenchmarkLogCustomNullWriter-4                                   2000000           731 ns/opBenchmarkLogCustomNullWriterWithoutFlags-4                       3000000           549 ns/opBenchmarkNopLogger-4                                            20000000           113 ns/opBenchmarkNopLoggerWithoutFlags-4                                20000000           112 ns/opBenchmarkLogrus-4                                                 300000          3832 ns/opBenchmarkLogrusWithDiscardWriter-4                                500000          3032 ns/opBenchmarkLogrusWithNullFormatter-4                                500000          3814 ns/opBenchmarkLogrusWithPanicLevel-4                                   500000          3872 ns/opBenchmarkLogrusWithDiscardWriterAndPanicLevel-4                   500000          3085 ns/opBenchmarkLogrusWithDiscardWriterAndNullFormatterAndPanicLevel-4   500000          3064 ns/opok      log-benchmarks  51.378sgo test -bench .  62.17s user 3.90s system 126% cpu 52.065 total

心有法竹

当io / ioutil包中存在通用io.Writer时,没有理由创建自己的类型。import (    "log"    "io/ioutil")func init() {    log.SetOutput(ioutil.Discard)}

青春有我

这种方法使您可以在运行时打开和关闭日志记录: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)两种方法都可以使您当前的代码几乎完全保持不变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go