global_syslog.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. package bo
  2. import (
  3. "scd_check_tools/logger"
  4. "scd_check_tools/models/enum"
  5. "scd_check_tools/tools"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "io/fs"
  10. "os"
  11. "strconv"
  12. "strings"
  13. "sync"
  14. "time"
  15. "github.com/astaxie/beego/orm"
  16. _ "github.com/astaxie/beego/orm"
  17. )
  18. //系统操作日志管理
  19. type SystemLog struct {
  20. DeviceBaseModel
  21. //操作分类
  22. Logtype enum.LogType
  23. //审计分类
  24. Audittype enum.AuditType
  25. //事件分类
  26. Eventtype enum.OptEventType
  27. //事件等级
  28. Eventlevel enum.OptEventLevel
  29. //日志内容
  30. Description string
  31. }
  32. type Global_syslog struct {
  33. Id int64 `orm:"pk;auto"`
  34. Insdate string `orm:"size(20)"`
  35. Description string `orm:"size(500)"`
  36. Staff string `orm:"size(50)"`
  37. //操作分类
  38. Logtype int
  39. //审计分类
  40. Audittype int
  41. //事件分类
  42. Eventtype int
  43. //事件等级
  44. Eventlevel int
  45. Success int
  46. Ip string
  47. }
  48. func init() {
  49. orm.RegisterModel(new(Global_syslog))
  50. }
  51. //操作失败日志记录
  52. //该方法通过属性设置方式完成属性值的赋予
  53. func (c *SystemLog) Fail2() {
  54. c.Fail(c.Audittype, c.Logtype, c.Eventtype, c.Eventlevel, c.Description, c.GetUserInfo())
  55. }
  56. //操作失败日志记录
  57. //该方法通过参数方式完成属性值的赋予
  58. func (c *SystemLog) Fail(module enum.AuditType, logtype enum.LogType, event enum.OptEventType, eventlevel enum.OptEventLevel, desc string, uinfo ...map[string]interface{}) {
  59. u_info := c.GetUserInfo()
  60. if u_info == nil {
  61. if len(uinfo) > 0 {
  62. c.SetUserInfo(uinfo[0])
  63. } else {
  64. logger.Logger.Error("写日志记录失败:未指定的当前用户对象")
  65. return
  66. }
  67. }
  68. username := c.GetUserName()
  69. if username == "" {
  70. username = "系统内置用户"
  71. }
  72. go SaveSyslog(desc, module, logtype, event, eventlevel, enum.OptResult_Fail, username, c.GetIP())
  73. }
  74. //操作成功日志记录
  75. //该方法通过属性设置方式完成属性值的赋予
  76. func (c *SystemLog) Success2() {
  77. c.Success(c.Audittype, c.Logtype, c.Eventtype, c.Eventlevel, c.Description, c.GetUserInfo())
  78. }
  79. //操作成功日志记录
  80. //该方法通过参数方式完成属性值的赋予
  81. func (c *SystemLog) Success(module enum.AuditType, logtype enum.LogType, event enum.OptEventType, eventlevel enum.OptEventLevel, desc string, uinfo ...map[string]interface{}) {
  82. u_info := c.GetUserInfo()
  83. if u_info == nil {
  84. if len(uinfo) > 0 {
  85. c.SetUserInfo(uinfo[0])
  86. } else {
  87. logger.Logger.Error("写日志记录失败:未指定的当前用户对象")
  88. return
  89. }
  90. }
  91. username := c.GetUserName()
  92. if username == "" {
  93. username = "系统内置用户"
  94. }
  95. go SaveSyslog(desc, module, logtype, event, eventlevel, enum.OptResult_Success, username, c.GetIP())
  96. }
  97. //清除所有日志数据
  98. func ClearAllSyslog() (err error) {
  99. o := orm.NewOrm()
  100. sqlCommandText := "delete from global_syslog"
  101. _, err = o.Raw(sqlCommandText).Exec()
  102. if err != nil {
  103. return err
  104. } else {
  105. return nil
  106. }
  107. }
  108. //根据日志配置(如存储时长、容量限制等)自动清除符合条件的日志数据
  109. func ClearSyslog(clearbeforedate string) (err error) {
  110. o := orm.NewOrm()
  111. sqlCommandText := "delete from global_syslog where insdate<?"
  112. _, err = o.Raw(sqlCommandText, clearbeforedate).Exec()
  113. dblog := new(SystemLog)
  114. dblog.SetUserInfo(map[string]interface{}{"name": "", "ip": "127.0.0.1"})
  115. dblog.Audittype = enum.AuditType_admin_system_logclear
  116. dblog.Logtype = enum.LogType_Delete
  117. dblog.Eventtype = enum.OptEventType_System
  118. dblog.Eventlevel = enum.OptEventLevel_Hight
  119. sqllog := fmt.Sprintf("SQL:%s 参数:%s", sqlCommandText, clearbeforedate)
  120. if err != nil {
  121. logger.Logger.Error(err, sqllog)
  122. dblog.Description = sqllog
  123. dblog.Fail2()
  124. return err
  125. } else {
  126. dblog.Description = sqllog
  127. dblog.Fail2()
  128. return nil
  129. }
  130. }
  131. //保存操作日志记录。(已过时,建议使用SystemLog对象的Fail/Success方法代替)
  132. func SaveSyslog(desc string, module enum.AuditType, logtype enum.LogType, event enum.OptEventType, eventlevel enum.OptEventLevel, state enum.OptResult, staff string, ip ...string) (result int64, err error) {
  133. o := orm.NewOrm()
  134. var obj = Global_syslog{
  135. Description: desc,
  136. Audittype: int(module),
  137. Logtype: int(logtype),
  138. Eventtype: int(event),
  139. Eventlevel: int(eventlevel),
  140. Success: int(state),
  141. Staff: staff,
  142. Insdate: tools.NowTime(),
  143. }
  144. if len(ip) > 0 {
  145. obj.Ip = ip[0]
  146. }
  147. var id int64
  148. id, err = o.Insert(&obj)
  149. return id, err
  150. }
  151. //查询系统日志
  152. func (c *SystemLog) SearchLogList(cond map[string]string, pageIndex, pageSize int) ([]orm.Params, int, error) {
  153. o := orm.NewOrm()
  154. var totalSql string
  155. var sqlCondition []string
  156. var sqlParameter []interface{}
  157. var sqlCommandText = `
  158. select t.*,t1.name audittypename,t2.name logtypename,t3.name eventtypename,t4.name optresultname,t5.name eventlevelname
  159. from global_syslog t left join global_const_code t1 on t.audittype=t1.code and t1.parentcode='log_audittype'
  160. left join global_const_code t2 on t.logtype=t2.code and t2.parentcode='log_opttype'
  161. left join global_const_code t3 on t.eventtype=t3.code and t3.parentcode='log_eventtype'
  162. left join global_const_code t4 on t.success=t4.code and t4.parentcode='log_optresult'
  163. left join global_const_code t5 on t.eventlevel=t5.code and t5.parentcode='log_eventlevel'
  164. `
  165. endDate := cond["enddate"]
  166. if endDate != "" {
  167. endDate += " 23:59:59"
  168. }
  169. startDate := cond["startdate"]
  170. if startDate != "" && endDate != "" {
  171. sqlCondition = append(sqlCondition, "t.insdate between ? and ? ")
  172. sqlParameter = append(sqlParameter, startDate+" 00:00:00", endDate)
  173. } else if startDate != "" {
  174. sqlCondition = append(sqlCondition, "t.insdate>=? ")
  175. sqlParameter = append(sqlParameter, startDate+" 00:00:00")
  176. } else if endDate != "" {
  177. sqlCondition = append(sqlCondition, "t.insdate<=? ")
  178. sqlParameter = append(sqlParameter, endDate)
  179. }
  180. description := cond["description"]
  181. if description != "" {
  182. sqlCondition = append(sqlCondition, "t.description like concat('%',?,'%')")
  183. sqlParameter = append(sqlParameter, description)
  184. }
  185. staff := cond["staff"]
  186. if staff != "" {
  187. sqlCondition = append(sqlCondition, "t.staff like concat('%',?,'%')")
  188. sqlParameter = append(sqlParameter, staff)
  189. }
  190. ip := cond["ip"]
  191. if ip != "" {
  192. sqlCondition = append(sqlCondition, "t.ip like concat('%',?,'%')")
  193. sqlParameter = append(sqlParameter, ip)
  194. }
  195. success := cond["success"]
  196. if success != "" {
  197. sqlCondition = append(sqlCondition, "t.success=?")
  198. sqlParameter = append(sqlParameter, success)
  199. }
  200. logtype := cond["logtype"]
  201. if logtype != "" {
  202. sqlCondition = append(sqlCondition, "t.logtype=?")
  203. sqlParameter = append(sqlParameter, logtype)
  204. }
  205. audittype := cond["audittype"]
  206. if audittype != "" {
  207. sqlCondition = append(sqlCondition, "t.audittype=?")
  208. sqlParameter = append(sqlParameter, audittype)
  209. }
  210. eventtype := cond["eventtype"]
  211. if eventtype != "" {
  212. sqlCondition = append(sqlCondition, "t.eventtype=?")
  213. sqlParameter = append(sqlParameter, eventtype)
  214. }
  215. eventlevel := cond["eventlevel"]
  216. if eventlevel != "" {
  217. sqlCondition = append(sqlCondition, "t.eventlevel=?")
  218. sqlParameter = append(sqlParameter, eventlevel)
  219. }
  220. if len(sqlCondition) > 0 {
  221. sqlCommandText += " where " + strings.Join(sqlCondition, " and ")
  222. totalSql = "select count(1) number from global_syslog t where " + strings.Join(sqlCondition, " and ")
  223. } else {
  224. totalSql = "select count(1) number from global_syslog t "
  225. }
  226. var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize)
  227. sqlCommandText += " order by t.id desc " + limit
  228. var tableData []orm.Params
  229. var number int
  230. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  231. c.Audittype = enum.AuditType_admin_system_logquery
  232. c.Logtype = enum.LogType_Query
  233. c.Eventtype = enum.OptEventType_Bus
  234. c.Eventlevel = enum.OptEventLevel_Hight
  235. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sqlCommandText, sqlParameter)
  236. c.Description = sqllog
  237. if err == nil {
  238. c.Success2()
  239. if len(tableData) > 0 {
  240. var totalData []orm.Params
  241. _, err = o.Raw(totalSql, sqlParameter).Values(&totalData)
  242. if err == nil {
  243. number, _ = strconv.Atoi(totalData[0]["number"].(string))
  244. }
  245. }
  246. } else {
  247. c.Fail2()
  248. }
  249. return tableData, number, err
  250. }
  251. func (c *SystemLog) EchartStat(cond map[string]string) (map[string]interface{}, error) {
  252. statcycle := cond["cycletype"] //"%Y%m%d" //统计周期
  253. if statcycle == "" {
  254. statcycle = "hour"
  255. }
  256. switch statcycle {
  257. case "year":
  258. statcycle = "%Y"
  259. case "month":
  260. statcycle = "%Y%m"
  261. case "day":
  262. statcycle = "%Y%m%d"
  263. case "hour":
  264. statcycle = "%Y%m%d%H"
  265. case "week":
  266. statcycle = "%Y%u"
  267. default:
  268. statcycle = "%Y%m%d"
  269. }
  270. sqlCondition := []string{}
  271. sqlParameter := []interface{}{}
  272. endDate := cond["enddate"]
  273. if endDate != "" {
  274. endDate += " 23:59:59"
  275. }
  276. startDate := cond["startdate"]
  277. if startDate != "" && endDate != "" {
  278. sqlCondition = append(sqlCondition, "t.insdate between ? and ? ")
  279. sqlParameter = append(sqlParameter, startDate+" 00:00:00")
  280. sqlParameter = append(sqlParameter, endDate)
  281. } else if startDate != "" {
  282. sqlCondition = append(sqlCondition, "t.insdate>=? ")
  283. sqlParameter = append(sqlParameter, startDate+" 00:00:00")
  284. } else if endDate != "" {
  285. sqlCondition = append(sqlCondition, "t.insdate<=? ")
  286. sqlParameter = append(sqlParameter, endDate)
  287. }
  288. description := cond["description"]
  289. if description != "" {
  290. sqlCondition = append(sqlCondition, "t.description like concat('%',?,'%')")
  291. sqlParameter = append(sqlParameter, description)
  292. }
  293. staff := cond["staff"]
  294. if staff != "" {
  295. sqlCondition = append(sqlCondition, "t.staff like concat('%',?,'%')")
  296. sqlParameter = append(sqlParameter, staff)
  297. }
  298. ip := cond["ip"]
  299. if ip != "" {
  300. sqlCondition = append(sqlCondition, "t.ip like concat('%',?,'%')")
  301. sqlParameter = append(sqlParameter, ip)
  302. }
  303. success := cond["success"]
  304. if success != "" {
  305. sqlCondition = append(sqlCondition, "t.success=?")
  306. sqlParameter = append(sqlParameter, success)
  307. }
  308. logtype := cond["logtype"]
  309. if logtype != "" {
  310. sqlCondition = append(sqlCondition, "t.logtype=?")
  311. sqlParameter = append(sqlParameter, logtype)
  312. }
  313. audittype := cond["audittype"]
  314. if audittype != "" {
  315. sqlCondition = append(sqlCondition, "t.audittype=?")
  316. sqlParameter = append(sqlParameter, audittype)
  317. }
  318. eventtype := cond["eventtype"]
  319. if eventtype != "" {
  320. sqlCondition = append(sqlCondition, "t.eventtype=?")
  321. sqlParameter = append(sqlParameter, eventtype)
  322. }
  323. eventlevel := cond["eventlevel"]
  324. if eventlevel != "" {
  325. sqlCondition = append(sqlCondition, "t.eventlevel=?")
  326. sqlParameter = append(sqlParameter, eventlevel)
  327. }
  328. eventstat := []orm.Params{}
  329. tableData := []orm.Params{}
  330. optypestat := []orm.Params{}
  331. staffstat := []orm.Params{}
  332. ipstat := []orm.Params{}
  333. o := orm.NewOrm()
  334. var wg = sync.WaitGroup{}
  335. wg.Add(5)
  336. go func() {
  337. sql := "select DATE_FORMAT(t.insdate,'" + statcycle + "') dt, count(0) num from global_syslog t "
  338. if len(sqlCondition) > 0 {
  339. sql += " where " + strings.Join(sqlCondition, " and ")
  340. }
  341. sql += " GROUP BY dt"
  342. _, err := o.Raw(sql, sqlParameter).Values(&tableData)
  343. c.Audittype = enum.AuditType_admin_system_logquery
  344. c.Logtype = enum.LogType_chartstat
  345. c.Eventtype = enum.OptEventType_Bus
  346. c.Eventlevel = enum.OptEventLevel_Low
  347. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  348. c.Description = sqllog
  349. if err == nil {
  350. c.Success2()
  351. } else {
  352. c.Fail2()
  353. }
  354. wg.Done()
  355. }()
  356. go func() {
  357. sql := "SELECT t.eventtype ,count(0) num from global_syslog t "
  358. if len(sqlCondition) > 0 {
  359. sql += " where " + strings.Join(sqlCondition, " and ")
  360. }
  361. sql += " GROUP BY eventtype"
  362. _, err := o.Raw(sql, sqlParameter).Values(&eventstat)
  363. c.Audittype = enum.AuditType_admin_system_logquery
  364. c.Logtype = enum.LogType_datastat
  365. c.Eventtype = enum.OptEventType_Bus
  366. c.Eventlevel = enum.OptEventLevel_Low
  367. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  368. c.Description = sqllog
  369. if err == nil {
  370. c.Success2()
  371. } else {
  372. c.Fail2()
  373. }
  374. wg.Done()
  375. }()
  376. go func() {
  377. sql := "SELECT t.logtype,count(0) num from global_syslog t "
  378. if len(sqlCondition) > 0 {
  379. sql += " where " + strings.Join(sqlCondition, " and ")
  380. }
  381. sql += " GROUP BY logtype"
  382. _, err := o.Raw(sql, sqlParameter).Values(&optypestat)
  383. c.Audittype = enum.AuditType_admin_system_logquery
  384. c.Logtype = enum.LogType_datastat
  385. c.Eventtype = enum.OptEventType_Bus
  386. c.Eventlevel = enum.OptEventLevel_Low
  387. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  388. c.Description = sqllog
  389. if err == nil {
  390. c.Success2()
  391. } else {
  392. c.Fail2()
  393. }
  394. wg.Done()
  395. }()
  396. go func() {
  397. sql := "SELECT t.staff,count(0) num from global_syslog t "
  398. if len(sqlCondition) > 0 {
  399. sql += " where " + strings.Join(sqlCondition, " and ")
  400. }
  401. sql += " GROUP BY staff"
  402. _, err := o.Raw(sql, sqlParameter).Values(&staffstat)
  403. c.Audittype = enum.AuditType_admin_system_logquery
  404. c.Logtype = enum.LogType_datastat
  405. c.Eventtype = enum.OptEventType_Bus
  406. c.Eventlevel = enum.OptEventLevel_Low
  407. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  408. c.Description = sqllog
  409. if err == nil {
  410. c.Success2()
  411. } else {
  412. c.Fail2()
  413. }
  414. wg.Done()
  415. }()
  416. go func() {
  417. sql := "SELECT t.ip,count(0) num from global_syslog t "
  418. if len(sqlCondition) > 0 {
  419. sql += " where " + strings.Join(sqlCondition, " and ")
  420. }
  421. sql += " GROUP BY ip"
  422. _, err := o.Raw(sql, sqlParameter).Values(&ipstat)
  423. c.Audittype = enum.AuditType_admin_system_logquery
  424. c.Logtype = enum.LogType_datastat
  425. c.Eventtype = enum.OptEventType_Bus
  426. c.Eventlevel = enum.OptEventLevel_Low
  427. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  428. c.Description = sqllog
  429. if err == nil {
  430. c.Success2()
  431. } else {
  432. c.Fail2()
  433. }
  434. wg.Done()
  435. }()
  436. wg.Wait()
  437. result := map[string]interface{}{"list": tableData, "eventstat": eventstat, "optypestat": optypestat, "staffstat": staffstat, "ipstat": ipstat}
  438. return result, nil
  439. }
  440. func (c *SystemLog) DataStat(cond map[string]string) ([]orm.Params, error) {
  441. sqlCondition := []string{}
  442. sqlParameter := []interface{}{}
  443. endDate := cond["enddate"]
  444. if endDate == "" {
  445. endDate = time.Now().Format("2006-01-02")
  446. }
  447. startDate := cond["startdate"]
  448. if startDate == "" {
  449. startDate = time.Now().Format("2006-01-02")
  450. }
  451. sqlCondition = append(sqlCondition, "t.insdate between ? and ? ")
  452. sqlParameter = append(sqlParameter, startDate+" 00:00:00")
  453. sqlParameter = append(sqlParameter, endDate+" 23:59:59")
  454. description := cond["description"]
  455. if description != "" {
  456. sqlCondition = append(sqlCondition, "t.description like concat('%',?,'%')")
  457. sqlParameter = append(sqlParameter, description)
  458. }
  459. staff := cond["staff"]
  460. if staff != "" {
  461. sqlCondition = append(sqlCondition, "t.staff like concat('%',?,'%')")
  462. sqlParameter = append(sqlParameter, staff)
  463. }
  464. ip := cond["ip"]
  465. if ip != "" {
  466. sqlCondition = append(sqlCondition, "t.ip like concat('%',?,'%')")
  467. sqlParameter = append(sqlParameter, ip)
  468. }
  469. success := cond["success"]
  470. if success != "" {
  471. sqlCondition = append(sqlCondition, "t.success=?")
  472. sqlParameter = append(sqlParameter, success)
  473. }
  474. logtype := cond["logtype"]
  475. if logtype != "" {
  476. sqlCondition = append(sqlCondition, "t.logtype=?")
  477. sqlParameter = append(sqlParameter, logtype)
  478. }
  479. audittype := cond["audittype"]
  480. if audittype != "" {
  481. sqlCondition = append(sqlCondition, "t.audittype=?")
  482. sqlParameter = append(sqlParameter, audittype)
  483. }
  484. eventtype := cond["eventtype"]
  485. if eventtype != "" {
  486. sqlCondition = append(sqlCondition, "t.eventtype=?")
  487. sqlParameter = append(sqlParameter, eventtype)
  488. }
  489. eventlevel := cond["eventlevel"]
  490. if eventlevel != "" {
  491. sqlCondition = append(sqlCondition, "t.eventlevel=?")
  492. sqlParameter = append(sqlParameter, eventlevel)
  493. }
  494. statresult := []orm.Params{}
  495. o := orm.NewOrm()
  496. sql := ""
  497. dtstr := fmt.Sprintf("%s到%s", startDate, endDate)
  498. stattype := cond["stattype"]
  499. if stattype == "" {
  500. sql = `SELECT t.staff,t.ip,t.logtype,t.eventtype,n1.name logtypename ,n2.name eventtypename,count(0) num, '` + dtstr + `' dt from global_syslog t LEFT JOIN global_const_code n1 on t.logtype=n1.code and n1.parentcode='log_opttype' LEFT JOIN global_const_code n2 on t.eventtype=n2.code and n2.parentcode='log_eventtype' `
  501. if len(sqlCondition) > 0 {
  502. sql += " where " + strings.Join(sqlCondition, " and ")
  503. }
  504. sql += " GROUP BY staff,ip,logtype,eventtype limit 0,1000"
  505. } else if stattype == "logtype" {
  506. sql = `SELECT t.logtype,n1.name logtypename ,count(0) num, '` + dtstr + `' dt from global_syslog t LEFT JOIN global_const_code n1 on t.logtype=n1.code and n1.parentcode='log_opttype' `
  507. if len(sqlCondition) > 0 {
  508. sql += " where " + strings.Join(sqlCondition, " and ")
  509. }
  510. sql += " GROUP BY logtype "
  511. }
  512. _, err := o.Raw(sql, sqlParameter).Values(&statresult)
  513. c.Audittype = enum.AuditType_admin_system_logquery
  514. c.Logtype = enum.LogType_datastat
  515. c.Eventtype = enum.OptEventType_Bus
  516. c.Eventlevel = enum.OptEventLevel_Low
  517. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  518. c.Description = sqllog
  519. if err == nil {
  520. c.Success2()
  521. } else {
  522. c.Fail2()
  523. }
  524. return statresult, err
  525. }
  526. //日志备份
  527. func (c *SystemLog) Backup(param map[string]string) error {
  528. c.Audittype = enum.AuditType_admin_logbackorrecorvey
  529. c.Logtype = enum.LogType_Insert
  530. c.Eventtype = enum.OptEventType_Bus
  531. c.Eventlevel = enum.OptEventLevel_Mid
  532. backstartdate := param["startdate"]
  533. backenddate := param["enddate"]
  534. sql := "insert into global_backup(backtype,backdate,backstaff,backfilepath,datastartdate,dataenddate,backfilesize)values(?,?,?,?,?,?,?)"
  535. sqlParameter := []interface{}{}
  536. sqlParameter = append(sqlParameter, "log")
  537. sqlParameter = append(sqlParameter, tools.NowTime())
  538. sqlParameter = append(sqlParameter, c.GetUserName())
  539. fname := fmt.Sprintf("%d.json", time.Now().Unix())
  540. fpath := strings.Join([]string{"static", "backup", "log"}, string(os.PathSeparator))
  541. os.MkdirAll(fpath, fs.ModeDir)
  542. logfilepath := fpath + string(os.PathSeparator) + fname
  543. sqlParameter = append(sqlParameter, logfilepath)
  544. sqlParameter = append(sqlParameter, backstartdate)
  545. sqlParameter = append(sqlParameter, backenddate)
  546. logfile, err := os.OpenFile(logfilepath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775)
  547. defer logfile.Close()
  548. if err != nil {
  549. logger.Logger.Error(err)
  550. return nil
  551. }
  552. o := orm.NewOrm()
  553. querySql := "select * from global_syslog where insdate BETWEEN ? and ?"
  554. rowset := []orm.Params{}
  555. o.Raw(querySql, backstartdate, backenddate).Values(&rowset)
  556. if len(rowset) == 0 {
  557. c.Description = fmt.Sprintf("日期范围%s到%s内没有可备份的日志数据!", backstartdate, backenddate)
  558. c.Fail2()
  559. return errors.New(c.Description)
  560. }
  561. logbytes, _ := json.Marshal(rowset)
  562. n, _ := logfile.Write(logbytes)
  563. sqlParameter = append(sqlParameter, n)
  564. _, err = o.Raw(sql, sqlParameter).Exec()
  565. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParameter)
  566. c.Description = sqllog
  567. if err == nil {
  568. c.Success2()
  569. } else {
  570. c.Fail2()
  571. }
  572. return err
  573. }
  574. func (c *SystemLog) BackupList(cond map[string]string, pageIndex, pageSize int) ([]orm.Params, int, error) {
  575. o := orm.NewOrm()
  576. var totalSql string
  577. var sqlCondition []string
  578. var sqlParameter []interface{}
  579. var sqlCommandText = ` select t.* from global_backup t where t.backtype='log' `
  580. endDate := cond["enddate"]
  581. if endDate != "" {
  582. endDate += " 23:59:59"
  583. }
  584. startDate := cond["startdate"]
  585. if startDate != "" && endDate != "" {
  586. sqlCondition = append(sqlCondition, "t.backdate between ? and ? ")
  587. sqlParameter = append(sqlParameter, startDate+" 00:00:00", endDate)
  588. } else if startDate != "" {
  589. sqlCondition = append(sqlCondition, "t.backdate>=? ")
  590. sqlParameter = append(sqlParameter, startDate+" 00:00:00")
  591. } else if endDate != "" {
  592. sqlCondition = append(sqlCondition, "t.backdate<=? ")
  593. sqlParameter = append(sqlParameter, endDate)
  594. }
  595. staff := cond["staff"]
  596. if staff != "" {
  597. sqlCondition = append(sqlCondition, "t.backstaff like concat('%',?,'%')")
  598. sqlParameter = append(sqlParameter, staff)
  599. }
  600. if len(sqlCondition) > 0 {
  601. sqlCommandText += strings.Join(sqlCondition, " and ")
  602. totalSql = "select count(1) number from global_backup t where t.backtype='log' and " + strings.Join(sqlCondition, " and ")
  603. } else {
  604. totalSql = "select count(1) number from global_backup t where t.backtype='log' "
  605. }
  606. var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize)
  607. sqlCommandText += " order by t.id desc " + limit
  608. var tableData []orm.Params
  609. var number int
  610. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  611. c.Audittype = enum.AuditType_admin_logbackorrecorvey
  612. c.Logtype = enum.LogType_Query
  613. c.Eventtype = enum.OptEventType_Bus
  614. c.Eventlevel = enum.OptEventLevel_Low
  615. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sqlCommandText, sqlParameter)
  616. c.Description = sqllog
  617. if err == nil {
  618. c.Success2()
  619. if len(tableData) > 0 {
  620. var totalData []orm.Params
  621. _, err = o.Raw(totalSql, sqlParameter).Values(&totalData)
  622. if err == nil {
  623. number, _ = strconv.Atoi(totalData[0]["number"].(string))
  624. }
  625. }
  626. } else {
  627. c.Fail2()
  628. }
  629. return tableData, number, err
  630. }
  631. func (c *SystemLog) Delete(id int) (err error) {
  632. c.Audittype = enum.AuditType_admin_logbackorrecorvey
  633. c.Logtype = enum.LogType_Delete
  634. c.Eventtype = enum.OptEventType_Bus
  635. c.Eventlevel = enum.OptEventLevel_Hight
  636. db := orm.NewOrm()
  637. modle := Global_backup{Id: id}
  638. if modle.Id == 0 {
  639. return errors.New("无效的ID")
  640. } else {
  641. db.Read(&modle)
  642. _, err = db.Delete(&modle)
  643. }
  644. if err != nil {
  645. logger.Logger.Error(err)
  646. c.Description = fmt.Sprintf("删除日志备份%s失败:%s", modle.Backdate, err.Error())
  647. c.Fail2()
  648. } else {
  649. ferr := os.Remove("." + string(os.PathSeparator) + modle.Backfilepath)
  650. if ferr != nil {
  651. logger.Logger.Error(ferr, modle.Backfilepath)
  652. }
  653. c.Description = fmt.Sprintf("删除日志备份%s成功", modle.Backdate)
  654. c.Success2()
  655. }
  656. return err
  657. }
  658. //将数据还原到指定备份
  659. func (c *SystemLog) Recover(backid int) (err error) {
  660. c.Audittype = enum.AuditType_admin_logbackorrecorvey
  661. c.Logtype = enum.LogType_Execute
  662. c.Eventtype = enum.OptEventType_Bus
  663. c.Eventlevel = enum.OptEventLevel_Mid
  664. db := orm.NewOrm()
  665. model := Global_backup{Id: backid}
  666. err = db.Read(&model)
  667. if err != nil {
  668. logger.Logger.Error(err)
  669. return err
  670. }
  671. go func(model Global_backup) {
  672. fn := "." + string(os.PathSeparator) + model.Backfilepath
  673. btys, err := os.ReadFile(fn)
  674. if err != nil {
  675. logger.Logger.Error(err)
  676. return
  677. }
  678. logs := []map[string]interface{}{}
  679. err = json.Unmarshal(btys, &logs)
  680. if err != nil {
  681. logger.Logger.Error(err)
  682. c.Description = fmt.Sprintf("日志还原失败:%s,操作数据:%+v", err.Error(), model)
  683. c.Fail2()
  684. } else {
  685. if len(logs) > 0 {
  686. }
  687. c.Description = fmt.Sprintf("日志还原成功,操作数据:%+v", model)
  688. c.Success2()
  689. }
  690. }(model)
  691. return err
  692. }