OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/log_private/syslog_parser.h" | 5 #include "chrome/browser/extensions/api/log_private/syslog_parser.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/linked_ptr.h" | 11 #include "base/memory/linked_ptr.h" |
12 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
15 #include "base/strings/string_tokenizer.h" | 15 #include "base/strings/string_tokenizer.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "chrome/browser/extensions/api/log_private/filter_handler.h" | 17 #include "chrome/browser/extensions/api/log_private/filter_handler.h" |
18 #include "chrome/browser/extensions/api/log_private/log_parser.h" | 18 #include "chrome/browser/extensions/api/log_private/log_parser.h" |
19 #include "chrome/browser/extensions/api/log_private/log_private_api.h" | 19 #include "chrome/browser/extensions/api/log_private/log_private_api.h" |
20 #include "chrome/common/extensions/api/log_private.h" | 20 #include "chrome/common/extensions/api/log_private.h" |
21 | 21 |
22 namespace extensions { | 22 namespace extensions { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const int kExpectedTimeTokenNum = 7; | 26 const int kExpectedTimeTokenNum = 17; |
27 const char kLogEntryDelimiters[] = "-:T"; | 27 const char kLogEntryDelimiters[] = "-+.:T"; |
28 const char kProcessInfoDelimiters[] = "[]"; | 28 const char kProcessInfoDelimiters[] = "[]"; |
29 | 29 |
30 } // namespace | 30 } // namespace |
31 | 31 |
32 SyslogParser::SyslogParser() {} | 32 SyslogParser::SyslogParser() {} |
33 | 33 |
34 SyslogParser::~SyslogParser() {} | 34 SyslogParser::~SyslogParser() {} |
35 | 35 |
36 SyslogParser::Error SyslogParser::ParseEntry( | 36 SyslogParser::Error SyslogParser::ParseEntry( |
37 const std::string& input, | 37 const std::string& input, |
(...skipping 26 matching lines...) Expand all Loading... | |
64 ParseLevel(input, entry.get()); | 64 ParseLevel(input, entry.get()); |
65 entry->full_entry = input; | 65 entry->full_entry = input; |
66 | 66 |
67 if (filter_handler->IsValidLogEntry(*(entry.get()))) { | 67 if (filter_handler->IsValidLogEntry(*(entry.get()))) { |
68 output->push_back(entry); | 68 output->push_back(entry); |
69 } | 69 } |
70 | 70 |
71 return SyslogParser::SUCCESS; | 71 return SyslogParser::SUCCESS; |
72 } | 72 } |
73 | 73 |
74 SyslogParser::Error ParseTimeHelper(base::StringTokenizer* tokenizer, | 74 SyslogParser::Error ParseTimeHelper(base::StringTokenizer& tokenizer, |
75 std::string* output) { | 75 std::string& output) { |
not at google - send to devlin
2014/05/05 19:36:24
if these are refs they need to be const.
but give
Thiemo Nagel
2014/05/06 18:15:49
I wasn't aware of that convention. Thanks a lot!
| |
76 if (!tokenizer->GetNext()) { | 76 if (!tokenizer.GetNext()) { |
77 LOG(ERROR) << "Error when parsing time"; | 77 LOG(ERROR) << "Error when parsing time"; |
78 return SyslogParser::PARSE_ERROR; | 78 return SyslogParser::PARSE_ERROR; |
79 } | 79 } |
80 *output = tokenizer->token(); | 80 output = tokenizer.token(); |
81 return SyslogParser::SUCCESS; | 81 return SyslogParser::SUCCESS; |
82 } | 82 } |
83 | 83 |
84 SyslogParser::Error SyslogParser::ParseTime(const std::string& input, | 84 SyslogParser::Error SyslogParser::ParseTime(const std::string& input, |
85 double* output) const { | 85 double* output) const { |
86 base::StringTokenizer tokenizer(input, kLogEntryDelimiters); | 86 base::StringTokenizer tokenizer(input, kLogEntryDelimiters); |
87 tokenizer.set_options(base::StringTokenizer::RETURN_DELIMS); | |
87 std::string tokens[kExpectedTimeTokenNum]; | 88 std::string tokens[kExpectedTimeTokenNum]; |
88 for (int i = 0; i < kExpectedTimeTokenNum; i++) { | 89 for (int i = 0; i < kExpectedTimeTokenNum; i++) { |
89 if (ParseTimeHelper(&tokenizer, &(tokens[i])) != SyslogParser::SUCCESS) | 90 if (ParseTimeHelper(tokenizer, tokens[i]) != SyslogParser::SUCCESS) |
90 return SyslogParser::PARSE_ERROR; | 91 return SyslogParser::PARSE_ERROR; |
91 } | 92 } |
92 | 93 |
93 std::string buffer = tokens[1] + '-' + tokens[2] + '-' + tokens[0] + ' ' + | 94 DCHECK(tokens[1] == "-"); |
94 tokens[3] + ':' + tokens[4] + ":00"; | 95 DCHECK(tokens[3] == "-"); |
96 DCHECK(tokens[5] == "T"); | |
97 DCHECK(tokens[7] == ":"); | |
98 DCHECK(tokens[9] == ":"); | |
99 DCHECK(tokens[11] == "."); | |
100 DCHECK(tokens[15] == ":"); | |
not at google - send to devlin
2014/05/05 19:36:24
DCHECKs here seem wrong especially since we can re
Thiemo Nagel
2014/05/06 18:15:49
OK. Done.
| |
101 | |
102 std::string buffer = | |
103 tokens[2] + "/" + tokens[4] + "/" + tokens[0] + " " + // month/day/year | |
104 tokens[6] + ":" + tokens[8] + ":" + tokens[10] + " " + // hour:min:sec | |
105 tokens[13] + tokens[14] + tokens[16]; // +/- tz offset | |
not at google - send to devlin
2014/05/05 19:36:24
maybe have a look at sscanf[_s] here? surely there
Thiemo Nagel
2014/05/06 18:15:49
Could you please explain what specifically you'd s
not at google - send to devlin
2014/05/06 18:24:51
The code is very hard to read. De-formatting it us
| |
95 | 106 |
96 base::Time parsed_time; | 107 base::Time parsed_time; |
97 if (!base::Time::FromString(buffer.c_str(), &parsed_time)) { | 108 if (!base::Time::FromString(buffer.c_str(), &parsed_time)) { |
98 LOG(ERROR) << "Error when parsing time"; | 109 LOG(ERROR) << "Error when parsing time"; |
99 return SyslogParser::PARSE_ERROR; | 110 return SyslogParser::PARSE_ERROR; |
100 } | 111 } |
101 | 112 |
102 double seconds; | 113 double seconds; |
103 base::StringToDouble(tokens[5], &seconds); | 114 base::StringToDouble("." + tokens[12], &seconds); |
104 *output = parsed_time.ToJsTime() + | 115 *output = parsed_time.ToJsTime() + |
105 (seconds * base::Time::kMillisecondsPerSecond); | 116 (seconds * base::Time::kMillisecondsPerSecond); |
106 | 117 |
107 return SyslogParser::SUCCESS; | 118 return SyslogParser::SUCCESS; |
108 } | 119 } |
109 | 120 |
110 SyslogParser::Error SyslogParser::ParseProcess( | 121 SyslogParser::Error SyslogParser::ParseProcess( |
111 const std::string& input, | 122 const std::string& input, |
112 api::log_private::LogEntry* entry) const { | 123 api::log_private::LogEntry* entry) const { |
113 base::StringTokenizer tokenizer(input, kProcessInfoDelimiters); | 124 base::StringTokenizer tokenizer(input, kProcessInfoDelimiters); |
(...skipping 21 matching lines...) Expand all Loading... | |
135 } else if (input.find("WARN") != std::string::npos) { | 146 } else if (input.find("WARN") != std::string::npos) { |
136 entry->level = "warning"; | 147 entry->level = "warning"; |
137 } else if (input.find("INFO") != std::string::npos) { | 148 } else if (input.find("INFO") != std::string::npos) { |
138 entry->level = "info"; | 149 entry->level = "info"; |
139 } else { | 150 } else { |
140 entry->level = "unknown"; | 151 entry->level = "unknown"; |
141 } | 152 } |
142 } | 153 } |
143 | 154 |
144 } // namespace extensions | 155 } // namespace extensions |
OLD | NEW |