ze.go 23 KB

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