Merge "logd: klogd crash" am: e23e0914ff
am: 5118d8f633
Change-Id: Ibcf55215052496a9d8132e3e6826ecd6e24fea52
This commit is contained in:
commit
73ded18d31
1 changed files with 97 additions and 99 deletions
196
logd/LogKlog.cpp
196
logd/LogKlog.cpp
|
|
@ -605,126 +605,124 @@ int LogKlog::log(const char *buf, size_t len) {
|
||||||
const char *tag = "";
|
const char *tag = "";
|
||||||
const char *etag = tag;
|
const char *etag = tag;
|
||||||
size_t taglen = len - (p - buf);
|
size_t taglen = len - (p - buf);
|
||||||
if (!isspace(*p) && *p) {
|
const char *bt = p;
|
||||||
const char *bt, *et, *cp;
|
|
||||||
|
|
||||||
bt = p;
|
static const char infoBrace[] = "[INFO]";
|
||||||
if ((taglen >= 6) && !fast<strncmp>(p, "[INFO]", 6)) {
|
static const size_t infoBraceLen = strlen(infoBrace);
|
||||||
// <PRI>[<TIME>] "[INFO]"<tag> ":" message
|
if ((taglen >= infoBraceLen) && !fast<strncmp>(p, infoBrace, infoBraceLen)) {
|
||||||
bt = p + 6;
|
// <PRI>[<TIME>] "[INFO]"<tag> ":" message
|
||||||
taglen -= 6;
|
bt = p + infoBraceLen;
|
||||||
}
|
taglen -= infoBraceLen;
|
||||||
for(et = bt; taglen && *et && (*et != ':') && !isspace(*et); ++et, --taglen) {
|
}
|
||||||
// skip ':' within [ ... ]
|
|
||||||
if (*et == '[') {
|
|
||||||
while (taglen && *et && *et != ']') {
|
|
||||||
++et;
|
|
||||||
--taglen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(cp = et; taglen && isspace(*cp); ++cp, --taglen);
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
|
const char *et;
|
||||||
|
for (et = bt; taglen && *et && (*et != ':') && !isspace(*et); ++et, --taglen) {
|
||||||
|
// skip ':' within [ ... ]
|
||||||
|
if (*et == '[') {
|
||||||
|
while (taglen && *et && *et != ']') {
|
||||||
|
++et;
|
||||||
|
--taglen;
|
||||||
|
}
|
||||||
|
if (!taglen) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const char *cp;
|
||||||
|
for (cp = et; taglen && isspace(*cp); ++cp, --taglen);
|
||||||
|
|
||||||
|
// Validate tag
|
||||||
|
size_t size = et - bt;
|
||||||
|
if (taglen && size) {
|
||||||
if (*cp == ':') {
|
if (*cp == ':') {
|
||||||
|
// ToDo: handle case insensitive colon separated logging stutter:
|
||||||
|
// <tag> : <tag>: ...
|
||||||
|
|
||||||
// One Word
|
// One Word
|
||||||
tag = bt;
|
tag = bt;
|
||||||
etag = et;
|
etag = et;
|
||||||
p = cp + 1;
|
p = cp + 1;
|
||||||
} else if (taglen) {
|
} else if ((taglen > size) && (tolower(*bt) == tolower(*cp))) {
|
||||||
size = et - bt;
|
// clean up any tag stutter
|
||||||
if ((taglen > size) && // enough space for match plus trailing :
|
if (!fast<strncasecmp>(bt + 1, cp + 1, size - 1)) { // no match
|
||||||
(*bt == *cp) && // ubber fast<strncmp> pair
|
// <PRI>[<TIME>] <tag> <tag> : message
|
||||||
fast<strncmp>(bt + 1, cp + 1, size - 1)) {
|
// <PRI>[<TIME>] <tag> <tag>: message
|
||||||
// <PRI>[<TIME>] <tag>_host '<tag>.<num>' : message
|
// <PRI>[<TIME>] <tag> '<tag>.<num>' : message
|
||||||
if (!fast<strncmp>(bt + size - 5, "_host", 5)
|
// <PRI>[<TIME>] <tag> '<tag><num>' : message
|
||||||
&& !fast<strncmp>(bt + 1, cp + 1, size - 6)) {
|
// <PRI>[<TIME>] <tag> '<tag><stuff>' : message
|
||||||
|
const char *b = cp;
|
||||||
|
cp += size;
|
||||||
|
taglen -= size;
|
||||||
|
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
||||||
|
const char *e;
|
||||||
|
for (e = cp; taglen && isspace(*cp); ++cp, --taglen);
|
||||||
|
if (taglen && (*cp == ':')) {
|
||||||
|
tag = b;
|
||||||
|
etag = e;
|
||||||
|
p = cp + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// what about <PRI>[<TIME>] <tag>_host '<tag><stuff>' : message
|
||||||
|
static const char host[] = "_host";
|
||||||
|
static const size_t hostlen = strlen(host);
|
||||||
|
if ((size > hostlen) &&
|
||||||
|
!fast<strncmp>(bt + size - hostlen, host, hostlen) &&
|
||||||
|
!fast<strncmp>(bt + 1, cp + 1, size - hostlen - 1)) {
|
||||||
const char *b = cp;
|
const char *b = cp;
|
||||||
cp += size - 5;
|
cp += size - hostlen;
|
||||||
taglen -= size - 5;
|
taglen -= size - hostlen;
|
||||||
if (*cp == '.') {
|
if (*cp == '.') {
|
||||||
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
||||||
const char *e;
|
const char *e;
|
||||||
for(e = cp; taglen && isspace(*cp); ++cp, --taglen);
|
for (e = cp; taglen && isspace(*cp); ++cp, --taglen);
|
||||||
if (*cp == ':') {
|
if (taglen && (*cp == ':')) {
|
||||||
tag = b;
|
tag = b;
|
||||||
etag = e;
|
etag = e;
|
||||||
p = cp + 1;
|
p = cp + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
goto twoWord;
|
||||||
const char *e;
|
|
||||||
for(e = cp; taglen && isspace(*cp); ++cp, --taglen);
|
|
||||||
// Two words
|
|
||||||
if (*cp == ':') {
|
|
||||||
tag = bt;
|
|
||||||
etag = e;
|
|
||||||
p = cp + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (isspace(cp[size])) {
|
|
||||||
cp += size;
|
|
||||||
taglen -= size;
|
|
||||||
while (--taglen && isspace(*++cp));
|
|
||||||
// <PRI>[<TIME>] <tag> <tag> : message
|
|
||||||
if (*cp == ':') {
|
|
||||||
tag = bt;
|
|
||||||
etag = et;
|
|
||||||
p = cp + 1;
|
|
||||||
}
|
|
||||||
} else if (cp[size] == ':') {
|
|
||||||
// <PRI>[<TIME>] <tag> <tag> : message
|
|
||||||
tag = bt;
|
|
||||||
etag = et;
|
|
||||||
p = cp + size + 1;
|
|
||||||
} else if ((cp[size] == '.') || isdigit(cp[size])) {
|
|
||||||
// <PRI>[<TIME>] <tag> '<tag>.<num>' : message
|
|
||||||
// <PRI>[<TIME>] <tag> '<tag><num>' : message
|
|
||||||
const char *b = cp;
|
|
||||||
cp += size;
|
|
||||||
taglen -= size;
|
|
||||||
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
|
||||||
const char *e = cp;
|
|
||||||
while (taglen && isspace(*cp)) {
|
|
||||||
++cp;
|
|
||||||
--taglen;
|
|
||||||
}
|
|
||||||
if (*cp == ':') {
|
|
||||||
tag = b;
|
|
||||||
etag = e;
|
|
||||||
p = cp + 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
|
||||||
const char *e = cp;
|
|
||||||
while (taglen && isspace(*cp)) {
|
|
||||||
++cp;
|
|
||||||
--taglen;
|
|
||||||
}
|
|
||||||
// Two words
|
|
||||||
if (*cp == ':') {
|
|
||||||
tag = bt;
|
|
||||||
etag = e;
|
|
||||||
p = cp + 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* else no tag */
|
} else {
|
||||||
size = etag - tag;
|
// <PRI>[<TIME>] <tag> <stuff>' : message
|
||||||
if ((size <= 1)
|
twoWord: while (--taglen && !isspace(*++cp) && (*cp != ':'));
|
||||||
// register names like x9
|
const char *e;
|
||||||
|| ((size == 2) && (isdigit(tag[0]) || isdigit(tag[1])))
|
for (e = cp; taglen && isspace(*cp); ++cp, --taglen);
|
||||||
// register names like x18 but not driver names like en0
|
// Two words
|
||||||
|| ((size == 3) && (isdigit(tag[1]) && isdigit(tag[2])))
|
if (taglen && (*cp == ':')) {
|
||||||
// blacklist
|
tag = bt;
|
||||||
|| ((size == 3) && !fast<strncmp>(tag, "CPU", 3))
|
etag = e;
|
||||||
|| ((size == 7) && !fast<strncasecmp>(tag, "WARNING", 7))
|
p = cp + 1;
|
||||||
|| ((size == 5) && !fast<strncasecmp>(tag, "ERROR", 5))
|
}
|
||||||
|| ((size == 4) && !fast<strncasecmp>(tag, "INFO", 4))) {
|
|
||||||
p = start;
|
|
||||||
etag = tag = "";
|
|
||||||
}
|
}
|
||||||
|
} // else no tag
|
||||||
|
|
||||||
|
static const char cpu[] = "CPU";
|
||||||
|
static const size_t cpuLen = strlen(cpu);
|
||||||
|
static const char warning[] = "WARNING";
|
||||||
|
static const size_t warningLen = strlen(warning);
|
||||||
|
static const char error[] = "ERROR";
|
||||||
|
static const size_t errorLen = strlen(error);
|
||||||
|
static const char info[] = "INFO";
|
||||||
|
static const size_t infoLen = strlen(info);
|
||||||
|
|
||||||
|
size = etag - tag;
|
||||||
|
if ((size <= 1)
|
||||||
|
// register names like x9
|
||||||
|
|| ((size == 2) && (isdigit(tag[0]) || isdigit(tag[1])))
|
||||||
|
// register names like x18 but not driver names like en0
|
||||||
|
|| ((size == 3) && (isdigit(tag[1]) && isdigit(tag[2])))
|
||||||
|
// blacklist
|
||||||
|
|| ((size == cpuLen) && !fast<strncmp>(tag, cpu, cpuLen))
|
||||||
|
|| ((size == warningLen) && !fast<strncasecmp>(tag, warning, warningLen))
|
||||||
|
|| ((size == errorLen) && !fast<strncasecmp>(tag, error, errorLen))
|
||||||
|
|| ((size == infoLen) && !fast<strncasecmp>(tag, info, infoLen))) {
|
||||||
|
p = start;
|
||||||
|
etag = tag = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Suppress additional stutter in tag:
|
// Suppress additional stutter in tag:
|
||||||
// eg: [143:healthd]healthd -> [143:healthd]
|
// eg: [143:healthd]healthd -> [143:healthd]
|
||||||
taglen = etag - tag;
|
taglen = etag - tag;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue