【发布时间】:2020-02-14 19:29:52
【问题描述】:
我想每 10 分钟将日志行发送到电子邮件。
为此,我使用了一个计时器,并在计时器内部通过电子邮件发送日志。
但是我在 2 封电子邮件之间丢失了一些日志行。
例如,根据我的算法,我的第一封电子邮件不包含任何正常的行。
我的第二封电子邮件包含 15.37 到 15.38 秒之间的日志行。
我的第三封电子邮件包含 15.44 到 15.48 时间间隔之间的日志。
我的第四封电子邮件包含 15.55 到 15.58 时间间隔之间的日志。
如您所见,我丢失了一些日志,但找不到避免这种情况的方法。
以下是我的服务类中的代码:
@Override
public void onCreate() {
super.onCreate();
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
sendLogFile();
}
}, 0, 1000 * 60 * 10 );
}
在 sendSupport 方法内部,第二个参数作为日志行的内容发送,其中 logs 是静态字符串变量。
private void sendLogFile() {
mInteractor.sendSupport("LOG FILE", "MSG"+logs, "SUBJECT"+ System.currentTimeMillis(), "",
result -> {
Timber.log(Log.DEBUG, "sendSupport Thread.currentThread().getName() " + Thread.currentThread().getName());
if (result.isSuccess) {
Timber.d("is sent");
writeLogFile();
} else {
Timber.d("is NOT sent");
}
}
);
}
private void writeLogFile()
{
try {
StringBuilder logBuilder = new StringBuilder();
process = Runtime.getRuntime().exec( "logcat -d");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
logBuilder.append(line + "\n");
}
logs = logBuilder.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
因此,我不知道如何才能在电子邮件中定期获取所有日志。
谢谢。
【问题讨论】:
-
仍在等待想法..
-
你想在这 10 分钟之间发送日志还是整个日志?
-
我会尝试将日志保存到数据库表中,当计时器触发时,我会尝试从表中读取日志并使用异步任务发送电子邮件。
-
如何旋转日志文件,为日志创建 2 个文件 - 10 分钟后写入一个文件 切换,开始写入另一个 - 发送并清除第一个文件。我的猜测是,由于执行 Internet 操作需要很长时间,您会丢失数据,如果您将其切换到内部操作并放弃您的连接依赖,它将有所帮助(它仍然不是 100% 丢失证明)
-
嗨@Hilal,您有机会使用 FileTree 查看建议的解决方案吗?如果您有任何问题,请告诉我。