How to log messages with caller information (file name, line number) in Go?

In Go, you can use the log package to log messages, but it doesn't provide built-in support for automatically adding caller information like file name and line number. However, you can use a combination of the runtime package and a custom logger to achieve this.

Here's an example of a custom logger implementation that includes caller information:

package main import ( "log" "runtime" ) type Logger struct { logger *log.Logger } func NewLogger() *Logger { return &Logger{ logger: log.New(log.Writer(), "", log.LstdFlags), } } func (l *Logger) Log(message string) { _, file, line, _ := runtime.Caller(1) l.logger.Printf("%s:%d %s", file, line, message) } func main() { logger := NewLogger() logger.Log("This is a log message.") }

In this example, we create a Logger struct that wraps the standard log.Logger and adds a Log method to log messages along with the caller information.

The runtime.Caller(1) function call inside the Log method retrieves the information of the caller, where the 1 argument skips one additional stack frame like calling function itself, which brings you to the correct frame.

By calling the Log method on an instance of Logger, you can log messages with the caller's file name and line number included.

Please note that adding caller information to log messages can affect performance, so use it responsibly in production environments.