Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable a log.Logger

Tags:

logging

flags

go

I have some heavily instrumented code that makes use of the log package. Now it's come time to turn off the logging, and I can't determine how to turn off the standard logger.

Have I missed something? Should I be checking a flag before making log calls, or commenting them out in production?

like image 343
Matt Joiner Avatar asked May 13 '12 11:05

Matt Joiner


People also ask

What does logging getLogger (__ Name __) do?

getLogger(name) is typically executed. The getLogger() function accepts a single argument - the logger's name. It returns a reference to a logger instance with the specified name if provided, or root if not. Multiple calls to getLogger() with the same name will return a reference to the same logger object.

What is a logger in Python?

Logger : This is the class whose objects will be used in the application code directly to call the functions. LogRecord : Loggers automatically create LogRecord objects that have all the information related to the event being logged, like the name of the logger, the function, the line number, the message, and more.

What is Loglevel?

A log level or log severity is a piece of information telling how important a given log message is. It is a simple, yet very powerful way of distinguishing log events from each other. If the log levels are used properly in your application all you need is to look at the severity first.


2 Answers

No reason to create your own type for a common io.Writer when one exists in the io/ioutil package.

import (     "log"     "io/ioutil" )  func init() {     log.SetOutput(ioutil.Discard) } 
like image 65
Jeff Wendling Avatar answered Sep 21 '22 08:09

Jeff Wendling


For completely disabling logs, it's actually better to call log.SetFlags(0)Joril and set the output to a no-op io.Writer (i.e., log.SetOutput(ioutil.Discard))

But even after this, the operations will idle around 500-600 ns/op1

This can still be cut short (to around 100 ns/op) by using a custom Logger implementation, and implementing all the functions to be no-op -- as demonstrated here (only overriding Println for bervity).

The alternative to all these is to use a custom logging framework with levels and set it to complete OFF.

Note though, one of the commonly used library for logging (logrus) has performance implications -- the same can be found in the benchmarks where it perform with 3K+ ns/op, regardless.

Biased opinion: from the benchmarks, the library go-logging performs in par with the custom Logger implementation when setting the Level to -1, regardless of the backend and formatting

(the benchmark source can be found here)

the output of the benchmark is as follows:

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, tested on i7-4500U CPU @ 1.80GHz

like image 20
Avinash R Avatar answered Sep 18 '22 08:09

Avinash R