The log.Output function in Golang is part of the log package and provides a lower-level interface for logging messages. This function is particularly useful when you need more control over the logging process, such as specifying the call depth or integrating logging into custom logging frameworks.
Table of Contents
- Introduction
log.OutputFunction Syntax- Examples
- Basic Usage
- Customizing Log Call Depth
- Integrating
log.Outputwith Custom Logging
- Real-World Use Case Example
- Conclusion
Introduction
The log.Output function allows you to log messages while specifying the call depth, which controls how the source file and line number are determined in the log output. This provides finer control over the logging process compared to other logging functions like log.Print, log.Println, or log.Printf, making it ideal for advanced logging scenarios.
log.Output Function Syntax
The syntax for the log.Output function is as follows:
func Output(calldepth int, s string) error
Parameters:
calldepth: An integer representing the call depth, which determines how many stack frames to skip when identifying the source file and line number for the log message.s: A string containing the log message.
Returns:
error: An error value that will be non-nil if the logging operation fails.
Behavior:
- Logs the message: The function logs the provided message, including the source file and line number based on the specified call depth.
Examples
Basic Usage
This example demonstrates how to use log.Output to log a message with a custom call depth.
Example
package main
import (
"log"
)
func main() {
log.SetPrefix("[INFO] ")
err := log.Output(2, "This is a log message with custom call depth.")
if err != nil {
log.Fatal(err)
}
}
Output:
[INFO] 2024/08/10 12:34:56 main.go:10: This is a log message with custom call depth.
Explanation:
- The
log.Outputfunction is used to log a message with a call depth of 2, which means it skips one stack frame and records the source file and line number wherelog.Outputwas called.
Customizing Log Call Depth
This example shows how to adjust the call depth when using log.Output in a helper function, ensuring the correct source file and line number are logged.
Example
package main
import (
"log"
)
func logMessage(message string) {
log.Output(3, message) // Adjusted call depth to skip helper function
}
func main() {
logMessage("This log entry should show the caller's location.")
}
Output:
2024/08/10 12:34:56 main.go:12: This log entry should show the caller's location.
Explanation:
- The
log.Outputfunction is called within thelogMessagehelper function with a call depth of 3, ensuring that the log message reflects the location in themainfunction wherelogMessagewas called.
Integrating log.Output with Custom Logging
This example demonstrates how to integrate log.Output into a custom logging function that automatically includes the correct source file and line number.
Example
package main
import (
"log"
)
func customLog(level, message string) {
log.Output(3, level+": "+message)
}
func main() {
customLog("DEBUG", "This is a debug message.")
customLog("ERROR", "An error occurred.")
}
Output:
DEBUG: 2024/08/10 12:34:56 main.go:10: This is a debug message.
ERROR: 2024/08/10 12:34:56 main.go:11: An error occurred.
Explanation:
- The
log.Outputfunction is used within thecustomLogfunction to log messages with a custom log level while maintaining accurate source file and line number information.
Real-World Use Case Example: Building a Logging Library
A practical use case for log.Output is in building a custom logging library that needs to provide accurate file and line number information while supporting multiple log levels and formats.
Example: Simple Logging Library
package main
import (
"log"
)
func logWithLevel(level, message string) {
log.Output(3, level+": "+message)
}
func Info(message string) {
logWithLevel("INFO", message)
}
func Debug(message string) {
logWithLevel("DEBUG", message)
}
func Error(message string) {
logWithLevel("ERROR", message)
}
func main() {
Info("Application started.")
Debug("Loading configuration.")
Error("Failed to connect to the database.")
}
Explanation:
- The
log.Outputfunction is used within thelogWithLevelfunction to log messages at different levels (INFO,DEBUG,ERROR), while ensuring that the correct source file and line number are included in the log output.
Conclusion
The log.Output function in Go is used for advanced logging scenarios where you need more control over the logging process, particularly the source file and line number information. By specifying the call depth, log.Output allows you to create custom logging functions, integrate logging into custom frameworks, and build flexible logging libraries. Whether you’re developing a simple application or a complex system, log.Output provides the flexibility needed to manage log output effectively in Go.