add debug info in logs
diff --git a/data/data.go b/data/data.go
index b6d9cbd..afb469a 100644
--- a/data/data.go
+++ b/data/data.go
@@ -3,13 +3,14 @@
 import (
 	"database/sql"
 	"fmt"
+	"os"
+	"path"
+	"runtime"
+	"sync"
+
 	"github.com/30x/apid-core"
 	"github.com/30x/apid-core/data/wrap"
 	"github.com/mattn/go-sqlite3"
-	"os"
-	"path"
-	"sync"
-	"runtime"
 )
 
 const (
@@ -119,19 +120,19 @@
 	}
 
 	log.Infof("LoadDB: %s", dataPath)
-	dataSource := fmt.Sprintf(config.GetString(configDataSourceKey), dataPath)
+	source := fmt.Sprintf(config.GetString(configDataSourceKey), dataPath)
 
 	wrappedDriverName := "dd:" + config.GetString(configDataDriverKey)
-	dataDriver := wrap.WrapDriver{&sqlite3.SQLiteDriver{}, dbTraceLog}
+	driver := wrap.NewDriver(&sqlite3.SQLiteDriver{}, dbTraceLog)
 	func() {
 		// just ignore the "registered twice" panic
 		defer func() {
 			recover()
 		}()
-		sql.Register(wrappedDriverName, &dataDriver)
+		sql.Register(wrappedDriverName, driver)
 	}()
 
-	db, err = sql.Open(wrappedDriverName, dataSource)
+	db, err = sql.Open(wrappedDriverName, source)
 	if err != nil {
 		log.Errorf("error loading db: %s", err)
 		return
@@ -184,4 +185,4 @@
 	storagePath := config.GetString("local_storage_path")
 	relativeDataPath := config.GetString(configDataPathKey)
 	return path.Join(storagePath, relativeDataPath, id, "sqlite3")
-}
\ No newline at end of file
+}
diff --git a/data/wrap/connection.go b/data/wrap/connection.go
index bd865b3..d643a88 100644
--- a/data/wrap/connection.go
+++ b/data/wrap/connection.go
@@ -1,14 +1,19 @@
 package wrap
 
 import (
+	"database/sql/driver"
+
+	"sync/atomic"
+
 	"github.com/30x/apid-core"
 	"github.com/mattn/go-sqlite3"
-	"database/sql/driver"
 )
 
 type wrapConn struct {
 	*sqlite3.SQLiteConn
-	log apid.LogService
+	log         apid.LogService
+	stmtCounter int64
+	txCounter   int64
 }
 
 func (c *wrapConn) Swap(cc *sqlite3.SQLiteConn) {
@@ -16,42 +21,46 @@
 }
 
 func (c *wrapConn) Prepare(query string) (driver.Stmt, error) {
-	c.log.Debugf("begin prepare stmt: %s", query)
+	stmtID := atomic.AddInt64(&c.stmtCounter, 1)
+	log := c.log.WithField("stmt", stmtID)
+	log.Debugf("begin prepare stmt: %s", query)
 
 	stmt, err := c.SQLiteConn.Prepare(query)
 	if err != nil {
-		c.log.Errorf("prepare stmt failed: %s", err)
+		log.Errorf("prepare stmt failed: %s", err)
 		return nil, err
 	}
 
-	c.log.Debug("end prepare stmt")
+	log.Debug("end prepare stmt")
 	s := stmt.(*sqlite3.SQLiteStmt)
-	return &wrapStmt{s, c.log}, nil
+	return &wrapStmt{s, log}, nil
 }
 
 func (c *wrapConn) Begin() (driver.Tx, error) {
-	c.log.Debug("begin trans")
+	txID := atomic.AddInt64(&c.txCounter, 1)
+	log := c.log.WithField("tx", txID)
+	log.Debug("begin trans %d", txID)
 
 	tx, err := c.SQLiteConn.Begin()
 	if err != nil {
-		c.log.Errorf("begin trans failed: %s", err)
+		log.Errorf("begin trans failed: %s", err)
 		return nil, err
 	}
 
-	c.log.Debug("end begin trans")
+	log.Debug("end begin trans")
 	t := tx.(*sqlite3.SQLiteTx)
-	return &wrapTx{t, c.log}, nil
+	return &wrapTx{t, log}, nil
 }
 
 func (c *wrapConn) Close() (err error) {
-	c.log.Debug("begin close")
+	c.log.Debug("begin close conn")
 
 	if err = c.SQLiteConn.Close(); err != nil {
-		c.log.Errorf("close failed: %s", err)
+		c.log.Errorf("close conn failed: %s", err)
 		return
 	}
 
-	c.log.Debug("end close")
+	c.log.Debug("end close conn")
 	return
 }
 
diff --git a/data/wrap/driver.go b/data/wrap/driver.go
index 62a799a..686eb13 100644
--- a/data/wrap/driver.go
+++ b/data/wrap/driver.go
@@ -3,23 +3,35 @@
 import (
 	"database/sql/driver"
 	"strings"
+
+	"sync/atomic"
+
 	"github.com/30x/apid-core"
 	"github.com/mattn/go-sqlite3"
 )
 
-type WrapDriver struct {
-	driver.Driver
-	Log apid.LogService
+func NewDriver(d driver.Driver, log apid.LogService) driver.Driver {
+	return wrapDriver{d, log, 0}
 }
 
-func (d WrapDriver) Open(dsn string) (driver.Conn, error) {
+type wrapDriver struct {
+	driver.Driver
+	log     apid.LogService
+	counter int64
+}
+
+func (d wrapDriver) Open(dsn string) (driver.Conn, error) {
+	connId := atomic.AddInt64(&d.counter, 1)
+	log := d.log.WithField("conn", connId)
+	log.Debug("begin open conn")
 
 	internalDSN := strings.TrimPrefix(dsn, "dd:")
 	internalCon, err := d.Driver.Open(internalDSN)
 	if err != nil {
+		log.Errorf("open conn failed: %v", err)
 		return nil, err
 	}
 
 	c := internalCon.(*sqlite3.SQLiteConn)
-	return &wrapConn{c, d.Log}, nil
+	return &wrapConn{c, log, 0, 0}, nil
 }