blob: 0bd35bb0267b43f0cb25bb514057a1d26f978601 [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 "crash-reporter/anomaly_detector_log_reader.h"
#include "crash-reporter/anomaly_detector_text_file_reader.h"
#include <string>
#include <utility>
#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
namespace anomaly {
LogReader::LogReader(const base::FilePath& path)
: log_file_path_(path), log_file_(path) {
// Go directly to the end of the file. We don't want to parse the same
// anomalies multiple times on reboot/restart. We might miss some
// anomalies, but so be it---it's too hard to keep track reliably of the
// last parsed position in the syslog.
log_file_.SeekToEnd();
}
LogReader::~LogReader() {}
void LogReader::SeekToBegin() {
log_file_.SeekToBegin();
}
bool LogReader::GetNextEntry(LogEntry* entry) {
std::string line;
while (log_file_.GetLine(&line)) {
// ReadLine returns true if the line contains a valid LogEntry.
if (ReadLine(line, entry))
return true;
}
return false;
}
bool AuditReader::ReadLine(const std::string& line, LogEntry* entry) {
std::string log_time, log_message;
if (!RE2::FullMatch(line, pattern_, &log_time, &log_message)) {
return false;
}
double time_in_seconds;
if (!base::StringToDouble(log_time, &time_in_seconds)) {
LOG(WARNING) << "Ingnoring log entry due to invalid timestamp. time="
<< log_time << " tag=audit"
<< " message=" << log_message;
return false;
}
entry->tag = "audit";
entry->message = std::move(log_message);
entry->timestamp = base::Time::FromDoubleT(time_in_seconds);
return true;
}
bool MessageReader::ReadLine(const std::string& line, LogEntry* entry) {
std::string log_time, service_name, log_message;
if (!RE2::FullMatch(line, pattern_, &log_time, &service_name, &log_message)) {
return false;
}
base::Time time;
bool result = base::Time::FromString(log_time.c_str(), &time);
if (!result) {
LOG(WARNING)
<< "Ingnoring log entry due to invalid RFC3339 timestamp. time="
<< log_time << " tag=" << service_name << " message=" << log_message;
return false;
}
entry->tag = std::move(service_name);
entry->message = std::move(log_message);
entry->timestamp = std::move(time);
return true;
}
} // namespace anomaly