writeLogger static method

void writeLogger(
  1. EasyLogger instance,
  2. String msg,
  3. EasyLogLevel logLevel
)

写入到日志文件,注意:为避免并发异步写入混乱,目前采用的全部是同步操作

Implementation

static void writeLogger(EasyLogger instance, String msg, EasyLogLevel logLevel) {
  if (instance._logFilePath == null) return;
  try {
    //检测文件是否存在,不存在则创建新的
    File? file = _filesMap[instance._logFilePath];
    if (file == null) {
      file = File('${instance._logFilePath}.log');
      _filesMap[instance._logFilePath!] = file;
      if (!file.existsSync()) file.createSync(recursive: true); //同步创建
    }
    //同步写入可避免顺序混乱
    file.writeAsStringSync('$msg\n', mode: FileMode.append, flush: true);
    //检查当前文件大大小,进行备份
    if (file.lengthSync() > instance._logFileMaxBytes) {
      //获取目录下的历史备份文件
      final fileList = <File>[];
      final entityList = file.parent.listSync();
      for (var entity in entityList) {
        if (entity.path.startsWith(file.path)) {
          fileList.add(File(entity.path));
        }
      }
      //根据名称升序排列
      fileList.sort((a, b) => a.path.compareTo(b.path));
      //移除多余的文件
      while (fileList.length > instance._logFileBackup) {
        fileList.removeLast().deleteSync();
      }
      //逆序重命名
      for (var i = fileList.length - 1; i >= 0; i--) {
        fileList[i].renameSync('${instance._logFilePath}.log.${i + 1}');
      }
      //从当前缓存文件中移除掉
      _filesMap.remove(instance._logFilePath);
    }
  } catch (error) {
    //从当前缓存文件中移除掉
    _filesMap.remove(instance._logFilePath);
  }
}