log_filter.cpp
Go to the documentation of this file.
1 
28 #include <log_view/log_filter.h>
29 
30 #include <log_view/utils.h>
31 
32 namespace log_view {
33 
34 LogFilter::LogFilter(LogStorePtr& logs) : logs_(logs)
35 {
36 
37 }
38 
39 void LogFilter::setFilter(const std::string& filter) {
40  filter_string_ = filter;
41  auto filter_list = split(filter, ';');
42  bool changed = filter_list.size() != filter_list_.size();
43 
44  for (size_t i = 0; i < filter_list_.size() && !changed; i++) {
45  if (filter_list_[i] != filter_list[i]) {
46  changed = true;
47  }
48  }
49 
50  filter_list_ = filter_list;
51 
52  if (changed) {
53  reset();
54  }
55 }
56 
57 void LogFilter::setExclude(const std::string& exclude) {
58  auto exclude_list = split(exclude, ';');
59  bool changed = exclude_list.size() != exclude_list_.size();
60 
61  for (size_t i = 0; i < exclude_list_.size() && !changed; i++) {
62  if (exclude_list_[i] != exclude_list[i]) {
63  changed = true;
64  }
65  }
66 
67  exclude_list_ = exclude_list;
68 
69  if (changed) {
70  reset();
71  }
72 }
73 
74 void LogFilter::setDebugLevel(bool enable) {
75  if (debug_level_ != enable) {
76  debug_level_ = enable;
77  reset();
78  }
79 }
80 
81 void LogFilter::setInfoLevel(bool enable) {
82  if (info_level_ != enable) {
83  info_level_ = enable;
84  reset();
85  }
86 }
87 
88 void LogFilter::setWarnLevel(bool enable) {
89  if (warn_level_ != enable) {
90  warn_level_ = enable;
91  reset();
92  }
93 }
94 
95 void LogFilter::setErrorLevel(bool enable) {
96  if (error_level_ != enable) {
97  error_level_ = enable;
98  reset();
99  }
100 }
101 
102 void LogFilter::setFatalLevel(bool enable) {
103  if (fatal_level_ != enable) {
104  fatal_level_ = enable;
105  reset();
106  }
107 }
108 
110  if (filter_nodes_ != enable) {
111  filter_nodes_ = enable;
112  reset();
113  }
114 }
115 
116 void LogFilter::toggleNode(const std::string& node) {
117  auto element = nodes_.find(node);
118  if (element != nodes_.end()) {
119  element->second.exclude = !element->second.exclude;
120 
121  filter_nodes_ = true;
122  reset();
123  }
124 }
125 
127  bool filter_nodes = filter_nodes_;
128  for (auto& elem: nodes_) {
129  elem.second.exclude = false;
130  }
131 
132  filter_nodes_ = true;
133  reset();
134 }
135 
137  filter_nodes_ = true;
138  for (auto& elem: nodes_) {
139  elem.second.exclude = !elem.second.exclude;
140  }
141 
142  reset();
143 }
144 
145 
147  log_indices_.clear();
148  cursor_ = -1;
149  clearSelect();
150  latest_log_index_ = logs_->size();
152  if (earliest_log_index_ > 0) {
154  }
155 }
156 
158  const auto& logs = logs_->logs();
159 
160  // TODO process for 50 ms to avoid hogging the screen if there is a backlog
161 
162  for (;latest_log_index_ < logs.size(); latest_log_index_++) {
163  if (accepted(logs[latest_log_index_], true)) {
164  for (size_t i = 0; i < logs[latest_log_index_].text.size(); i++) {
165  log_indices_.push_back({latest_log_index_, i});
166  }
167  }
168  }
169 }
170 
172  const auto& logs = logs_->logs();
173 
174  // TODO process for 50 ms instead of fixed 1000
175 
176  for (size_t i = 0; earliest_log_index_ != 0 && i < 1000; earliest_log_index_--, i++)
177  {
178  if (accepted(logs[earliest_log_index_])) {
179  size_t lines = logs[earliest_log_index_].text.size();
180  for (size_t j = 1; j <= lines; j++) {
181  log_indices_.push_front({earliest_log_index_, lines - j});
182  if (cursor_ >= 0) {
183  cursor_++;
184  }
185  if (select_start_ >= 0) {
186  select_end_++;
187  select_start_++;
188  }
189  if (search_cursor_ >= 0) {
190  search_cursor_++;
191  }
192  if (search_cursor_fwd_ >= 0) {
195  }
196  }
197  }
198  }
199 
200  if (search_cursor_ == -1 && !search_.empty() && !log_indices_.empty()) {
202  size_t max_idx = search_cursor_fwd_ + 1000;
203  for (size_t i = search_cursor_fwd_; i < max_idx && i < log_indices_.size(); i++) {
204  auto& index = log_indices_[i];
205  search_cursor_fwd_ = i + 1;
206  if (contains(logs[index.index].text[index.line], search_, true)) {
207  search_cursor_ = i;
208  cursor_ = i + cursor_offset_;
209  break;
210  }
211  }
212  }
213 
215  int64_t min_idx = search_cursor_rev_ - 1000;
216  for (int64_t i = search_cursor_rev_; i > min_idx && i >= 0; i--) {
217  auto& index = log_indices_[i];
218  search_cursor_rev_ = std::max(static_cast<int64_t>(0), i - 1);
219  if (contains(logs[index.index].text[index.line], search_, true)) {
220  search_cursor_ = i;
221  cursor_ = i + 1;
222  break;
223  }
224  }
225  }
226  }
227 }
228 
229 void LogFilter::setCursor(int64_t index) {
230  cursor_ = index;
231 }
232 
234  return cursor_;
235 }
236 
238  select_start_ = -1;
239  select_end_ = -1;
240 }
241 
242 void LogFilter::setSelectStart(int64_t index) {
243  select_start_ = index;
244  select_end_ = index;
245 }
246 
248  return select_start_;
249 }
250 
251 void LogFilter::setSelectEnd(int64_t index) {
252  select_end_ = index;
253 }
254 
256  return select_end_;
257 }
258 
259 void LogFilter::search(const std::string& pattern) {
260  search_ = pattern;
261 
263  search_cursor_ = -1;
264 
265  int64_t cursor = cursor_;
266  if (cursor < 0) {
267  cursor = log_indices_.size();
268  cursor--;
269  }
270 
271  search_cursor_fwd_ = cursor;
272  search_cursor_rev_ = cursor;
273 }
274 
277  search_cursor_ = -1;
278 
279  int64_t cursor = cursor_;
280  if (cursor < 0) {
281  cursor = log_indices_.size();
282  cursor--;
283  }
284 
285  search_cursor_fwd_ = cursor + 1;
286 }
287 
290  search_cursor_ = -1;
291 
292  int64_t cursor = cursor_;
293  if (cursor < 0) {
294  cursor = log_indices_.size();
295  cursor--;
296  }
297 
298  search_cursor_rev_ = std::max(static_cast<int64_t>(0), cursor - (cursor_offset_ + 1));
299 }
300 
302  search_.clear();
303  search_cursor_ = -1;
304  search_cursor_fwd_ = -1;
305  search_cursor_rev_ = -1;
306 }
307 
308 bool LogFilter::accepted(const LogEntry& entry, bool new_entry) {
309  bool include = filter_list_.empty();
310 
311  auto node = nodes_.find(entry.node);
312  if (node == nodes_.end()) {
313  nodes_[entry.node].exclude = true;
314  nodes_[entry.node].count = 1;
315  }
316  else if (new_entry) {
317  node->second.count++;
318  }
319 
320  if (entry.level == rosgraph_msgs::Log::DEBUG) {
321  if (!debug_level_) {
322  return false;
323  }
324  }
325  else if (entry.level == rosgraph_msgs::Log::INFO) {
326  if (!info_level_) {
327  return false;
328  }
329  }
330  else if (entry.level == rosgraph_msgs::Log::WARN) {
331  if (!warn_level_) {
332  return false;
333  }
334  }
335  else if (entry.level == rosgraph_msgs::Log::ERROR) {
336  if (!error_level_) {
337  return false;
338  }
339  }
340  else if (entry.level == rosgraph_msgs::Log::FATAL) {
341  if (!fatal_level_) {
342  return false;
343  }
344  }
345 
346  if (filter_nodes_ && nodes_[entry.node].exclude) {
347  return false;
348  }
349 
350  for (const auto& filter: filter_list_) {
351  for (const auto& line: entry.text) {
352  if (contains(line, filter, true)) {
353  include = true;
354  break;
355  }
356  }
357  }
358 
359  if (include) {
360  for (const auto& exclude: exclude_list_) {
361  for (const auto& line: entry.text) {
362  if (contains(line, exclude, true)) {
363  include = false;
364  break;
365  }
366  }
367  }
368  }
369 
370  return include;
371 }
372 
373 
374 } // namespace log_view
LogStorePtr logs_
Definition: log_filter.h:98
std::vector< std::string > filter_list_
Definition: log_filter.h:123
int64_t search_cursor_fwd_
Definition: log_filter.h:92
void setDebugLevel(bool enable)
Definition: log_filter.cpp:74
void setEnableNodeFilter(bool enable)
Definition: log_filter.cpp:109
std::vector< std::string > split(const std::string &text, char sep)
Definition: utils.cpp:44
std::shared_ptr< LogStore > LogStorePtr
Definition: log_store.h:55
void search(const std::string &pattern)
Definition: log_filter.cpp:259
size_t earliest_log_index_
Definition: log_filter.h:102
void setErrorLevel(bool enable)
Definition: log_filter.cpp:95
void setCursor(int64_t index)
Definition: log_filter.cpp:229
void setInfoLevel(bool enable)
Definition: log_filter.cpp:81
void toggleNode(const std::string &node)
Definition: log_filter.cpp:116
int64_t getSelectEnd()
Definition: log_filter.cpp:255
int64_t cursor_offset_
Definition: log_filter.h:108
bool contains(const std::string &text, const std::string &substr, bool case_insensitive)
Definition: utils.cpp:67
size_t latest_log_index_
Definition: log_filter.h:101
bool accepted(const LogEntry &entry, bool new_entry=false)
Definition: log_filter.cpp:308
void setSelectStart(int64_t index)
Definition: log_filter.cpp:242
void setFatalLevel(bool enable)
Definition: log_filter.cpp:102
std::map< std::string, NodeData > nodes_
Definition: log_filter.h:126
std::string node
Definition: datatypes.h:60
int64_t search_cursor_rev_
Definition: log_filter.h:93
void setExclude(const std::string &exclude)
Definition: log_filter.cpp:57
std::string search_
Definition: log_filter.h:111
std::string filter_string_
Definition: log_filter.h:121
int64_t search_cursor_
Definition: log_filter.h:91
int64_t getSelectStart()
Definition: log_filter.cpp:247
void setFilter(const std::string &filter)
Definition: log_filter.cpp:39
std::vector< std::string > text
Definition: datatypes.h:64
void setWarnLevel(bool enable)
Definition: log_filter.cpp:88
void setSelectEnd(int64_t index)
Definition: log_filter.cpp:251
std::vector< std::string > exclude_list_
Definition: log_filter.h:124
std::deque< LogLine > log_indices_
Definition: log_filter.h:100
LogFilter(LogStorePtr &logs)
Definition: log_filter.cpp:34


log_view
Author(s): Marc Alban
autogenerated on Thu Mar 4 2021 03:21:52