HarmonyOS鸿蒙Next中如何在应用中实现日志信息记录并通过用户模块发送日志功能

HarmonyOS鸿蒙Next中如何在应用中实现日志信息记录并通过用户模块发送日志功能 应该就是,我如何写一些日志,到我指定文件中,然后最后用户可以获取到这个我写入的日志,然后压缩成zip然后发给我 这个可以做吗 有什么方案呀

4 回复

以下是一个简单的日志记录工具,上传自行处理:

import fs from '@ohos.file.fs';
import { util } from '@kit.ArkTS';

export enum LogLevel {
  INFO = 'INFO',
  WARN = 'WARN',
  ERROR = 'ERROR'
}

export class LogManager {
  private logPath: string;
  private maxLogSize: number = 10 * 1024 * 1024; // 10MB
  private logQueue: string[] = [];
  private isWriting: boolean = false;

  constructor() {
    const context = getContext();
    const rootPath = context.filesDir + '/logs';
    this.initLogDirectory(rootPath);
    this.logPath = `${rootPath}/server.log`;
  }

  private async initLogDirectory(rootPath: string) {
    try {
      await fs.mkdir(rootPath);
    } catch (error) {
      // 目录可能已存在,忽略错误
    }
  }

  public async log(level: LogLevel, message: string, details?: Record<string, Object>) {
    const timestamp = new Date().toISOString();
    const logEntry = `[${timestamp}] [${level}] ${message} ${details ? JSON.stringify(details) : ''}\n`;

    this.logQueue.push(logEntry);
    this.processLogQueue();
  }

  private async processLogQueue() {
    if (this.isWriting || this.logQueue.length === 0) {
      return;
    }

    this.isWriting = true;
    try {
      const entry = this.logQueue.shift();
      if (entry) {
        await this.writeLog(entry);
      }
    } finally {
      this.isWriting = false;
      if (this.logQueue.length > 0) {
        this.processLogQueue();
      }
    }
  }

  private async writeLog(entry: string) {
    try {
      // 检查文件大小
      const stat = await fs.stat(this.logPath).catch(() => null);
      if (stat && stat.size > this.maxLogSize) {
        await this.rotateLog();
      }

      // 追加日志
      const file = await fs.open(this.logPath, fs.OpenMode.CREATE | fs.OpenMode.APPEND | fs.OpenMode.READ_WRITE);
      await fs.write(file.fd, entry);
      await fs.close(file.fd);
    } catch (error) {
      console.error('写入日志失败:', error);
    }
  }

  private async rotateLog() {
    try {
      await fs.rename(this.logPath, `${this.logPath}.1`);
    } catch (error) {
      console.error('日志轮转失败:', error);
    }
  }

  public async getLogs(lines: number = 100): Promise<string[]> {
    try {
      const file = await fs.open(this.logPath, fs.OpenMode.READ_ONLY);
      const stat = await fs.stat(this.logPath);
      const buffer = new ArrayBuffer(stat.size);
      await fs.read(file.fd, buffer);
      await fs.close(file.fd);

      const logContent = util.TextDecoder.create().decodeToString(new Uint8Array(buffer))
      return logContent.split('\n')
        .filter(line => line.trim().length > 0)
        .slice(-lines);
    } catch (error) {
      console.error('读取日志失败:', error);
      return [];
    }
  }
}

export const Logger = new LogManager()

// 记录日志
Logger.log(LogLevel.INFO, 'HTTP Request', {
  'method': 'POST',
  'url': 'https://xxxx.com',
})

// 上传日志
// 上传 context.filesDir + '/logs' 目录下的所有文件,或者压缩后上传

更多关于HarmonyOS鸿蒙Next中如何在应用中实现日志信息记录并通过用户模块发送日志功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,通过@ohos.hiAppEvent模块记录应用事件日志,使用hiAppEvent.write()方法写入自定义事件。通过@ohos.userIAM.userAuth模块进行用户身份验证,确保权限后调用日志发送接口。系统提供@ohos.telephony.sms或网络传输能力发送日志数据,需配置对应权限。日志结构化存储于设备,通过用户模块触发上传至服务器。

在HarmonyOS Next中,可以通过以下方案实现日志记录和用户发送功能:

  1. 日志写入

    • 使用[@ohos](/user/ohos).file.fs文件系统API创建和写入日志文件
    • 建议按日期分割日志文件,便于管理
    • 示例代码:
    import fs from '[@ohos](/user/ohos).file.fs';
    
    // 写入日志
    async function writeLog(log: string) {
      const path = '你的日志文件路径';
      await fs.writeText(path, log + '\n', { append: true });
    }
    
  2. 日志压缩

    • 使用[@ohos](/user/ohos).zlib压缩模块将日志文件打包为zip
    • 支持多文件压缩,便于打包整个日志目录
  3. 用户发送

    • 通过[@ohos](/user/ohos).file.picker文件选择器让用户选择压缩后的日志文件
    • 使用[@ohos](/user/ohos).app.ability.wantAgent启动邮件或社交应用分享
    • 或集成分享组件直接调用系统分享功能

注意事项:

  • 需要申请文件读写权限(ohos.permission.READ_MEDIA、ohos.permission.WRITE_MEDIA)
  • 大文件处理要考虑存储空间和性能
  • 建议提供日志清理机制避免占用过多存储空间

这个方案完全可行,能够满足你的需求。

回到顶部