logging - programa - new log software
Ir: Deshabilitar un registro. Registrador? (6)
Tengo un código muy instrumentado que hace uso del paquete de log
. Ahora ha llegado el momento de desactivar el registro, y no puedo determinar cómo desactivar el registrador estándar.
¿Me he perdido algo? ¿Debo marcar una marca antes de hacer llamadas de registro o comentarlas en producción?
Dado que SetOutput()
solo se define para el registrador global, un escritor personalizado sigue siendo útil para otros registradores. Una forma corta de escribir uno es así:
type LogWriter struct{ io.Writer }
func (w *LogWriter) Enable() { w.Writer = os.Stdout }
func (w *LogWriter) Disable() { w.Writer = ioutil.Discard }
Este enfoque le permite activar y desactivar el registro en el tiempo de ejecución:
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
}
Y este enfoque habilita o inhabilita el registro para todo el tiempo de ejecución:
type LogWriter struct{}
func (l *LogWriter) Write([]byte) (int, error) {
if some.Constant {
//...
}
return 0, nil
}
Donde some.Constant
sería una constante que configuró antes de compilar (producir un binario de "producción" ) o una variable que se establece solo una vez cuando se ejecuta el programa mediante indicadores de línea de comandos (algo como myprogram --enable-logging=true
)
Con ambos enfoques, puede dejar su código actual casi completamente intacto.
No hay razón para crear su propio tipo para un io.Writer común cuando existe uno en el paquete io / ioutil.
import (
"log"
"io/ioutil"
)
func init() {
log.SetOutput(ioutil.Discard)
}
Para deshabilitar completamente los registros, en realidad es mejor llamar a log.SetFlags(0)
Joril y establecer la salida en un io.Writer
no op io.Writer
(Es decir, log.SetOutput(ioutil.Discard)
)
Pero incluso después de esto, las operaciones estarán inactivas alrededor de 500-600 ns / op 1
Esto todavía se puede reducir (hasta alrededor de 100 ns / op ) mediante el uso de una implementación de Logger
personalizada e implementando todas las funciones para que no sean operativas, como se demuestra aquí (solo se Println
para bervity).
La alternativa a todo esto es usar un marco de registro personalizado con niveles y configurarlo para que se complete en OFF.
Sin embargo, tenga en cuenta que una de las bibliotecas utilizadas comúnmente para el registro ( logrus ) tiene implicaciones en el rendimiento ; lo mismo se puede encontrar en los benchmarks en los que se realiza con 3K + ns / op , independientemente.
Opinión sesgada: desde los puntos de referencia, el go-logging acceso de la biblioteca funciona a la par con la implementación personalizada go-logging cuando se establece el Level
en -1
, independientemente del backend y el formato.
(La fuente de referencia se puede encontrar benchmarks )
La salida del índice de referencia es la siguiente:
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
# 1: YMMV , probado en CPU i7-4500U a 1.80GHz
Una nota para otros que vienen aquí en busca de este y otros recursos de registro: observe el paquete log4go, ya que cubre la desactivación del registro, la configuración de los niveles de registro, la rotación del registro, la redirección a un archivo, etc., lo que puede ser útil.
Consulte el documento en http://godoc.org/code.google.com/p/log4go
type NullWriter int
func (NullWriter) Write([]byte) (int, error) { return 0, nil }
// ...
log.SetOutput(new(NullWriter))