blob: 60957487fae2f5b9d854a97dc88c0f2b7aedea16 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/feedback_data/system_log_recorder/system_log_recorder.h"
#include <lib/syslog/cpp/macros.h>
#include "src/lib/diagnostics/stream/cpp/log_message.h"
#include "src/lib/files/path.h"
namespace forensics {
namespace feedback_data {
namespace system_log_recorder {
SystemLogRecorder::SystemLogRecorder(async_dispatcher_t* archive_dispatcher,
async_dispatcher_t* write_dispatcher,
std::shared_ptr<sys::ServiceDirectory> services,
WriteParameters write_parameters,
std::unique_ptr<Encoder> encoder)
: write_dispatcher_(write_dispatcher),
write_period_(write_parameters.period),
logs_dir_(write_parameters.logs_dir),
store_(write_parameters.total_log_size_bytes / write_parameters.max_num_files,
write_parameters.max_write_size_bytes, std::move(encoder)),
archive_accessor_(archive_dispatcher, services, fuchsia::diagnostics::DataType::LOGS,
fuchsia::diagnostics::StreamMode::SNAPSHOT_THEN_SUBSCRIBE),
writer_(logs_dir_, write_parameters.max_num_files, &store_) {}
void SystemLogRecorder::Start() {
archive_accessor_.Collect([this](fuchsia::diagnostics::FormattedContent chunk) {
auto log_messages = diagnostics::stream::ConvertFormattedContentToLogMessages(std::move(chunk));
if (log_messages.is_error()) {
store_.Add(::fit::error(log_messages.take_error()));
return;
}
for (auto& log_message : log_messages.value()) {
store_.Add(std::move(log_message));
}
});
periodic_write_task_.Post(write_dispatcher_);
}
void SystemLogRecorder::StopAndDeleteLogs() {
// Stop collecting logs.
archive_accessor_.StopCollect();
periodic_write_task_.Cancel();
// Consume the data currently in the store to flush it.
bool end_of_block;
store_.Consume(&end_of_block);
// Delete the persisted logs.
files::DeletePath(logs_dir_, /*recursive=*/true);
FX_LOGS(INFO) << "Stopped log recording and flushed persisted logs";
}
void SystemLogRecorder::PeriodicWriteTask() {
writer_.Write();
periodic_write_task_.PostDelayed(write_dispatcher_, write_period_);
}
} // namespace system_log_recorder
} // namespace feedback_data
} // namespace forensics