diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2015-07-14 08:43:55 +0200 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2015-07-04 21:37:54 +0200 |
commit | 907d046c8929fb74e5a3502a9498198695e62ad8 (patch) | |
tree | 442796bb76a052daa6f2ecc17c57f7245f801353 /log | |
parent | ab5b47397cc143798ba2f367f04579e5b5b82070 (diff) | |
download | ubox-907d046c8929fb74e5a3502a9498198695e62ad8.tar.gz |
log: allow filtering messages with a regexp pattern
This allows printing/streaming/writing messages matching a specified
basic regular expression only.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Diffstat (limited to 'log')
-rw-r--r-- | log/logread.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/log/logread.c b/log/logread.c index 6255408..dcf3c08 100644 --- a/log/logread.c +++ b/log/logread.c @@ -17,6 +17,7 @@ #include <fcntl.h> #include <time.h> +#include <regex.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> @@ -57,7 +58,8 @@ static const struct blobmsg_policy log_policy[] = { static struct uloop_timeout retry; static struct uloop_fd sender; -static const char *log_file, *log_ip, *log_port, *log_prefix, *pid_file, *hostname; +static regex_t regexp_preg; +static const char *log_file, *log_ip, *log_port, *log_prefix, *pid_file, *hostname, *regexp_pattern; static int log_type = LOG_STDOUT; static int log_size, log_udp, log_follow, log_trailer_null = 0; @@ -128,6 +130,9 @@ static int log_notify(struct blob_attr *msg) } m = blobmsg_get_string(tb[LOG_MSG]); + if (regexp_pattern && + regexec(®exp_preg, m, 0, NULL, 0) == REG_NOMATCH) + return 0; t = blobmsg_get_u64(tb[LOG_TIME]) / 1000; c = ctime(&t); p = blobmsg_get_u32(tb[LOG_PRIO]); @@ -186,6 +191,7 @@ static int usage(const char *prog) "Options:\n" " -s <path> Path to ubus socket\n" " -l <count> Got only the last 'count' messages\n" + " -e <pattern> Filter messages with a regexp\n" " -r <server> <port> Stream message to a server\n" " -F <file> Log file\n" " -S <bytes> Log size\n" @@ -235,7 +241,7 @@ int main(int argc, char **argv) signal(SIGPIPE, SIG_IGN); - while ((ch = getopt(argc, argv, "u0fcs:l:r:F:p:S:P:h:")) != -1) { + while ((ch = getopt(argc, argv, "u0fcs:l:r:F:p:S:P:h:e:")) != -1) { switch (ch) { case 'u': log_udp = 1; @@ -274,6 +280,11 @@ int main(int argc, char **argv) case 'h': hostname = optarg; break; + case 'e': + if (!regcomp(®exp_preg, optarg, REG_NOSUB)) { + regexp_pattern = optarg; + } + break; default: return usage(*argv); } |