| // 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 "croslog/viewer_plaintext.h" |
| |
| #include <memory> |
| #include <unistd.h> |
| |
| #include "base/files/file_util.h" |
| |
| #include "croslog/log_parser_syslog.h" |
| |
| namespace croslog { |
| |
| namespace { |
| |
| const char* kLogSources[] = { |
| // TOOD(yoshiki): add all sources. |
| "/var/log/messages", |
| "/var/log/net.log", |
| }; |
| |
| } // anonymous namespace |
| |
| ViewerPlaintext::ViewerPlaintext() {} |
| |
| bool ViewerPlaintext::Run(const croslog::Config& config) { |
| bool install_change_watcher = config.follow; |
| for (size_t i = 0; i < base::size(kLogSources); i++) { |
| multiplexer_.AddSource(base::FilePath(kLogSources[i]), |
| std::make_unique<LogParserSyslog>(), |
| install_change_watcher); |
| } |
| |
| multiplexer_.AddObserver(this); |
| |
| if (config.lines >= 0) { |
| multiplexer_.SetLinesFromLast(config.lines); |
| } else if (config.follow) { |
| multiplexer_.SetLinesFromLast(10); |
| } |
| |
| ReadRemainingLogs(); |
| |
| if (config.follow) { |
| // Wait for file changes. |
| run_loop_.Run(); |
| } |
| |
| return true; |
| } |
| |
| void ViewerPlaintext::OnLogFileChanged() { |
| ReadRemainingLogs(); |
| } |
| |
| void ViewerPlaintext::ReadRemainingLogs() { |
| while (true) { |
| const MaybeLogEntry& e = multiplexer_.Forward(); |
| if (!e.has_value()) |
| return; |
| const std::string& s = e->entire_line(); |
| if (!s.empty()) |
| WriteOutput(s); |
| WriteOutput("\n", 1); |
| } |
| } |
| |
| void ViewerPlaintext::WriteOutput(const std::string& str) { |
| WriteOutput(str.data(), str.size()); |
| } |
| |
| void ViewerPlaintext::WriteOutput(const char* str, size_t size) { |
| bool write_stdout_result = |
| base::WriteFileDescriptor(STDOUT_FILENO, str, size); |
| CHECK(write_stdout_result); |
| } |
| |
| } // namespace croslog |