12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package logger
- import (
- "fmt"
- "net/http"
- "os"
- "time"
- )
- type Logger struct {
- wwwDir string
- cdata chan string
- cclose chan bool
- }
- func (this *Logger) write(str string) {
- // TODO: write to console or to file
- // If www and host home dir are exists
- fmt.Fprintln(os.Stdout, str)
- }
- func New() *Logger {
- // Logs channel
- cdata := make(chan string)
- // Close channel
- cclose := make(chan bool)
- // Init logger pointer
- lg := Logger{cdata: cdata, cclose: cclose}
- // Write log string in background
- go func() {
- for {
- select {
- case str := <-cdata:
- lg.write(str)
- case <-cclose:
- cclose <- true
- return
- }
- }
- }()
- return &lg
- }
- func (this *Logger) Log(str string) {
- // Do not wait
- go func() {
- select {
- case this.cdata <- str:
- return
- case <-time.After(1 * time.Second):
- fmt.Println("Logger error, log channel is overflowed (1)")
- return
- }
- }()
- }
- func (this *Logger) SetWwwDir(dir string) {
- this.wwwDir = dir
- }
- func (this *Logger) Handler(h http.Handler) http.Handler {
- return handler{
- h: h,
- w: os.Stdout,
- c: this.cdata,
- }
- }
- func (this *Logger) Close() {
- this.cclose <- true
- <-this.cclose
- }
|