3 回答
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
TA贡献1866条经验 获得超5个赞
当io / ioutil包中存在通用io.Writer时,没有理由创建自己的类型。
import (
"log"
"io/ioutil"
)
func init() {
log.SetOutput(ioutil.Discard)
}
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)
两种方法都可以使您当前的代码几乎完全保持不变。
- 3 回答
- 0 关注
- 251 浏览
添加回答
举报