Loggin in Unix log server in Golang
The log package in Golang, allows you to send log messages to log files. This log file can be syslog, mail.log, or your custom log file.
In this article, you'll learn how to do this.
Logging to syslog
The example below shows you the way of sending log messages to /var/log/syslog file in Unix os. We are going to use log/syslog package to set the log file.
package main
import (
"log"
"log/syslog"
"os"
)
func main() {
// Log to syslog
logWriter, err := syslog.New(syslog.LOG_SYSLOG, "My Awesome App")
if err != nil {
log.Fatalln("Unable to set logfile:", err.Error())
}
// set the log output
log.SetOutput(logWriter)
log.Println("This is a log from GOLANG")
}
Now, if you run the application, This is a log from GOLANG will be logged in the syslog file.
You can check it using this command:
$ tail -f /var/log/syslog
The output would be something like this:
...
Dec 23 01:12:21 sam My Awesome App[102379]: 2020/12/23 01:12:21 This is a log from GOLANG
Sometimes you need to log the line number logged message. To do that, you have to set the Lshortfile flag to the log package.
package main
import (
"log"
"log/syslog"
"os"
)
func main() {
// Log to syslog
logWriter, err := syslog.New(syslog.LOG_SYSLOG, "My Awesome App")
if err != nil {
log.Fatalln("Unable to set logfile:", err.Error())
}
// + set log flag
log.SetFlags(log.Lshortfile)
// set the log output
log.SetOutput(logWriter)
log.Println("This is a log from GOLANG")
}
The logged message would be like this:
Dec 23 01:17:28 sam My Awesome App[103468]: logging.go:20: This is a log from GOLANG
As you can see, logging.go:20: is added to the log message and tell you the filename and line number of the code that the log function called.
Logging to a custom log file
If you want to write your log messages to a custom log file, take a look at the example below:
package main
import (
"log"
"log/syslog"
"os"
)
func main() {
// log to custom file
LOG_FILE := "/tmp/myapp_log"
// open log file
logFile, err := os.OpenFile(LOG_FILE, os.O_APPEND|os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
log.Panic(err)
}
defer logFile.Close()
// Set log out put and enjoy :)
log.SetOutput(logFile)
// optional: log date-time, filename, and line number
log.SetFlags(log.Lshortfile | log.LstdFlags)
log.Println("Logging to custom file")
}
Now run the application and check the result:
$ tail -f /tmp/myapp_log
2020/12/23 01:29:25 logging.go:29: Logging to custom file
Is log package concurrency-safe?
Yes! All functions in the log package are concurrency-safe and it means that you can use the package from multiple goroutines. It clearly mentioned in the log package documentation:
A Logger represents an active logging object that generates lines of output to an
io.Writer. Each logging operation makes a single call to the Writer's Write method. A Logger can be used simultaneously from multiple goroutines; it guarantees to serialize access to the Writer.
The example below will show you a simple example that writes log messages to a given log file from multiple goroutines:
package main
import (
"log"
"os"
"sync"
"time"
)
func main() {
logFile, err := os.OpenFile("clog", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
if err != nil {
log.Fatalln(err)
}
log.SetOutput(logFile)
var wg sync.WaitGroup
wg.Add(3)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
log.Println("F1; loop:", i)
time.Sleep(time.Millisecond)
}
}()
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
log.Println("F2; loop:", i)
time.Sleep(time.Millisecond * 2)
}
}()
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
log.Println("F3; loop:", i)
time.Sleep(time.Millisecond * 3)
}
}()
wg.Wait()
}
If you run the code the output will be something like this:
$ go run main.go
$ cat clog
2020/12/27 01:24:20 F3; loop: 0
2020/12/27 01:24:20 F1; loop: 0
2020/12/27 01:24:20 F2; loop: 0
2020/12/27 01:24:20 F1; loop: 1
2020/12/27 01:24:20 F2; loop: 1
2020/12/27 01:24:20 F1; loop: 2
2020/12/27 01:24:20 F3; loop: 1
2020/12/27 01:24:20 F1; loop: 3
2020/12/27 01:24:20 F2; loop: 2
2020/12/27 01:24:20 F1; loop: 4
2020/12/27 01:24:20 F1; loop: 5
2020/12/27 01:24:20 F3; loop: 2
2020/12/27 01:24:20 F2; loop: 3
2020/12/27 01:24:20 F1; loop: 6
2020/12/27 01:24:20 F1; loop: 7
2020/12/27 01:24:20 F2; loop: 4
2020/12/27 01:24:20 F1; loop: 8
2020/12/27 01:24:20 F3; loop: 3
2020/12/27 01:24:20 F1; loop: 9
2020/12/27 01:24:20 F2; loop: 5
2020/12/27 01:24:20 F3; loop: 4
2020/12/27 01:24:20 F2; loop: 6
2020/12/27 01:24:20 F2; loop: 7
2020/12/27 01:24:20 F3; loop: 5
2020/12/27 01:24:20 F2; loop: 8
2020/12/27 01:24:20 F3; loop: 6
2020/12/27 01:24:20 F2; loop: 9
2020/12/27 01:24:20 F3; loop: 7
2020/12/27 01:24:20 F3; loop: 8
2020/12/27 01:24:20 F3; loop: 9
These were 2 simple ways to save log messages to log files. I hope you find it helpful.
Top comments (1)
Thanks 👍