ze.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "context"
  8. "database/sql/driver"
  9. "reflect"
  10. "strconv"
  11. "time"
  12. "gitee.com/chunanyong/dm/util"
  13. )
  14. type logFilter struct{}
  15. func (filter *logFilter) DmDriverOpen(filterChain *filterChain, d *DmDriver, dsn string) (ret *DmConnection, err error) {
  16. var logRecord = d.logInfo.logRecord
  17. logRecord.Set(d, "open", dsn)
  18. defer func() {
  19. filter.doLog(logRecord)
  20. }()
  21. ret, err = filterChain.DmDriverOpen(d, dsn)
  22. if err != nil {
  23. logRecord.SetError(err)
  24. return
  25. }
  26. logRecord.SetReturnValue(ret)
  27. return
  28. }
  29. func (filter *logFilter) DmDriverOpenConnector(filterChain *filterChain, d *DmDriver, dsn string) (ret *DmConnector, err error) {
  30. var logRecord = d.logInfo.logRecord
  31. logRecord.Set(d, "openConnector", dsn)
  32. defer func() {
  33. filter.doLog(logRecord)
  34. }()
  35. ret, err = filterChain.DmDriverOpenConnector(d, dsn)
  36. if err != nil {
  37. logRecord.SetError(err)
  38. return
  39. }
  40. logRecord.SetReturnValue(ret)
  41. return
  42. }
  43. func (filter *logFilter) DmConnectorConnect(filterChain *filterChain, c *DmConnector, ctx context.Context) (ret *DmConnection, err error) {
  44. var logRecord = c.logInfo.logRecord
  45. logRecord.Set(c, "connect")
  46. defer func() {
  47. filter.doLog(logRecord)
  48. }()
  49. ret, err = filterChain.DmConnectorConnect(c, ctx)
  50. if err != nil {
  51. logRecord.SetError(err)
  52. return
  53. }
  54. logRecord.SetReturnValue(ret)
  55. return
  56. }
  57. func (filter *logFilter) DmConnectorDriver(filterChain *filterChain, c *DmConnector) (ret *DmDriver) {
  58. var logRecord = c.logInfo.logRecord
  59. logRecord.Set(c, "driver")
  60. defer func() {
  61. filter.doLog(logRecord)
  62. }()
  63. ret = filterChain.DmConnectorDriver(c)
  64. logRecord.SetReturnValue(ret)
  65. return
  66. }
  67. func (filter *logFilter) DmConnectionBegin(filterChain *filterChain, c *DmConnection) (ret *DmConnection, err error) {
  68. var logRecord = c.logInfo.logRecord
  69. logRecord.Set(c, "begin")
  70. defer func() {
  71. filter.doLog(logRecord)
  72. }()
  73. ret, err = filterChain.DmConnectionBegin(c)
  74. if err != nil {
  75. logRecord.SetError(err)
  76. return
  77. }
  78. logRecord.SetReturnValue(ret)
  79. return
  80. }
  81. func (filter *logFilter) DmConnectionBeginTx(filterChain *filterChain, c *DmConnection, ctx context.Context, opts driver.TxOptions) (ret *DmConnection, err error) {
  82. var logRecord = c.logInfo.logRecord
  83. logRecord.Set(c, "beginTx", opts)
  84. defer func() {
  85. filter.doLog(logRecord)
  86. }()
  87. ret, err = filterChain.DmConnectionBeginTx(c, ctx, opts)
  88. if err != nil {
  89. logRecord.SetError(err)
  90. return
  91. }
  92. logRecord.SetReturnValue(ret)
  93. return
  94. }
  95. func (filter *logFilter) DmConnectionCommit(filterChain *filterChain, c *DmConnection) (err error) {
  96. var logRecord = c.logInfo.logRecord
  97. logRecord.Set(c, "commit")
  98. defer func() {
  99. filter.doLog(logRecord)
  100. }()
  101. err = filterChain.DmConnectionCommit(c)
  102. if err != nil {
  103. logRecord.SetError(err)
  104. return
  105. }
  106. return
  107. }
  108. func (filter *logFilter) DmConnectionRollback(filterChain *filterChain, c *DmConnection) (err error) {
  109. var logRecord = c.logInfo.logRecord
  110. logRecord.Set(c, "rollback")
  111. defer func() {
  112. filter.doLog(logRecord)
  113. }()
  114. err = filterChain.DmConnectionRollback(c)
  115. if err != nil {
  116. logRecord.SetError(err)
  117. return
  118. }
  119. return
  120. }
  121. func (filter *logFilter) DmConnectionClose(filterChain *filterChain, c *DmConnection) (err error) {
  122. var logRecord = c.logInfo.logRecord
  123. logRecord.Set(c, "close")
  124. defer func() {
  125. filter.doLog(logRecord)
  126. }()
  127. err = filterChain.DmConnectionClose(c)
  128. if err != nil {
  129. logRecord.SetError(err)
  130. return
  131. }
  132. return
  133. }
  134. func (filter *logFilter) DmConnectionPing(filterChain *filterChain, c *DmConnection, ctx context.Context) (err error) {
  135. var logRecord = c.logInfo.logRecord
  136. logRecord.Set(c, "ping")
  137. defer func() {
  138. filter.doLog(logRecord)
  139. }()
  140. err = filterChain.DmConnectionPing(c, ctx)
  141. if err != nil {
  142. logRecord.SetError(err)
  143. return
  144. }
  145. return
  146. }
  147. func (filter *logFilter) DmConnectionExec(filterChain *filterChain, c *DmConnection, query string, args []driver.Value) (ret *DmResult, err error) {
  148. var logRecord = c.logInfo.logRecord
  149. logRecord.Set(c, "executeByStmt", query, args)
  150. defer func() {
  151. filter.executeAfter(c.logInfo, logRecord)
  152. filter.doLog(logRecord)
  153. }()
  154. logRecord.SetSql(query)
  155. filter.executeBefore(c.logInfo)
  156. ret, err = filterChain.DmConnectionExec(c, query, args)
  157. if err != nil {
  158. logRecord.SetError(err)
  159. return
  160. }
  161. logRecord.SetReturnValue(ret)
  162. return
  163. }
  164. func (filter *logFilter) DmConnectionExecContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (ret *DmResult, err error) {
  165. var logRecord = c.logInfo.logRecord
  166. logRecord.Set(c, "executeCtx", query, args)
  167. defer func() {
  168. filter.executeAfter(c.logInfo, logRecord)
  169. filter.doLog(logRecord)
  170. }()
  171. logRecord.SetSql(query)
  172. filter.executeBefore(c.logInfo)
  173. ret, err = filterChain.DmConnectionExecContext(c, ctx, query, args)
  174. if err != nil {
  175. logRecord.SetError(err)
  176. return
  177. }
  178. logRecord.SetReturnValue(ret)
  179. return
  180. }
  181. func (filter *logFilter) DmConnectionQuery(filterChain *filterChain, c *DmConnection, query string, args []driver.Value) (ret *DmRows, err error) {
  182. var logRecord = c.logInfo.logRecord
  183. logRecord.Set(c, "query", query, args)
  184. defer func() {
  185. filter.executeAfter(c.logInfo, logRecord)
  186. filter.doLog(logRecord)
  187. }()
  188. logRecord.SetSql(query)
  189. filter.executeBefore(c.logInfo)
  190. ret, err = filterChain.DmConnectionQuery(c, query, args)
  191. if err != nil {
  192. logRecord.SetError(err)
  193. return
  194. }
  195. logRecord.SetReturnValue(ret)
  196. return
  197. }
  198. func (filter *logFilter) DmConnectionQueryContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string, args []driver.NamedValue) (ret *DmRows, err error) {
  199. var logRecord = c.logInfo.logRecord
  200. logRecord.Set(c, "queryCtx", query, args)
  201. defer func() {
  202. filter.executeAfter(c.logInfo, logRecord)
  203. filter.doLog(logRecord)
  204. }()
  205. logRecord.SetSql(query)
  206. filter.executeBefore(c.logInfo)
  207. ret, err = filterChain.DmConnectionQueryContext(c, ctx, query, args)
  208. if err != nil {
  209. logRecord.SetError(err)
  210. return
  211. }
  212. logRecord.SetReturnValue(ret)
  213. return
  214. }
  215. func (filter *logFilter) DmConnectionPrepare(filterChain *filterChain, c *DmConnection, query string) (ret *DmStatement, err error) {
  216. var logRecord = c.logInfo.logRecord
  217. logRecord.Set(c, "prepareStatement", query)
  218. defer func() {
  219. filter.doLog(logRecord)
  220. }()
  221. logRecord.SetSql(query)
  222. ret, err = filterChain.DmConnectionPrepare(c, query)
  223. if err != nil {
  224. logRecord.SetError(err)
  225. return
  226. }
  227. logRecord.SetReturnValue(ret)
  228. return
  229. }
  230. func (filter *logFilter) DmConnectionPrepareContext(filterChain *filterChain, c *DmConnection, ctx context.Context, query string) (ret *DmStatement, err error) {
  231. var logRecord = c.logInfo.logRecord
  232. logRecord.Set(c, "prepareStatementCtx", query)
  233. defer func() {
  234. filter.doLog(logRecord)
  235. }()
  236. logRecord.SetSql(query)
  237. ret, err = filterChain.DmConnectionPrepareContext(c, ctx, query)
  238. if err != nil {
  239. logRecord.SetError(err)
  240. return
  241. }
  242. logRecord.SetReturnValue(ret)
  243. return
  244. }
  245. func (filter *logFilter) DmConnectionResetSession(filterChain *filterChain, c *DmConnection, ctx context.Context) (err error) {
  246. var logRecord = c.logInfo.logRecord
  247. logRecord.Set(c, "resetSession")
  248. defer func() {
  249. filter.doLog(logRecord)
  250. }()
  251. err = filterChain.DmConnectionResetSession(c, ctx)
  252. if err != nil {
  253. logRecord.SetError(err)
  254. return
  255. }
  256. return
  257. }
  258. func (filter *logFilter) DmConnectionCheckNamedValue(filterChain *filterChain, c *DmConnection, nv *driver.NamedValue) (err error) {
  259. var logRecord = c.logInfo.logRecord
  260. logRecord.Set(c, "checkNamedValue", nv)
  261. defer func() {
  262. filter.doLog(logRecord)
  263. }()
  264. err = filterChain.DmConnectionCheckNamedValue(c, nv)
  265. if err != nil {
  266. logRecord.SetError(err)
  267. return
  268. }
  269. return
  270. }
  271. func (filter *logFilter) DmStatementClose(filterChain *filterChain, s *DmStatement) (err error) {
  272. var logRecord = s.logInfo.logRecord
  273. logRecord.Set(s, "close")
  274. defer func() {
  275. filter.doLog(logRecord)
  276. }()
  277. err = filterChain.DmStatementClose(s)
  278. if err != nil {
  279. logRecord.SetError(err)
  280. return
  281. }
  282. return
  283. }
  284. func (filter *logFilter) DmStatementNumInput(filterChain *filterChain, s *DmStatement) (ret int) {
  285. var logRecord = s.logInfo.logRecord
  286. logRecord.Set(s, "numInput")
  287. defer func() {
  288. filter.doLog(logRecord)
  289. }()
  290. ret = filterChain.DmStatementNumInput(s)
  291. logRecord.SetReturnValue(ret)
  292. return
  293. }
  294. func (filter *logFilter) DmStatementExec(filterChain *filterChain, s *DmStatement, args []driver.Value) (ret *DmResult, err error) {
  295. var logRecord = s.logInfo.logRecord
  296. logRecord.Set(s, "executeByStmt", args)
  297. defer func() {
  298. filter.executeAfter(s.logInfo, logRecord)
  299. filter.doLog(logRecord)
  300. }()
  301. logRecord.SetSql(s.nativeSql)
  302. filter.executeBefore(s.logInfo)
  303. ret, err = filterChain.DmStatementExec(s, args)
  304. if err != nil {
  305. logRecord.SetError(err)
  306. return
  307. }
  308. logRecord.SetReturnValue(ret)
  309. return
  310. }
  311. func (filter *logFilter) DmStatementExecContext(filterChain *filterChain, s *DmStatement, ctx context.Context, args []driver.NamedValue) (ret *DmResult, err error) {
  312. var logRecord = s.logInfo.logRecord
  313. logRecord.Set(s, "executeCtx", args)
  314. defer func() {
  315. filter.executeAfter(s.logInfo, logRecord)
  316. filter.doLog(logRecord)
  317. }()
  318. logRecord.SetSql(s.nativeSql)
  319. filter.executeBefore(s.logInfo)
  320. ret, err = filterChain.DmStatementExecContext(s, ctx, args)
  321. if err != nil {
  322. logRecord.SetError(err)
  323. return
  324. }
  325. logRecord.SetReturnValue(ret)
  326. return
  327. }
  328. func (filter *logFilter) DmStatementQuery(filterChain *filterChain, s *DmStatement, args []driver.Value) (ret *DmRows, err error) {
  329. var logRecord = s.logInfo.logRecord
  330. logRecord.Set(s, "query", args)
  331. defer func() {
  332. filter.executeAfter(s.logInfo, logRecord)
  333. filter.doLog(logRecord)
  334. }()
  335. logRecord.SetSql(s.nativeSql)
  336. filter.executeBefore(s.logInfo)
  337. ret, err = filterChain.DmStatementQuery(s, args)
  338. if err != nil {
  339. logRecord.SetError(err)
  340. return
  341. }
  342. logRecord.SetReturnValue(ret)
  343. return
  344. }
  345. func (filter *logFilter) DmStatementQueryContext(filterChain *filterChain, s *DmStatement, ctx context.Context, args []driver.NamedValue) (ret *DmRows, err error) {
  346. var logRecord = s.logInfo.logRecord
  347. logRecord.Set(s, "queryCtx", args)
  348. defer func() {
  349. filter.executeAfter(s.logInfo, logRecord)
  350. filter.doLog(logRecord)
  351. }()
  352. logRecord.SetSql(s.nativeSql)
  353. filter.executeBefore(s.logInfo)
  354. ret, err = filterChain.DmStatementQueryContext(s, ctx, args)
  355. if err != nil {
  356. logRecord.SetError(err)
  357. return
  358. }
  359. logRecord.SetReturnValue(ret)
  360. return
  361. }
  362. func (filter *logFilter) DmStatementCheckNamedValue(filterChain *filterChain, s *DmStatement, nv *driver.NamedValue) (err error) {
  363. var logRecord = s.logInfo.logRecord
  364. logRecord.Set(s, "checkNamedValue", nv)
  365. defer func() {
  366. filter.doLog(logRecord)
  367. }()
  368. err = filterChain.DmStatementCheckNamedValue(s, nv)
  369. if err != nil {
  370. logRecord.SetError(err)
  371. return
  372. }
  373. return
  374. }
  375. func (filter *logFilter) DmResultLastInsertId(filterChain *filterChain, r *DmResult) (ret int64, err error) {
  376. var logRecord = r.logInfo.logRecord
  377. logRecord.Set(r, "lastInsertId")
  378. defer func() {
  379. filter.doLog(logRecord)
  380. }()
  381. ret, err = filterChain.DmResultLastInsertId(r)
  382. if err != nil {
  383. logRecord.SetError(err)
  384. return
  385. }
  386. logRecord.SetReturnValue(ret)
  387. return
  388. }
  389. func (filter *logFilter) DmResultRowsAffected(filterChain *filterChain, r *DmResult) (ret int64, err error) {
  390. var logRecord = r.logInfo.logRecord
  391. logRecord.Set(r, "rowsAffected")
  392. defer func() {
  393. filter.doLog(logRecord)
  394. }()
  395. ret, err = filterChain.DmResultRowsAffected(r)
  396. if err != nil {
  397. logRecord.SetError(err)
  398. return
  399. }
  400. logRecord.SetReturnValue(ret)
  401. return
  402. }
  403. func (filter *logFilter) DmRowsColumns(filterChain *filterChain, r *DmRows) (ret []string) {
  404. var logRecord = r.logInfo.logRecord
  405. logRecord.Set(r, "columns")
  406. defer func() {
  407. filter.doLog(logRecord)
  408. }()
  409. ret = filterChain.DmRowsColumns(r)
  410. logRecord.SetReturnValue(ret)
  411. return
  412. }
  413. func (filter *logFilter) DmRowsClose(filterChain *filterChain, r *DmRows) (err error) {
  414. var logRecord = r.logInfo.logRecord
  415. logRecord.Set(r, "close")
  416. defer func() {
  417. filter.doLog(logRecord)
  418. }()
  419. err = filterChain.DmRowsClose(r)
  420. if err != nil {
  421. logRecord.SetError(err)
  422. return
  423. }
  424. return
  425. }
  426. func (filter *logFilter) DmRowsNext(filterChain *filterChain, r *DmRows, dest []driver.Value) (err error) {
  427. var logRecord = r.logInfo.logRecord
  428. logRecord.Set(r, "next", dest)
  429. defer func() {
  430. filter.doLog(logRecord)
  431. }()
  432. err = filterChain.DmRowsNext(r, dest)
  433. if err != nil {
  434. logRecord.SetError(err)
  435. return
  436. }
  437. return
  438. }
  439. func (filter *logFilter) DmRowsHasNextResultSet(filterChain *filterChain, r *DmRows) (ret bool) {
  440. var logRecord = r.logInfo.logRecord
  441. logRecord.Set(r, "hasNextResultSet")
  442. defer func() {
  443. filter.doLog(logRecord)
  444. }()
  445. ret = filterChain.DmRowsHasNextResultSet(r)
  446. logRecord.SetReturnValue(ret)
  447. return
  448. }
  449. func (filter *logFilter) DmRowsNextResultSet(filterChain *filterChain, r *DmRows) (err error) {
  450. var logRecord = r.logInfo.logRecord
  451. logRecord.Set(r, "nextResultSet")
  452. defer func() {
  453. filter.doLog(logRecord)
  454. }()
  455. err = filterChain.DmRowsNextResultSet(r)
  456. if err != nil {
  457. logRecord.SetError(err)
  458. return
  459. }
  460. return
  461. }
  462. func (filter *logFilter) DmRowsColumnTypeScanType(filterChain *filterChain, r *DmRows, index int) (ret reflect.Type) {
  463. var logRecord = r.logInfo.logRecord
  464. logRecord.Set(r, "columnTypeScanType", index)
  465. defer func() {
  466. filter.doLog(logRecord)
  467. }()
  468. ret = filterChain.DmRowsColumnTypeScanType(r, index)
  469. logRecord.SetReturnValue(ret)
  470. return
  471. }
  472. func (filter *logFilter) DmRowsColumnTypeDatabaseTypeName(filterChain *filterChain, r *DmRows, index int) (ret string) {
  473. var logRecord = r.logInfo.logRecord
  474. logRecord.Set(r, "columnTypeDatabaseTypeName", index)
  475. defer func() {
  476. filter.doLog(logRecord)
  477. }()
  478. ret = filterChain.DmRowsColumnTypeDatabaseTypeName(r, index)
  479. logRecord.SetReturnValue(ret)
  480. return
  481. }
  482. func (filter *logFilter) DmRowsColumnTypeLength(filterChain *filterChain, r *DmRows, index int) (length int64, ok bool) {
  483. var logRecord = r.logInfo.logRecord
  484. logRecord.Set(r, "columnTypeLength", index)
  485. defer func() {
  486. filter.doLog(logRecord)
  487. }()
  488. length, ok = filterChain.DmRowsColumnTypeLength(r, index)
  489. if ok {
  490. logRecord.SetReturnValue(length)
  491. } else {
  492. logRecord.SetReturnValue(-1)
  493. }
  494. return
  495. }
  496. func (filter *logFilter) DmRowsColumnTypeNullable(filterChain *filterChain, r *DmRows, index int) (nullable, ok bool) {
  497. var logRecord = r.logInfo.logRecord
  498. logRecord.Set(r, "columnTypeNullable", index)
  499. defer func() {
  500. filter.doLog(logRecord)
  501. }()
  502. nullable, ok = filterChain.DmRowsColumnTypeNullable(r, index)
  503. if ok {
  504. logRecord.SetReturnValue(nullable)
  505. } else {
  506. logRecord.SetReturnValue(false)
  507. }
  508. return
  509. }
  510. func (filter *logFilter) DmRowsColumnTypePrecisionScale(filterChain *filterChain, r *DmRows, index int) (precision, scale int64, ok bool) {
  511. var logRecord = r.logInfo.logRecord
  512. logRecord.Set(r, "columnTypePrecisionScale", index)
  513. defer func() {
  514. filter.doLog(logRecord)
  515. }()
  516. precision, scale, ok = filterChain.DmRowsColumnTypePrecisionScale(r, index)
  517. if ok {
  518. logRecord.SetReturnValue(strconv.FormatInt(precision, 10) + "&" + strconv.FormatInt(scale, 10))
  519. } else {
  520. logRecord.SetReturnValue("-1&-1")
  521. }
  522. return
  523. }
  524. func (filter *logFilter) executeBefore(logInfo *logInfo) {
  525. if LogFilterLogger.IsSqlEnabled() {
  526. logInfo.lastExecuteStartNano = time.Now()
  527. }
  528. }
  529. func (filter *logFilter) executeAfter(logInfo *logInfo, record *LogRecord) {
  530. if LogFilterLogger.IsSqlEnabled() {
  531. record.SetUsedTime(time.Since(logInfo.lastExecuteStartNano))
  532. }
  533. }
  534. func (filter *logFilter) doLog(record *LogRecord) {
  535. if record == nil {
  536. return
  537. }
  538. if record.GetError() != nil {
  539. LogFilterLogger.ErrorWithErr(record.ToString(), record.GetError())
  540. } else if record.GetSql() != "" && LogFilterLogger.IsSqlEnabled() {
  541. LogFilterLogger.Sql(record.ToString())
  542. } else {
  543. LogFilterLogger.Info(record.ToString())
  544. }
  545. }
  546. /************************************************************************************************************/
  547. type Logger struct {
  548. }
  549. var LogFilterLogger = &Logger{}
  550. var ConnLogger = &Logger{}
  551. var AccessLogger = &Logger{}
  552. func (logger Logger) IsDebugEnabled() bool {
  553. return LogLevel >= LOG_DEBUG
  554. }
  555. func (logger Logger) IsErrorEnabled() bool {
  556. return LogLevel >= LOG_ERROR
  557. }
  558. func (logger Logger) IsInfoEnabled() bool {
  559. return LogLevel >= LOG_INFO
  560. }
  561. func (logger Logger) IsWarnEnabled() bool {
  562. return LogLevel >= LOG_WARN
  563. }
  564. func (logger Logger) IsSqlEnabled() bool {
  565. return LogLevel >= LOG_SQL
  566. }
  567. func (logger Logger) Debug(msg string) {
  568. if logger.IsDebugEnabled() {
  569. logger.println(logger.formatHead("DEBUG") + msg)
  570. }
  571. }
  572. func (logger Logger) DebugWithErr(msg string, err error) {
  573. if logger.IsDebugEnabled() {
  574. if e, ok := err.(*DmError); ok {
  575. logger.println(logger.formatHead("DEBUG") + msg + util.LINE_SEPARATOR + e.FormatStack())
  576. } else {
  577. logger.println(logger.formatHead("DEBUG") + msg + util.LINE_SEPARATOR + err.Error())
  578. }
  579. }
  580. }
  581. func (logger Logger) Info(msg string) {
  582. if logger.IsInfoEnabled() {
  583. logger.println(logger.formatHead("INFO ") + msg)
  584. }
  585. }
  586. func (logger Logger) Sql(msg string) {
  587. if logger.IsSqlEnabled() {
  588. logger.println(logger.formatHead("SQL ") + msg)
  589. }
  590. }
  591. func (logger Logger) Warn(msg string) {
  592. if logger.IsWarnEnabled() {
  593. logger.println(logger.formatHead("WARN ") + msg)
  594. }
  595. }
  596. func (logger Logger) ErrorWithErr(msg string, err error) {
  597. if e, ok := err.(*DmError); ok {
  598. logger.println(logger.formatHead("ERROR") + msg + util.LINE_SEPARATOR + e.FormatStack())
  599. } else {
  600. logger.println(logger.formatHead("ERROR") + msg + util.LINE_SEPARATOR + err.Error())
  601. }
  602. }
  603. // TODO: 获取goroutine objId
  604. func (logger Logger) formatHead(head string) string {
  605. // return "[" + head + " - " + StringUtil.formatTime() + "] tid:" + Thread.currentThread().getId();
  606. return "[" + head + " - " + util.StringUtil.FormatTime() + "]"
  607. }
  608. func (logger Logger) println(msg string) {
  609. goMap["log"].(*logWriter).WriteLine(msg)
  610. }
  611. /*************************************************************************************************/
  612. func formatSource(source interface{}) string {
  613. if source == nil {
  614. return ""
  615. }
  616. var str string
  617. switch src := source.(type) {
  618. case string:
  619. str += src
  620. case *DmDriver:
  621. str += formatDriver(src)
  622. case *DmConnector:
  623. str += formatContor(src)
  624. case *DmConnection:
  625. str += formatConn(src)
  626. case *DmStatement:
  627. str += formatConn(src.dmConn) + ", "
  628. str += formatStmt(src)
  629. case *DmResult:
  630. str += formatConn(src.dmStmt.dmConn) + ", "
  631. str += formatStmt(src.dmStmt) + ", "
  632. str += formatRs(src)
  633. case *DmRows:
  634. str += formatConn(src.CurrentRows.dmStmt.dmConn) + ", "
  635. str += formatStmt(src.CurrentRows.dmStmt) + ", "
  636. str += formatRows(src)
  637. default:
  638. str += reflect.TypeOf(src).String() + "@" + reflect.ValueOf(src).Addr().String()
  639. }
  640. return str
  641. }
  642. func formatDriver(driver *DmDriver) string {
  643. if driver != nil && driver.logInfo != nil {
  644. return "driver-" + strconv.FormatInt(driver.getID(), 10)
  645. }
  646. return "driver-nil"
  647. }
  648. func formatContor(contor *DmConnector) string {
  649. if contor != nil && contor.logInfo != nil {
  650. return "contor-" + strconv.FormatInt(contor.getID(), 10)
  651. }
  652. return "contor-nil"
  653. }
  654. func formatConn(conn *DmConnection) string {
  655. if conn != nil && conn.logInfo != nil {
  656. return "conn-" + strconv.FormatInt(conn.getID(), 10)
  657. }
  658. return "conn-nil"
  659. }
  660. func formatStmt(stmt *DmStatement) string {
  661. if stmt != nil && stmt.logInfo != nil {
  662. return "stmt-" + strconv.FormatInt(stmt.getID(), 10)
  663. }
  664. return "stmt-nil"
  665. }
  666. func formatRs(result *DmResult) string {
  667. if result != nil && result.logInfo != nil {
  668. return "rs-" + strconv.FormatInt(result.getID(), 10)
  669. }
  670. return "rs-nil"
  671. }
  672. func formatRows(rows *DmRows) string {
  673. if rows != nil && rows.logInfo != nil {
  674. return "rows-" + strconv.FormatInt(rows.getID(), 10)
  675. }
  676. return "rows-nil"
  677. }
  678. func formatTrace(source string, method string, returnValue interface{}, params ...interface{}) string {
  679. var str string
  680. if source != "" {
  681. str += "{ " + source + " } "
  682. }
  683. str += method + "("
  684. var paramStartIndex = 0
  685. if params != nil && len(params) > paramStartIndex {
  686. for i := paramStartIndex; i < len(params); i++ {
  687. if i != paramStartIndex {
  688. str += ", "
  689. }
  690. if params[i] != nil {
  691. str += reflect.TypeOf(params[i]).String()
  692. } else {
  693. str += "nil"
  694. }
  695. }
  696. }
  697. str += ")"
  698. if returnValue != nil {
  699. str += ": " + formatReturn(returnValue)
  700. }
  701. str += "; "
  702. if params != nil && len(params) > paramStartIndex {
  703. str += "[PARAMS]: "
  704. for i := paramStartIndex; i < len(params); i++ {
  705. if i != 0 {
  706. str += ", "
  707. }
  708. if s, ok := params[i].(string); ok {
  709. str += "\"" + s + "\""
  710. } else {
  711. str += reflect.ValueOf(params[i]).String()
  712. }
  713. }
  714. str += "; "
  715. }
  716. return str
  717. }
  718. func formatReturn(returnObj interface{}) string {
  719. var str string
  720. switch o := returnObj.(type) {
  721. case *DmConnection:
  722. str = formatConn(o)
  723. sessID := o.SessionID
  724. if sessID != -1 {
  725. str += ", sessionID-0x" + strconv.FormatInt(sessID, 16)
  726. }
  727. case *DmStatement:
  728. str = formatStmt(o)
  729. str += ", handle-" + strconv.Itoa(int(o.id))
  730. case *DmResult:
  731. str = formatRs(o)
  732. case *DmRows:
  733. str = formatRows(o)
  734. case string:
  735. str = `"` + o + `"`
  736. case nullData:
  737. str = "nil"
  738. default:
  739. str = "unknown"
  740. }
  741. return str
  742. }
  743. func formatUsedTime(duration time.Duration) string {
  744. return "[USED TIME]: " + duration.String()
  745. }
  746. /************************************************************************************************************/
  747. type nullData struct{}
  748. var null = nullData{}
  749. type LogRecord struct {
  750. source string
  751. method string
  752. params []interface{}
  753. returnValue interface{}
  754. e error
  755. usedTime time.Duration
  756. sql string
  757. }
  758. func (record *LogRecord) Set(source interface{}, method string, params ...interface{}) {
  759. record.source = formatSource(source)
  760. record.method = method
  761. record.params = params
  762. }
  763. func (record *LogRecord) SetReturnValue(retValue interface{}) {
  764. if retValue == nil {
  765. record.returnValue = null
  766. } else {
  767. record.returnValue = retValue
  768. }
  769. }
  770. func (record *LogRecord) GetReturnValue() interface{} {
  771. return record.returnValue
  772. }
  773. func (record *LogRecord) SetSql(sql string) {
  774. record.sql = sql
  775. }
  776. func (record *LogRecord) GetSql() string {
  777. return record.sql
  778. }
  779. func (record *LogRecord) SetUsedTime(usedTime time.Duration) {
  780. record.usedTime = usedTime
  781. }
  782. func (record *LogRecord) GetUsedTime() time.Duration {
  783. return record.usedTime
  784. }
  785. func (record *LogRecord) SetError(err error) {
  786. record.e = err
  787. }
  788. func (record *LogRecord) GetError() error {
  789. return record.e
  790. }
  791. func (record *LogRecord) ToString() string {
  792. var str string
  793. str += formatTrace(record.source, record.method, record.returnValue, record.params...)
  794. if record.usedTime > 0 {
  795. str += formatUsedTime(record.usedTime)
  796. }
  797. return str
  798. }