| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | // Copyright 2014 The Gogs Authors. All rights reserved.// Use of this source code is governed by a MIT-style// license that can be found in the LICENSE file.package logimport (	"encoding/json"	"io"	"log"	"net")// ConnWriter implements LoggerInterface.// it writes messages in keep-live tcp connection.type ConnWriter struct {	lg             *log.Logger	innerWriter    io.WriteCloser	ReconnectOnMsg bool   `json:"reconnectOnMsg"`	Reconnect      bool   `json:"reconnect"`	Net            string `json:"net"`	Addr           string `json:"addr"`	Level          int    `json:"level"`}// create new ConnWrite returning as LoggerInterface.func NewConn() LoggerInterface {	conn := new(ConnWriter)	conn.Level = TRACE	return conn}// init connection writer with json config.// json config only need key "level".func (cw *ConnWriter) Init(jsonconfig string) error {	return json.Unmarshal([]byte(jsonconfig), cw)}// write message in connection.// if connection is down, try to re-connect.func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error {	if cw.Level > level {		return nil	}	if cw.neddedConnectOnMsg() {		if err := cw.connect(); err != nil {			return err		}	}	if cw.ReconnectOnMsg {		defer cw.innerWriter.Close()	}	cw.lg.Println(msg)	return nil}func (_ *ConnWriter) Flush() {}// destroy connection writer and close tcp listener.func (cw *ConnWriter) Destroy() {	if cw.innerWriter == nil {		return	}	cw.innerWriter.Close()}func (cw *ConnWriter) connect() error {	if cw.innerWriter != nil {		cw.innerWriter.Close()		cw.innerWriter = nil	}	conn, err := net.Dial(cw.Net, cw.Addr)	if err != nil {		return err	}	if tcpConn, ok := conn.(*net.TCPConn); ok {		tcpConn.SetKeepAlive(true)	}	cw.innerWriter = conn	cw.lg = log.New(conn, "", log.Ldate|log.Ltime)	return nil}func (cw *ConnWriter) neddedConnectOnMsg() bool {	if cw.Reconnect {		cw.Reconnect = false		return true	}	if cw.innerWriter == nil {		return true	}	return cw.ReconnectOnMsg}func init() {	Register("conn", NewConn)}
 |