diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
new file mode 100644
index 0000000..3e01441
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.md
@@ -0,0 +1,19 @@
+---
+name: Bug Report
+about: Report a bug
+labels: kind/bug
+
+---
+
+<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!
+
+-->
+
+
+**What happened**:
+
+**What you expected to happen**:
+
+**How to reproduce it (as minimally and precisely as possible)**:
+
+**Anything else we need to know?**:
diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md
new file mode 100644
index 0000000..6d1a6d9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/enhancement.md
@@ -0,0 +1,11 @@
+---
+name: Enhancement Request
+about: Suggest an enhancement
+labels: kind/feature
+
+---
+<!-- Please only use this template for submitting enhancement requests -->
+
+**What would you like to be added**:
+
+**Why is this needed**:
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..3eb1ec0
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,24 @@
+<!--  Thanks for sending a pull request! 
+-->
+
+**What this PR does**:
+
+**Which issue(s) this PR fixes**:
+<!--
+*Automatically closes linked issue when PR is merged.
+Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
+_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
+-->
+Fixes #
+
+**Special notes for your reviewer**:
+
+**Does this PR introduce a user-facing change?**:
+<!--
+If no, just write "NONE" in the release-note block below.
+If yes, a release note is required:
+Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".
+-->
+```release-note
+
+```
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index aff461c..d542282 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,11 +1,16 @@
 language: go
 
+os:
+  - linux
+
 go:
   - "1.13"
 
 env:
   - GO111MODULE=on
 
+install: true
+
 script:
   - go fmt ./... && [[ -z `git status -s` ]]
   - go mod vendor && go test $(go list ./... | grep -v vendor | grep -v demo) -coverprofile=coverage.txt -covermode=atomic
diff --git a/client.go b/client.go
index a3d5fe8..5e7a45d 100644
--- a/client.go
+++ b/client.go
@@ -153,7 +153,7 @@
 			return newTCPSession(conn, c)
 		}
 
-		log.Infof("net.DialTimeout(addr:%s, timeout:%v) = error:%+v", c.addr, connectTimeout, err)
+		log.Infof("net.DialTimeout(addr:%s, timeout:%v) = error:%+v", c.addr, connectTimeout, perrors.WithStack(err))
 		<-wheel.After(connectInterval)
 	}
 }
@@ -185,7 +185,7 @@
 			err = errSelfConnect
 		}
 		if err != nil {
-			log.Warnf("net.DialTimeout(addr:%s, timeout:%v) = error:%+v", c.addr, err)
+			log.Warnf("net.DialTimeout(addr:%s, timeout:%v) = error:%+v", c.addr, perrors.WithStack(err))
 			<-wheel.After(connectInterval)
 			continue
 		}
@@ -194,7 +194,7 @@
 		conn.SetWriteDeadline(time.Now().Add(1e9))
 		if length, err = conn.Write(connectPingPackage[:]); err != nil {
 			conn.Close()
-			log.Warnf("conn.Write(%s) = {length:%d, err:%+v}", string(connectPingPackage), length, err)
+			log.Warnf("conn.Write(%s) = {length:%d, err:%+v}", string(connectPingPackage), length, perrors.WithStack(err))
 			<-wheel.After(connectInterval)
 			continue
 		}
@@ -204,7 +204,7 @@
 			err = nil
 		}
 		if err != nil {
-			log.Infof("conn{%#v}.Read() = {length:%d, err:%+v}", conn, length, err)
+			log.Infof("conn{%#v}.Read() = {length:%d, err:%+v}", conn, length, perrors.WithStack(err))
 			conn.Close()
 			<-wheel.After(connectInterval)
 			continue
@@ -229,7 +229,7 @@
 			return nil
 		}
 		conn, _, err = dialer.Dial(c.addr, nil)
-		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, err)
+		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, perrors.WithStack(err))
 		if err == nil && gxnet.IsSameAddr(conn.RemoteAddr(), conn.LocalAddr()) {
 			conn.Close()
 			err = errSelfConnect
@@ -243,7 +243,7 @@
 			return ss
 		}
 
-		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, err)
+		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, perrors.WithStack(err))
 		<-wheel.After(connectInterval)
 	}
 }
@@ -269,7 +269,7 @@
 	if c.cert != "" {
 		certPEMBlock, err := ioutil.ReadFile(c.cert)
 		if err != nil {
-			panic(fmt.Sprintf("ioutil.ReadFile(cert:%s) = error:%+v", c.cert, err))
+			panic(fmt.Sprintf("ioutil.ReadFile(cert:%s) = error:%+v", c.cert, perrors.WithStack(err)))
 		}
 
 		var cert tls.Certificate
@@ -291,7 +291,7 @@
 	for _, c := range config.Certificates {
 		roots, err = x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
 		if err != nil {
-			panic(fmt.Sprintf("error parsing server's root cert: %+v\n", err))
+			panic(fmt.Sprintf("error parsing server's root cert: %+v\n", perrors.WithStack(err)))
 		}
 		for _, root = range roots {
 			certPool.AddCert(root)
@@ -321,7 +321,7 @@
 			return ss
 		}
 
-		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, err)
+		log.Infof("websocket.dialer.Dial(addr:%s) = error:%+v", c.addr, perrors.WithStack(err))
 		<-wheel.After(connectInterval)
 	}
 }
@@ -387,7 +387,7 @@
 	}
 }
 
-// there are two methods to keep connection pool. the first approch is like
+// there are two methods to keep connection pool. the first approach is like
 // redigo's lazy connection pool(https://github.com/gomodule/redigo/blob/master/redis/pool.go:),
 // in which you should apply testOnBorrow to check alive of the connection.
 // the second way is as follows. @RunEventLoop detects the aliveness of the connection
@@ -405,13 +405,11 @@
 func (c *client) reConnect() {
 	var num, max, times, interval int
 
-	// c.Lock()
 	max = c.number
 	interval = c.reconnectInterval
 	if interval == 0 {
 		interval = reconnectInterval
 	}
-	// c.Unlock()
 	for {
 		if c.IsClosed() {
 			log.Warnf("client{peer:%s} goroutine exit now.", c.addr)
diff --git a/client_test.go b/client_test.go
index 5ca93f2..f2407a8 100644
--- a/client_test.go
+++ b/client_test.go
@@ -276,6 +276,8 @@
 	beforeWritePkgNum := atomic.LoadUint32(&conn.writePkgNum)
 	err = ss.WriteBytes([]byte("hello"))
 	assert.Equal(t, beforeWritePkgNum+1, atomic.LoadUint32(&conn.writePkgNum))
+	err = ss.WriteBytesArray([]byte("hello"), []byte("hello"))
+	assert.Equal(t, beforeWritePkgNum+3, atomic.LoadUint32(&conn.writePkgNum))
 	err = conn.writePing()
 	assert.Nil(t, err)
 
diff --git a/go.mod b/go.mod
index ffeecdb..be1c736 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,7 @@
 module github.com/dubbogo/getty
 
 require (
-	github.com/dubbogo/gost v1.5.2
+	github.com/dubbogo/gost v1.9.0
 	github.com/golang/snappy v0.0.1
 	github.com/gorilla/websocket v1.4.0
 	github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9
diff --git a/go.sum b/go.sum
index d0e532e..c6fe58c 100644
--- a/go.sum
+++ b/go.sum
@@ -2,6 +2,8 @@
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dubbogo/gost v1.5.2 h1:ri/03971hdpnn3QeCU+4UZgnRNGDXLDGDucR/iozZm8=
 github.com/dubbogo/gost v1.5.2/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8=
+github.com/dubbogo/gost v1.9.0 h1:UT+dWwvLyJiDotxJERO75jB3Yxgsdy10KztR5ycxRAk=
+github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
diff --git a/server.go b/server.go
index cb0238a..98d3472 100644
--- a/server.go
+++ b/server.go
@@ -17,6 +17,7 @@
 	"io/ioutil"
 	"net"
 	"net/http"
+	"strings"
 	"sync"
 	"sync/atomic"
 	"time"
@@ -67,10 +68,6 @@
 
 	s.init(opts...)
 
-	if s.addr == "" {
-		panic(fmt.Sprintf("@addr:%s", s.addr))
-	}
-
 	return s
 }
 
@@ -163,9 +160,16 @@
 		streamListener net.Listener
 	)
 
-	streamListener, err = net.Listen("tcp", s.addr)
-	if err != nil {
-		return perrors.Wrapf(err, "net.Listen(tcp, addr:%s))", s.addr)
+	if len(s.addr) == 0 || !strings.Contains(s.addr, ":") {
+		streamListener, err = gxnet.ListenOnTCPRandomPort(s.addr)
+		if err != nil {
+			return perrors.Wrapf(err, "gxnet.ListenOnTCPRandomPort(addr:%s)", s.addr)
+		}
+	} else {
+		streamListener, err = net.Listen("tcp", s.addr)
+		if err != nil {
+			return perrors.Wrapf(err, "net.Listen(tcp, addr:%s)", s.addr)
+		}
 	}
 
 	s.streamListener = streamListener
@@ -180,13 +184,20 @@
 		pktListener *net.UDPConn
 	)
 
-	localAddr, err = net.ResolveUDPAddr("udp", s.addr)
-	if err != nil {
-		return perrors.Wrapf(err, "net.ResolveUDPAddr(udp, addr:%s)", s.addr)
-	}
-	pktListener, err = net.ListenUDP("udp", localAddr)
-	if err != nil {
-		return perrors.Wrapf(err, "net.ListenUDP((udp, localAddr:%#v)", localAddr)
+	if len(s.addr) == 0 || !strings.Contains(s.addr, ":") {
+		pktListener, err = gxnet.ListenOnUDPRandomPort(s.addr)
+		if err != nil {
+			return perrors.Wrapf(err, "gxnet.ListenOnUDPRandomPort(addr:%s)", s.addr)
+		}
+	} else {
+		localAddr, err = net.ResolveUDPAddr("udp", s.addr)
+		if err != nil {
+			return perrors.Wrapf(err, "net.ResolveUDPAddr(udp, addr:%s)", s.addr)
+		}
+		pktListener, err = net.ListenUDP("udp", localAddr)
+		if err != nil {
+			return perrors.Wrapf(err, "net.ListenUDP((udp, localAddr:%#v)", localAddr)
+		}
 	}
 
 	s.pktListener = pktListener
@@ -213,7 +224,7 @@
 	}
 	if gxnet.IsSameAddr(conn.RemoteAddr(), conn.LocalAddr()) {
 		log.Warnf("conn.localAddr{%s} == conn.RemoteAddr", conn.LocalAddr().String(), conn.RemoteAddr().String())
-		return nil, errSelfConnect
+		return nil, perrors.WithStack(errSelfConnect)
 	}
 
 	ss := newTCPSession(conn, s)
@@ -237,7 +248,7 @@
 		)
 		for {
 			if s.IsClosed() {
-				log.Warnf("server{%s} stop acceptting client connect request.", s.addr)
+				log.Warnf("server{%s} stop accepting client connect request.", s.addr)
 				return
 			}
 			if delay != 0 {
@@ -256,7 +267,7 @@
 					}
 					continue
 				}
-				log.Warnf("server{%s}.Accept() = err {%+v}", s.addr, err)
+				log.Warnf("server{%s}.Accept() = err {%+v}", s.addr, perrors.WithStack(err))
 				continue
 			}
 			delay = 0
@@ -357,8 +368,7 @@
 		s.lock.Unlock()
 		err = server.Serve(s.streamListener)
 		if err != nil {
-			log.Errorf("http.server.Serve(addr{%s}) = err{%+v}", s.addr, err)
-			// panic(err)
+			log.Errorf("http.server.Serve(addr{%s}) = err:%+v", s.addr, perrors.WithStack(err))
 		}
 	}()
 }
@@ -380,8 +390,8 @@
 		defer s.wg.Done()
 
 		if certificate, err = tls.LoadX509KeyPair(s.cert, s.privateKey); err != nil {
-			panic(fmt.Sprintf("tls.LoadX509KeyPair(cert{%s}, privateKey{%s}) = err{%+v}",
-				s.cert, s.privateKey, err))
+			panic(fmt.Sprintf("tls.LoadX509KeyPair(cert{%s}, privateKey{%s}) = err:%+v",
+				s.cert, s.privateKey, perrors.WithStack(err)))
 			return
 		}
 		config = &tls.Config{
@@ -394,7 +404,7 @@
 		if s.caCert != "" {
 			certPem, err = ioutil.ReadFile(s.caCert)
 			if err != nil {
-				panic(fmt.Errorf("ioutil.ReadFile(certFile{%s}) = err{%+v}", s.caCert, err))
+				panic(fmt.Errorf("ioutil.ReadFile(certFile{%s}) = err:%+v", s.caCert, perrors.WithStack(err)))
 			}
 			certPool = x509.NewCertPool()
 			if ok := certPool.AppendCertsFromPEM(certPem); !ok {
@@ -419,7 +429,7 @@
 		s.lock.Unlock()
 		err = server.Serve(tls.NewListener(s.streamListener, config))
 		if err != nil {
-			log.Errorf("http.server.Serve(addr{%s}) = err{%+v}", s.addr, err)
+			log.Errorf("http.server.Serve(addr{%s}) = err:%+v", s.addr, perrors.WithStack(err))
 			panic(err)
 		}
 	}()
@@ -429,7 +439,7 @@
 // @newSession: new connection callback
 func (s *server) RunEventLoop(newSession NewSessionCallback) {
 	if err := s.listen(); err != nil {
-		panic(fmt.Errorf("server.listen() = error:%+v", err))
+		panic(fmt.Errorf("server.listen() = error:%+v", perrors.WithStack(err)))
 	}
 
 	switch s.endPointType {
diff --git a/server_test.go b/server_test.go
index 8d9a3bb..5643380 100644
--- a/server_test.go
+++ b/server_test.go
@@ -9,16 +9,16 @@
 	"github.com/stretchr/testify/assert"
 )
 
-func TestTCPServer(t *testing.T) {
+func testTCPServer(t *testing.T, address string) {
 	var (
 		server           *server
 		serverMsgHandler MessageHandler
 	)
-	addr := "127.0.0.1:0"
+
 	func() {
 		server = newServer(
 			TCP_SERVER,
-			WithLocalAddress(addr),
+			WithLocalAddress(address),
 		)
 		newServerSession := func(session Session) error {
 			return newSessionCallback(session, &serverMsgHandler)
@@ -26,11 +26,12 @@
 		server.RunEventLoop(newServerSession)
 		assert.True(t, server.ID() > 0)
 		assert.True(t, server.EndPointType() == TCP_SERVER)
+		assert.NotNil(t, server.streamListener)
 	}()
 	time.Sleep(500e6)
 
-	addr = server.streamListener.Addr().String()
-	t.Logf("server addr: %v", addr)
+	addr := server.streamListener.Addr().String()
+	t.Logf("@address:%s, tcp server addr: %v", address, addr)
 	clt := newClient(TCP_CLIENT,
 		WithServerAddress(addr),
 		WithReconnectInterval(5e8),
@@ -58,16 +59,15 @@
 	assert.True(t, server.IsClosed())
 }
 
-func TestUDPServer(t *testing.T) {
+func testUDPServer(t *testing.T, address string) {
 	var (
 		server           *server
 		serverMsgHandler MessageHandler
 	)
-	addr := "127.0.0.1:0"
 	func() {
 		server = newServer(
 			UDP_ENDPOINT,
-			WithLocalAddress(addr),
+			WithLocalAddress(address),
 		)
 		newServerSession := func(session Session) error {
 			return newSessionCallback(session, &serverMsgHandler)
@@ -75,34 +75,25 @@
 		server.RunEventLoop(newServerSession)
 		assert.True(t, server.ID() > 0)
 		assert.True(t, server.EndPointType() == UDP_ENDPOINT)
+		assert.NotNil(t, server.pktListener)
 	}()
 	time.Sleep(500e6)
 
-	//addr = server.streamListener.Addr().String()
-	//t.Logf("server addr: %v", addr)
-	//clt := newClient(TCP_CLIENT,
-	//	WithServerAddress(addr),
-	//	WithReconnectInterval(5e8),
-	//	WithConnectionNumber(1),
-	//)
-	//assert.NotNil(t, clt)
-	//assert.True(t, clt.ID() > 0)
-	//assert.Equal(t, clt.endPointType, TCP_CLIENT)
-	//
-	//var (
-	//	msgHandler MessageHandler
-	//)
-	//cb := func(session Session) error {
-	//	return newSessionCallback(session, &msgHandler)
-	//}
-	//
-	//clt.RunEventLoop(cb)
-	//time.Sleep(1e9)
-	//
-	//assert.Equal(t, 1, msgHandler.SessionNumber())
-	//clt.Close()
-	//assert.True(t, clt.IsClosed())
-	//
-	//server.Close()
-	//assert.True(t, server.IsClosed())
+	addr := server.pktListener.LocalAddr().String()
+	t.Logf("@address:%s, udp server addr: %v", address, addr)
+}
+
+func TestServer(t *testing.T) {
+	var addr string
+
+	testTCPServer(t, addr)
+	testUDPServer(t, addr)
+
+	addr = "127.0.0.1:0"
+	testTCPServer(t, addr)
+	testUDPServer(t, addr)
+
+	addr = "127.0.0.1"
+	testTCPServer(t, addr)
+	testUDPServer(t, addr)
 }
diff --git a/session.go b/session.go
index 5e9dc3f..c3190e7 100644
--- a/session.go
+++ b/session.go
@@ -12,6 +12,7 @@
 import (
 	"bytes"
 	"fmt"
+	jerrors "github.com/juju/errors"
 	"io"
 	"net"
 	"runtime"
@@ -387,7 +388,7 @@
 	if timeout <= 0 {
 		pkgBytes, err := s.writer.Write(s, pkg)
 		if err != nil {
-			log.Warnf("%s, [session.WritePkg] session.writer.Write(@pkg:%#v) = error:%v", s.Stat(), pkg, err)
+			log.Warnf("%s, [session.WritePkg] session.writer.Write(@pkg:%#v) = error:%+v", s.Stat(), pkg, err)
 			return perrors.WithStack(err)
 		}
 		var udpCtxPtr *UDPContext
@@ -404,7 +405,7 @@
 		}
 		_, err = s.Connection.send(pkg)
 		if err != nil {
-			log.Warnf("%s, [session.WritePkg] @s.Connection.Write(pkg:%#v) = err:%v", s.Stat(), pkg, err)
+			log.Warnf("%s, [session.WritePkg] @s.Connection.Write(pkg:%#v) = err:%+v", s.Stat(), pkg, err)
 			return perrors.WithStack(err)
 		}
 		return nil
@@ -445,10 +446,47 @@
 		return s.WriteBytes(pkgs[0])
 	}
 
-	// TODO Currently, only TCP is supported.
-	if _, err := s.Connection.send(pkgs); err != nil {
-		return perrors.Wrapf(err, "s.Connection.Write(pkgs num:%d)", len(pkgs))
+	// reduce syscall and memcopy for multiple packages
+	if _, ok := s.Connection.(*gettyTCPConn); ok {
+		if _, err := s.Connection.send(pkgs); err != nil {
+			return perrors.Wrapf(err, "s.Connection.Write(pkgs num:%d)", len(pkgs))
+		}
 	}
+
+	// get len
+	var (
+		l      int
+		err    error
+		length int
+		arrp   *[]byte
+		arr    []byte
+	)
+	length = 0
+	for i := 0; i < len(pkgs); i++ {
+		length += len(pkgs[i])
+	}
+
+	// merge the pkgs
+	//arr = make([]byte, length)
+	arrp = gxbytes.AcquireBytes(length)
+	defer gxbytes.ReleaseBytes(arrp)
+	arr = *arrp
+
+	l = 0
+	for i := 0; i < len(pkgs); i++ {
+		copy(arr[l:], pkgs[i])
+		l += len(pkgs[i])
+	}
+
+	if err = s.WriteBytes(arr); err != nil {
+		return jerrors.Trace(err)
+	}
+
+	num := len(pkgs) - 1
+	for i := 0; i < num; i++ {
+		s.incWritePkgNum()
+	}
+
 	return nil
 }
 
@@ -554,7 +592,7 @@
 			for idx := 0; idx < maxIovecNum; idx++ {
 				pkgBytes, err = s.writer.Write(s, outPkg)
 				if err != nil {
-					log.Errorf("%s, [session.handleLoop] = error:%+v", s.sessionToken(), err)
+					log.Errorf("%s, [session.handleLoop] = error:%+v", s.sessionToken(), jerrors.ErrorStack(err))
 					s.stop()
 					// break LOOP
 					flag = false
@@ -582,7 +620,7 @@
 			err = s.WriteBytesArray(iovec[:]...)
 			if err != nil {
 				log.Errorf("%s, [session.handleLoop]s.WriteBytesArray(iovec len:%d) = error:%+v",
-					s.sessionToken(), len(iovec), err)
+					s.sessionToken(), len(iovec), jerrors.ErrorStack(err))
 				s.stop()
 				// break LOOP
 				flag = false
@@ -593,7 +631,7 @@
 				if wsFlag {
 					err := wsConn.writePing()
 					if err != nil {
-						log.Warnf("wsConn.writePing() = error{%s}", err)
+						log.Warnf("wsConn.writePing() = error:%+v", perrors.WithStack(err))
 					}
 				}
 				s.listener.OnCron(s)
@@ -632,7 +670,7 @@
 		log.Infof("%s, [session.handlePackage] gr will exit now, left gr num %d", s.sessionToken(), grNum)
 		s.stop()
 		if err != nil {
-			log.Errorf("%s, [session.handlePackage] error:%+v", s.sessionToken(), err)
+			log.Errorf("%s, [session.handlePackage] error:%+v", s.sessionToken(), perrors.WithStack(err))
 			if s != nil || s.listener != nil {
 				s.listener.OnError(s, err)
 			}
@@ -703,12 +741,12 @@
 					break
 				}
 				if perrors.Cause(err) == io.EOF {
-					log.Infof("%s, [session.conn.read] = error:%+v", s.sessionToken(), err)
+					log.Infof("%s, [session.conn.read] = error:%+v", s.sessionToken(), perrors.WithStack(err))
 					err = nil
 					exit = true
 					break
 				}
-				log.Errorf("%s, [session.conn.read] = error:%+v", s.sessionToken(), err)
+				log.Errorf("%s, [session.conn.read] = error:%+v", s.sessionToken(), perrors.WithStack(err))
 				exit = true
 			}
 			break
@@ -784,7 +822,7 @@
 		}
 
 		bufLen, addr, err = conn.recv(buf)
-		log.Debugf("conn.read() = bufLen:%d, addr:%#v, err:%+v", bufLen, addr, err)
+		log.Debugf("conn.read() = bufLen:%d, addr:%#v, err:%+v", bufLen, addr, perrors.WithStack(err))
 		if netError, ok = perrors.Cause(err).(net.Error); ok && netError.Timeout() {
 			continue
 		}
@@ -796,7 +834,7 @@
 		}
 
 		if bufLen == 0 {
-			log.Errorf("conn.read() = bufLen:%d, addr:%s, err:%+v", bufLen, addr, err)
+			log.Errorf("conn.read() = bufLen:%d, addr:%s, err:%+v", bufLen, addr, perrors.WithStack(err))
 			continue
 		}
 
@@ -806,17 +844,17 @@
 		}
 
 		pkg, pkgLen, err = s.reader.Read(s, buf[:bufLen])
-		log.Debugf("s.reader.Read() = pkg:%#v, pkgLen:%d, err:%+v", pkg, pkgLen, err)
+		log.Debugf("s.reader.Read() = pkg:%#v, pkgLen:%d, err:%+v", pkg, pkgLen, perrors.WithStack(err))
 		if err == nil && s.maxMsgLen > 0 && bufLen > int(s.maxMsgLen) {
 			err = perrors.Errorf("Message Too Long, bufLen %d, session max message len %d", bufLen, s.maxMsgLen)
 		}
 		if err != nil {
-			log.Warnf("%s, [session.handleUDPPackage] = len{%d}, error:%+v",
-				s.sessionToken(), pkgLen, err)
+			log.Warnf("%s, [session.handleUDPPackage] = len:%d, error:%+v",
+				s.sessionToken(), pkgLen, perrors.WithStack(err))
 			continue
 		}
 		if pkgLen == 0 {
-			log.Errorf("s.reader.Read() = pkg:%#v, pkgLen:%d, err:%+v", pkg, pkgLen, err)
+			log.Errorf("s.reader.Read() = pkg:%#v, pkgLen:%d, err:%+v", pkg, pkgLen, perrors.WithStack(err))
 			continue
 		}
 
@@ -849,7 +887,7 @@
 			continue
 		}
 		if err != nil {
-			log.Warnf("%s, [session.handleWSPackage] = error{%+s}",
+			log.Warnf("%s, [session.handleWSPackage] = error:%+v",
 				s.sessionToken(), perrors.WithStack(err))
 			return perrors.WithStack(err)
 		}
@@ -860,8 +898,8 @@
 				err = perrors.Errorf("Message Too Long, length %d, session max message len %d", length, s.maxMsgLen)
 			}
 			if err != nil {
-				log.Warnf("%s, [session.handleWSPackage] = len{%d}, error:%+v",
-					s.sessionToken(), length, err)
+				log.Warnf("%s, [session.handleWSPackage] = len:%d, error:%+v",
+					s.sessionToken(), length, perrors.WithStack(err))
 				continue
 			}
 
