standard software programa practices new logger log library golang flag example best logging go flags

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))