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  }