Saturday, 8 August 2015

[Golang] awesome-go, log to syslog

Log là chuyện hiển nhiên của mọi phần mềm,
Module "log" của Golang là một nỗi thất vọng tràn trề cho ai đến từ Python với logging module, hay Java với Log4j thần thánh.

Và đây là lúc sức mạnh của mã nguồn mở bắt đầu...

Google là cái bản đồ kỳ diệu, nhưng cuối cùng nó cũng chỉ dẫn đến đích là GitHub, nơi kho báu nằm chờ. Cộng đồng mạng của tây thay vì ngồi thể hiện quan điểm về đất nước mình, họ đã xây dựng lên 1 hệ thống gọi là awesome-xyz, lưu trữ đầy đủ mọi tài nguyên liên quan đến mọi thứ. Danh sách đầy đủ các loại some xem ở đây hoặc đây.

Awesome-go cũng góp phần vào sự thần kỳ ấy với đầy đủ các package của cộng đồng, với mục logging gồm hơn hai chục package, làm sao để tìm ra cái mình cần?

Có nhiều cách để đánh giá, nhưng phổ biến nhất là theo lượng star/fork nếu đây là một project trên Github, vậy là từ một thứ "awesome", một sản phẩm hơn cả "awesome"  - fucking awesome đã ra đới ^^

Logrus dẫn đầu cuộc đua sao với 1500+ star, tiếp sau là glog (có sự tham gia của Rob Pike - tác giả của Golang) với 700+ và seelog với 400+



Khi sử dụng logrus để log tới syslog, logrus sử dụng khái niệm "hook", mỗi cái hook được gọi sau mỗi lần 1 entry được xử lý.
Function để tạo một syslog hook:

func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error)
{
w, err := syslog.Dial(network, raddr, priority, tag)
 ...
}

NewSyslogHook nhận đầu vào là giao thức (UDP/TCP) và địa chỉ để gửi log tới. Bình thường sẽ chẳng có chuyện gì nếu server nào cũng bật rsyslog listen port 514 UDP, nhưng không phải lúc nào cũng vậy. Để log tới syslog mà không cần syslog daemon listen đến một port nào, chỉ cần pass hai empty string, syslog.Dial sẽ log trực tiếp vào syslog.

$ godoc log/syslog | grep "func Dial" -A5
func Dial(network, raddr string, priority Priority, tag string) (*Writer, error)
    Dial establishes a connection to a log daemon by connecting to address
    raddr on the specified network. Each write to the returned writer sends
    a log message with the given facility, severity and tag. If network is
    empty, Dial will connect to the local syslog server.

Bài học & kết luận:
- luôn đọc doc (với godoc)
- khi có thứ gì awesome sẵn rồi, bạn vẫn có thể tạo ra những thứ awesome hơn nữa :3

Hết.
hvn @ familug.org