// 记录未知错误日志 // r:recover对象 // 返回值:无 func LogUnknownError(r interface{}, args ...string) { // 获取当前时间 now := time.Now() // 组装所有需要写入的内容 logInfo := fmt.Sprintf("%s---->", timeUtil.Format(now, "yyyy-MM-dd HH:mm:ss")) logInfo += stringUtil.GetNewLineString() logInfo += fmt.Sprintf("通过recover捕捉到的未处理异常:%v", r) logInfo += stringUtil.GetNewLineString() // 获取附加信息 if len(args) > 0 { logInfo += fmt.Sprintf("附加信息:%s", strings.Join(args, "-")) logInfo += stringUtil.GetNewLineString() } // 获取堆栈信息 for skip := con_MIN_SKIP; skip <= con_MAX_SKIP; skip++ { _, file, line, ok := runtime.Caller(skip) if !ok { break } logInfo += fmt.Sprintf("skip = %d, file = %s, line = %d", skip, file, line) logInfo += stringUtil.GetNewLineString() } // 加上最后的分隔符 logInfo += con_SEPERATOR logInfo += stringUtil.GetNewLineString() // 构造对象并添加到队列中 writeLog(newLogObject(logInfo, Error, true)) }
// 将通道里面的所有内容写入到文件中 func SaveToFile() { logUtil.Log(fmt.Sprintf("通道中尚未被处理的数据量为:%d", len(dataChannel)), logUtil.Debug, true) // 组装数据到dataSlice中,并保存到日志文件 dataSlice := make([]string, 0, 1024) logUtil.Log("开始取通道中的数据", logUtil.Debug, true) if len(dataChannel) > 0 { Outer: for { select { case data := <-dataChannel: dataSlice = append(dataSlice, data) dataSlice = append(dataSlice, stringUtil.GetNewLineString()) default: break Outer } } } logUtil.Log("取通道中的数据结束", logUtil.Debug, true) logUtil.Log("开始保存数据到文件", logUtil.Debug, true) if len(dataSlice) > 0 { fileUtil.WriteFile(config.SAVE_DATA_PATH, fmt.Sprintf("%s.sql", timeUtil.Format(time.Now(), "yyyy-MM-dd")), true, dataSlice...) } logUtil.Log("保存数据到文件结束", logUtil.Debug, true) }
// 记录日志 // logInfo:需要记录的日志信息 // level:日志级别 // ifIncludeHour:日志文件名称是否包含小时 // 返回值:无 func Log(logInfo string, level logType, ifIncludeHour bool) { // 判断路径是否为空 if logPath == "" { panic(errors.New("日志存放路径不能为空,请先设置")) } // 获取当前时间 now := time.Now() // 组装所有需要写入的内容 newLogInfo := fmt.Sprintf("%s---->", timeUtil.Format(now, "yyyy-MM-dd HH:mm:ss")) newLogInfo += stringUtil.GetNewLineString() newLogInfo += fmt.Sprintf("%s", logInfo) newLogInfo += stringUtil.GetNewLineString() // 加上最后的分隔符 newLogInfo += con_SEPERATOR newLogInfo += stringUtil.GetNewLineString() // 构造对象并添加到队列中 writeLog(newLogObject(newLogInfo, level, ifIncludeHour)) }
func saveMessageToFile(file *os.File, message *chatMessage.ChatMessage) (ifAchieveMaxSize bool, err error) { // 写入消息 info := fmt.Sprintf("%s||%s||%s(%s)||||%s%s", message.Time, message.ChannelType, message.PlayerName, message.PlayerId, message.Message, stringUtil.GetNewLineString()) _, err = file.WriteString(info) if err != nil { return } // 判断是否到达大小上限 fi, err := file.Stat() if err != nil { logUtil.Log(fmt.Sprintf("获取文件信息错误,错误信息为:%s", err), logUtil.Error, true) return } if fi.Size() >= configBLL.MaxFileSize()*1024*1024 { ifAchieveMaxSize = true } return }
// 执行sql语句 // sql:sql语句 // 返回值:无 func ExecuteSql(sql string) (errorList []error) { sqlSlice := strings.Split(sql, ";") for _, item := range sqlSlice { // 由于sql语句的长度不可能小于10,所以据此进行过滤 if len(item) < 10 { continue } err := executeSql(item) if err != nil { fileUtil.WriteFile(config.FAIL_DATA_PATH, timeUtil.Format(time.Now(), "yyyy-MM-dd"), true, item, ";", stringUtil.GetNewLineString()) errorList = append(errorList, err) } } // 如果整个过程当中出现过错误,则将整句sql记录下来 if len(errorList) > 0 { logUtil.Log(fmt.Sprintf("出现Error的sql语句为:%s", sql), logUtil.Error, true) } return }