Skip to content

Commit 6ef61aa

Browse files
committed
Implement log filtering
1 parent aeb31ea commit 6ef61aa

File tree

2 files changed

+81
-53
lines changed

2 files changed

+81
-53
lines changed

docker/container.cgi

+48-44
Original file line numberDiff line numberDiff line change
@@ -29,60 +29,64 @@ print ui_tabs_start(\@tabs, 'log', $tab, 1);
2929
# LOGS TAB
3030
my ($max_lines) = $in{'max-lines'} || 50;
3131
print ui_tabs_start_tab('mode', 'log');
32-
my ($failed, $result) = container_logs($container, $max_lines);
32+
my ($failed, $result) = container_logs($container, $max_lines, $in{'filter'} || "", $in{'basic-search'} || 0);
3333
if ($failed) {
34-
print ui_alert_box($failed, 'danger');
35-
} else {
36-
print &ui_form_start("container.cgi");
37-
print &ui_hidden("container", $container),"\n";
38-
print &ui_hidden("tab", "log"),"\n";
39-
print "Auto refresh: " . &ui_select("auto-refresh", html_escape($in{'auto-refresh'}), ["Never", 3, 10, 30, 60]);
40-
print "Show max lines: " . &ui_textbox("max-lines", html_escape($max_lines), 4);
41-
print &ui_submit(text('label_refresh'));
42-
print &ui_form_end(),"<br>\n";
43-
44-
45-
print '
46-
<script type="text/javascript">
47-
{
48-
let refresher;
49-
let selectElement = document.querySelector("select[name=\'auto-refresh\']");
50-
51-
function refreshContainerLog() {
52-
$.get("container.cgi?tab=log&container=' . urlize($container) . '", function (resp) {
53-
let d = $($.parseHTML(resp)).find("pre#container-log");
54-
$("pre#container-log").text(d.text());
55-
});
56-
}
57-
58-
function setupRefresh(refreshPeriod) {
59-
if (refresher) {
60-
clearInterval(refresher);
61-
refresher = null;
62-
}
34+
print ui_alert_box($result, 'danger');
35+
}
6336

64-
if (refreshPeriod == null) {
65-
return;
66-
}
37+
print &ui_form_start("container.cgi");
38+
print &ui_hidden("container", $container),"\n";
39+
print &ui_hidden("tab", "log"),"\n";
40+
print "Auto refresh: " . &ui_select("auto-refresh", html_escape($in{'auto-refresh'}), ["Never", 3, 10, 30, 60]);
41+
print "Show max lines: " . &ui_textbox("max-lines", html_escape($max_lines), 4);
42+
print "Filter: " . &ui_textbox("filter", html_escape($in{'filter'}), 50);
43+
print ui_checkbox("basic-search", 1, "Ignore special", html_escape($in{'basic-search'}));
6744

68-
refresher = setInterval(refreshContainerLog, refreshPeriod * 1000); // Sec to milli
69-
}
45+
print &ui_submit(text('label_refresh'));
46+
print &ui_form_end(),"<br>\n";
7047

71-
selectElement.addEventListener("change", (event) => {
72-
let refreshPeriod = event.target.value == "Never" ? null : event.target.value;
7348

74-
if (!window.jQuery) {
75-
console.log("No jQuery found");
76-
return;
77-
}
49+
print '
50+
<script type="text/javascript">
51+
{
52+
let refresher;
53+
let selectElement = document.querySelector("select[name=\'auto-refresh\']");
7854
79-
setupRefresh(refreshPeriod);
55+
function refreshContainerLog() {
56+
$.get("container.cgi?tab=log&container=' . urlize($container) . '", function (resp) {
57+
let d = $($.parseHTML(resp)).find("pre#container-log");
58+
$("pre#container-log").text(d.text());
8059
});
8160
}
82-
</script>';
8361
84-
print "<pre id='container-log'>" . $result . "</pre>";
62+
function setupRefresh(refreshPeriod) {
63+
if (refresher) {
64+
clearInterval(refresher);
65+
refresher = null;
66+
}
67+
68+
if (refreshPeriod == null) {
69+
return;
70+
}
71+
72+
refresher = setInterval(refreshContainerLog, refreshPeriod * 1000); // Sec to milli
73+
}
74+
75+
selectElement.addEventListener("change", (event) => {
76+
let refreshPeriod = event.target.value == "Never" ? null : event.target.value;
77+
78+
if (!window.jQuery) {
79+
console.log("No jQuery found");
80+
return;
81+
}
82+
83+
setupRefresh(refreshPeriod);
84+
});
8585
}
86+
</script>';
87+
88+
print "<pre id='container-log'>" . $result . "</pre>";
89+
8690
print ui_tabs_end_tab('mode', 'log');
8791

8892
# INSPECT TAB

docker/docker-lib.pl

+33-9
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,42 @@ sub inspect_container
114114

115115
sub container_logs
116116
{
117-
my($container, $max_lines) = @_;
117+
my($container, $max_lines, $filter, $basic_match) = @_;
118+
our (%gconfig);
118119

119-
my ($result, $fail, $code);
120120
my ($maxCommand) = ' -n ' . $max_lines;
121-
122-
my ($code, $result) = docker_command('logs ' . $container . $maxCommand);
123-
124-
if ($code != 0) {
125-
return $result;
126-
}
127121

128-
return 0, $result;
122+
if (length $filter) {
123+
my ($result, $fail, $code);
124+
# Are we supposed to filter anything? Then use grep.
125+
my $docker_command = "docker logs $container " . $maxCommand;
126+
my $eflag = $gconfig{'os_type'} =~ /-linux/ ? "-E" : "";
127+
my $dashflag = $gconfig{'os_type'} =~ /-linux/ ? "--" : "";
128+
129+
my $flags = $basic_match == 1 ? ' -F ' : '-i -a ' . $eflag . ' ' . $dashflag;
130+
131+
$code = execute_command(
132+
$docker_command . ' | grep '. $flags . ' "' . $filter . '"',
133+
undef, \$result, \$fail, 0, 1);
134+
135+
if ($code == 256) { # No results?
136+
return 0, "No matching logs found, try increasing max lines, escaping or ignoring special characters";
137+
}
138+
139+
if ($code != 0) {
140+
return $code, "Failed to search logs: " . $fail;
141+
}
142+
143+
return 0, $result;
144+
} else {
145+
my ($code, $result) = docker_command('logs ' . $container . $maxCommand);
146+
147+
if ($code != 0) {
148+
return $code, $result;
149+
}
150+
151+
return 0, $result;
152+
}
129153
}
130154

131155

0 commit comments

Comments
 (0)