github.com/astaxie/beego@v1.12.3/orm/orm_log.go (about) 1 // Copyright 2014 beego Author. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package orm 16 17 import ( 18 "context" 19 "database/sql" 20 "fmt" 21 "io" 22 "log" 23 "strings" 24 "time" 25 ) 26 27 // Log implement the log.Logger 28 type Log struct { 29 *log.Logger 30 } 31 32 //costomer log func 33 var LogFunc func(query map[string]interface{}) 34 35 // NewLog set io.Writer to create a Logger. 36 func NewLog(out io.Writer) *Log { 37 d := new(Log) 38 d.Logger = log.New(out, "[ORM]", log.LstdFlags) 39 return d 40 } 41 42 func debugLogQueies(alias *alias, operaton, query string, t time.Time, err error, args ...interface{}) { 43 var logMap = make(map[string]interface{}) 44 sub := time.Now().Sub(t) / 1e5 45 elsp := float64(int(sub)) / 10.0 46 logMap["cost_time"] = elsp 47 flag := " OK" 48 if err != nil { 49 flag = "FAIL" 50 } 51 logMap["flag"] = flag 52 con := fmt.Sprintf(" -[Queries/%s] - [%s / %11s / %7.1fms] - [%s]", alias.Name, flag, operaton, elsp, query) 53 cons := make([]string, 0, len(args)) 54 for _, arg := range args { 55 cons = append(cons, fmt.Sprintf("%v", arg)) 56 } 57 if len(cons) > 0 { 58 con += fmt.Sprintf(" - `%s`", strings.Join(cons, "`, `")) 59 } 60 if err != nil { 61 con += " - " + err.Error() 62 } 63 logMap["sql"] = fmt.Sprintf("%s-`%s`", query, strings.Join(cons, "`, `")) 64 if LogFunc != nil { 65 LogFunc(logMap) 66 } 67 DebugLog.Println(con) 68 } 69 70 // statement query logger struct. 71 // if dev mode, use stmtQueryLog, or use stmtQuerier. 72 type stmtQueryLog struct { 73 alias *alias 74 query string 75 stmt stmtQuerier 76 } 77 78 var _ stmtQuerier = new(stmtQueryLog) 79 80 func (d *stmtQueryLog) Close() error { 81 a := time.Now() 82 err := d.stmt.Close() 83 debugLogQueies(d.alias, "st.Close", d.query, a, err) 84 return err 85 } 86 87 func (d *stmtQueryLog) Exec(args ...interface{}) (sql.Result, error) { 88 a := time.Now() 89 res, err := d.stmt.Exec(args...) 90 debugLogQueies(d.alias, "st.Exec", d.query, a, err, args...) 91 return res, err 92 } 93 94 func (d *stmtQueryLog) Query(args ...interface{}) (*sql.Rows, error) { 95 a := time.Now() 96 res, err := d.stmt.Query(args...) 97 debugLogQueies(d.alias, "st.Query", d.query, a, err, args...) 98 return res, err 99 } 100 101 func (d *stmtQueryLog) QueryRow(args ...interface{}) *sql.Row { 102 a := time.Now() 103 res := d.stmt.QueryRow(args...) 104 debugLogQueies(d.alias, "st.QueryRow", d.query, a, nil, args...) 105 return res 106 } 107 108 func newStmtQueryLog(alias *alias, stmt stmtQuerier, query string) stmtQuerier { 109 d := new(stmtQueryLog) 110 d.stmt = stmt 111 d.alias = alias 112 d.query = query 113 return d 114 } 115 116 // database query logger struct. 117 // if dev mode, use dbQueryLog, or use dbQuerier. 118 type dbQueryLog struct { 119 alias *alias 120 db dbQuerier 121 tx txer 122 txe txEnder 123 } 124 125 var _ dbQuerier = new(dbQueryLog) 126 var _ txer = new(dbQueryLog) 127 var _ txEnder = new(dbQueryLog) 128 129 func (d *dbQueryLog) Prepare(query string) (*sql.Stmt, error) { 130 a := time.Now() 131 stmt, err := d.db.Prepare(query) 132 debugLogQueies(d.alias, "db.Prepare", query, a, err) 133 return stmt, err 134 } 135 136 func (d *dbQueryLog) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) { 137 a := time.Now() 138 stmt, err := d.db.PrepareContext(ctx, query) 139 debugLogQueies(d.alias, "db.Prepare", query, a, err) 140 return stmt, err 141 } 142 143 func (d *dbQueryLog) Exec(query string, args ...interface{}) (sql.Result, error) { 144 a := time.Now() 145 res, err := d.db.Exec(query, args...) 146 debugLogQueies(d.alias, "db.Exec", query, a, err, args...) 147 return res, err 148 } 149 150 func (d *dbQueryLog) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { 151 a := time.Now() 152 res, err := d.db.ExecContext(ctx, query, args...) 153 debugLogQueies(d.alias, "db.Exec", query, a, err, args...) 154 return res, err 155 } 156 157 func (d *dbQueryLog) Query(query string, args ...interface{}) (*sql.Rows, error) { 158 a := time.Now() 159 res, err := d.db.Query(query, args...) 160 debugLogQueies(d.alias, "db.Query", query, a, err, args...) 161 return res, err 162 } 163 164 func (d *dbQueryLog) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) { 165 a := time.Now() 166 res, err := d.db.QueryContext(ctx, query, args...) 167 debugLogQueies(d.alias, "db.Query", query, a, err, args...) 168 return res, err 169 } 170 171 func (d *dbQueryLog) QueryRow(query string, args ...interface{}) *sql.Row { 172 a := time.Now() 173 res := d.db.QueryRow(query, args...) 174 debugLogQueies(d.alias, "db.QueryRow", query, a, nil, args...) 175 return res 176 } 177 178 func (d *dbQueryLog) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row { 179 a := time.Now() 180 res := d.db.QueryRowContext(ctx, query, args...) 181 debugLogQueies(d.alias, "db.QueryRow", query, a, nil, args...) 182 return res 183 } 184 185 func (d *dbQueryLog) Begin() (*sql.Tx, error) { 186 a := time.Now() 187 tx, err := d.db.(txer).Begin() 188 debugLogQueies(d.alias, "db.Begin", "START TRANSACTION", a, err) 189 return tx, err 190 } 191 192 func (d *dbQueryLog) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) { 193 a := time.Now() 194 tx, err := d.db.(txer).BeginTx(ctx, opts) 195 debugLogQueies(d.alias, "db.BeginTx", "START TRANSACTION", a, err) 196 return tx, err 197 } 198 199 func (d *dbQueryLog) Commit() error { 200 a := time.Now() 201 err := d.db.(txEnder).Commit() 202 debugLogQueies(d.alias, "tx.Commit", "COMMIT", a, err) 203 return err 204 } 205 206 func (d *dbQueryLog) Rollback() error { 207 a := time.Now() 208 err := d.db.(txEnder).Rollback() 209 debugLogQueies(d.alias, "tx.Rollback", "ROLLBACK", a, err) 210 return err 211 } 212 213 func (d *dbQueryLog) SetDB(db dbQuerier) { 214 d.db = db 215 } 216 217 func newDbQueryLog(alias *alias, db dbQuerier) dbQuerier { 218 d := new(dbQueryLog) 219 d.alias = alias 220 d.db = db 221 return d 222 }