blob: f99fe4c288c2345418adb10b5e81a6052d4c7d5a [file] [log] [blame]
Austin Schuh47aabde2020-10-10 17:46:37 -07001#include <sys/resource.h>
2#include <sys/time.h>
3
James Kuszmaul38735e82019-12-07 16:42:06 -08004#include "aos/configuration.h"
Austin Schuhb06f03b2021-02-17 22:00:37 -08005#include "aos/events/logging/log_writer.h"
Austin Schuh48d10d62022-10-16 22:19:23 -07006#ifdef LZMA
7#include "aos/events/logging/lzma_encoder.h"
8#endif
Philipp Schrader790cb542023-07-05 21:06:52 -07009#include "gflags/gflags.h"
10#include "glog/logging.h"
11
James Kuszmauldd0a5042021-10-28 23:38:04 -070012#include "aos/events/logging/snappy_encoder.h"
James Kuszmaul38735e82019-12-07 16:42:06 -080013#include "aos/events/shm_event_loop.h"
14#include "aos/init.h"
Brian Silvermand90905f2020-09-23 14:42:56 -070015#include "aos/logging/log_namer.h"
James Kuszmaul38735e82019-12-07 16:42:06 -080016
colleen61276dc2023-06-01 09:23:29 -070017DEFINE_bool(direct, false,
18 "If true, write using O_DIRECT and write 512 byte aligned blocks "
19 "whenever possible.");
20
Austin Schuhc5fa6d92022-02-25 14:36:28 -080021DEFINE_string(config, "aos_config.json", "Config file to use.");
James Kuszmaul38735e82019-12-07 16:42:06 -080022
Austin Schuh27553152020-11-18 21:26:37 -080023DEFINE_bool(skip_renicing, false,
24 "If true, skip renicing the logger. This leaves it lower priority "
25 "and increases the likelihood of dropping messages and crashing.");
26
James Kuszmauldd0a5042021-10-28 23:38:04 -070027DEFINE_bool(snappy_compress, false, "If true, compress log data using snappy.");
28
Austin Schuh48d10d62022-10-16 22:19:23 -070029#ifdef LZMA
30DEFINE_bool(xz_compress, false, "If true, compress log data using xz.");
31#endif
32
Milind Upadhyayb2b8cd82022-03-21 08:51:32 -070033DEFINE_double(rotate_every, 0.0,
34 "If set, rotate the logger after this many seconds");
35
Austin Schuh48d10d62022-10-16 22:19:23 -070036#ifdef LZMA
37DEFINE_int32(xz_compression_level, 9, "Compression level for the LZMA Encoder");
38#endif
39
Austin Schuh8bdfc492023-02-11 12:53:13 -080040DECLARE_int32(flush_size);
41
James Kuszmaul38735e82019-12-07 16:42:06 -080042int main(int argc, char *argv[]) {
43 gflags::SetUsageMessage(
44 "This program provides a simple logger binary that logs all SHMEM data "
45 "directly to a file specified at the command line. It does not manage "
46 "filenames, so it will just crash if you attempt to overwrite an "
47 "existing file, and the user must specify the logfile manually at the "
48 "command line.");
49 aos::InitGoogle(&argc, &argv);
50
51 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
52 aos::configuration::ReadConfig(FLAGS_config);
53
54 aos::ShmEventLoop event_loop(&config.message());
55
Alexei Strots01395492023-03-20 13:59:56 -070056 auto log_namer = std::make_unique<aos::logger::MultiNodeFilesLogNamer>(
colleen61276dc2023-06-01 09:23:29 -070057 &event_loop, std::make_unique<aos::logger::RenamableFileBackend>(
58 absl::StrCat(aos::logging::GetLogName("fbs_log"), "/"),
59 FLAGS_direct));
Austin Schuhcde938c2020-02-02 17:30:07 -080060
James Kuszmauldd0a5042021-10-28 23:38:04 -070061 if (FLAGS_snappy_compress) {
62 log_namer->set_extension(aos::logger::SnappyDecoder::kExtension);
Austin Schuh48d10d62022-10-16 22:19:23 -070063 log_namer->set_encoder_factory([](size_t max_message_size) {
Austin Schuh8bdfc492023-02-11 12:53:13 -080064 return std::make_unique<aos::logger::SnappyEncoder>(max_message_size,
65 FLAGS_flush_size);
Austin Schuh48d10d62022-10-16 22:19:23 -070066 });
67#ifdef LZMA
68 } else if (FLAGS_xz_compress) {
69 log_namer->set_extension(aos::logger::LzmaEncoder::kExtension);
70 log_namer->set_encoder_factory([](size_t max_message_size) {
71 return std::make_unique<aos::logger::LzmaEncoder>(
Austin Schuh8bdfc492023-02-11 12:53:13 -080072 max_message_size, FLAGS_xz_compression_level, FLAGS_flush_size);
Austin Schuh48d10d62022-10-16 22:19:23 -070073 });
74#endif
James Kuszmauldd0a5042021-10-28 23:38:04 -070075 }
76
Austin Schuhb4674632022-09-19 19:12:13 -070077 aos::monotonic_clock::time_point last_rotation_time =
78 event_loop.monotonic_now();
Brian Silverman1f345222020-09-24 21:14:48 -070079 aos::logger::Logger logger(&event_loop);
Milind Upadhyayb2b8cd82022-03-21 08:51:32 -070080
81 if (FLAGS_rotate_every != 0.0) {
Austin Schuh2f864452023-07-17 14:53:08 -070082 logger.set_on_logged_period([&](aos::monotonic_clock::time_point t) {
83 if (t > last_rotation_time +
84 std::chrono::duration<double>(FLAGS_rotate_every)) {
Milind Upadhyayb2b8cd82022-03-21 08:51:32 -070085 logger.Rotate();
Austin Schuh2f864452023-07-17 14:53:08 -070086 last_rotation_time = t;
Milind Upadhyayb2b8cd82022-03-21 08:51:32 -070087 }
88 });
89 }
90
Austin Schuh47aabde2020-10-10 17:46:37 -070091 event_loop.OnRun([&log_namer, &logger]() {
Austin Schuh27553152020-11-18 21:26:37 -080092 if (FLAGS_skip_renicing) {
93 LOG(WARNING) << "Ignoring request to renice to -20 due to "
94 "--skip_renicing.";
95 } else {
96 errno = 0;
97 setpriority(PRIO_PROCESS, 0, -20);
98 PCHECK(errno == 0)
99 << ": Renicing to -20 failed, use --skip_renicing to skip renicing.";
100 }
Austin Schuh47aabde2020-10-10 17:46:37 -0700101 logger.StartLogging(std::move(log_namer));
102 });
James Kuszmaul38735e82019-12-07 16:42:06 -0800103
104 event_loop.Run();
105
Austin Schuh2f8fd752020-09-01 22:38:28 -0700106 LOG(INFO) << "Shutting down";
107
James Kuszmaul38735e82019-12-07 16:42:06 -0800108 return 0;
109}