uniapp 日志存储
日志存储方案选择
在UniApp中实现日志存储,可根据需求选择本地存储、文件存储或服务端存储。本地存储适合临时日志或小规模数据;文件存储适合设备端长期保存;服务端存储适合需要集中管理的场景。
本地存储(uni.setStorage)
使用UniApp提供的本地存储API,适合保存少量日志数据。日志以键值对形式存储在本地,重启应用后仍可读取。
// 存储日志
let logs = ['error: 2023-01-01 10:00 - network timeout'];
uni.setStorage({
key: 'app_logs',
data: logs
});
// 读取日志
uni.getStorage({
key: 'app_logs',
success: function(res) {
console.log(res.data);
}
});
文件存储(uni.saveFile)
对于需要长期保存或大量日志,可使用文件系统存储。UniApp支持将日志写入设备文件系统,需注意不同平台的路径差异。

// 写入日志到文件
const filePath = `${plus.io.PUBLIC_DOCUMENTS}/app_logs.txt`;
const content = 'error: 2023-01-01 10:00 - network timeout\n';
plus.io.requestFileSystem(plus.io.PRIVATE_DOCUMENTS, function(fs) {
fs.root.getFile('app_logs.txt', {create: true}, function(fileEntry) {
fileEntry.createWriter(function(writer) {
writer.seek(writer.length);
writer.write(content);
});
});
});
服务端日志上传
通过HTTP请求将日志发送到服务端,适合需要集中分析的场景。建议采用批量上传减少请求次数。
// 日志批量上传
function uploadLogs(logs) {
uni.request({
url: 'https://api.example.com/logs',
method: 'POST',
data: { logs: logs },
success: () => {
uni.removeStorage({ key: 'app_logs' }); // 上传后清除本地日志
}
});
}
日志分级管理
实现不同级别的日志处理,如DEBUG、INFO、ERROR等级别。可通过配置决定哪些级别需要存储或上传。

const LOG_LEVEL = {
DEBUG: 1,
INFO: 2,
ERROR: 3
};
function log(message, level = LOG_LEVEL.INFO) {
if (level >= currentLogLevel) {
const timestamp = new Date().toISOString();
console.log(`[${level}] ${timestamp} - ${message}`);
// 存储或上传逻辑
}
}
日志自动清理
对于本地存储的日志,需要实现自动清理机制防止存储空间耗尽。可基于时间或日志数量进行清理。
function cleanOldLogs(maxDays = 7) {
uni.getStorage({
key: 'app_logs',
success: function(res) {
const cutoff = Date.now() - maxDays * 24 * 60 * 60 * 1000;
const filteredLogs = res.data.filter(log => {
return new Date(log.timestamp) > cutoff;
});
uni.setStorage({ key: 'app_logs', data: filteredLogs });
}
});
}
跨平台兼容处理
不同平台对文件系统的支持存在差异,需要进行兼容性处理。可通过条件编译实现平台特定代码。
// #ifdef APP-PLUS
const basePath = plus.io.PRIVATE_DOCUMENTS;
// #endif
// #ifdef H5
const basePath = '/user/logs';
// #endif
性能优化建议
对于高频日志记录,建议采用缓冲机制批量处理。可设置定时器或日志数量阈值触发存储操作,避免频繁IO影响性能。
let logBuffer = [];
const FLUSH_INTERVAL = 5000; // 5秒
setInterval(() => {
if (logBuffer.length > 0) {
saveLogs(logBuffer);
logBuffer = [];
}
}, FLUSH_INTERVAL);
function bufferedLog(message) {
logBuffer.push(message);
}






