diff --git a/bin/logstash b/bin/logstash
index 0dee41aee..ca25c7b0e 100755
--- a/bin/logstash
+++ b/bin/logstash
@@ -68,8 +68,19 @@ if settings.daemonize
end
end
-agent = LogStash::Agent.new(config)
if settings.logfile
- agent.log_to(settings.logfile)
+ logfile = File.open(settings.logfile, "w")
+ STDOUT.reopen(logfile)
+ STDERR.reopen(logfile)
+elsif settings.daemonize
+ # Write to /dev/null if
+ devnull = File.open("/dev/null", "w")
+ STDOUT.reopen(devnull)
+ STDERR.reopen(devnull)
end
+
+agent = LogStash::Agent.new(config)
+#if settings.logfile
+ #agent.log_to(settings.logfile)
+#end
agent.run
diff --git a/lib/logstash/web/public/js/logstash.js b/lib/logstash/web/public/js/logstash.js
index a679d2089..60681020f 100644
--- a/lib/logstash/web/public/js/logstash.js
+++ b/lib/logstash/web/public/js/logstash.js
@@ -7,12 +7,28 @@
},
search: function(query) {
+ if (query == undefined || query == "") {
+ return;
+ }
+ var display_query = query.replace("<", "<").replace(">", ">")
+ $("#querystatus").html("Loading query '" + display_query + "'")
logstash.params.q = query;
document.location.hash = escape(JSON.stringify(logstash.params));
$("#results").load("/search/ajax", logstash.params);
$("#query").val(logstash.params.q);
}, /* search */
+ parse_params: function(href) {
+ var params = href.replace(/^[^?]*\?/, "").split("&")
+ for (var p in params) {
+ var a = params[p].split("=");
+ var key = a[0]
+ var value = a[1]
+ logstash.params[key] = unescape(value)
+ }
+ return params;
+ },
+
appendquery: function(query) {
var newquery = $("#query").val();
newquery += " " + query;
@@ -70,6 +86,13 @@
// Do nothing
}
logstash.search(logstash.params.q);
+ } else {
+ /* No hash. See if there's a query param. */
+ var params = logstash.parse_params(location.href);
+ for (var p in params) {
+ logstash.params[p] = params[p];
+ }
+ logstash.search(logstash.params.q)
}
$(window).hashchange(function() {
@@ -83,12 +106,9 @@
$("a.pager").live("click", function() {
var href = $(this).attr("href");
- var params = href.replace(/^[^?]*\?/, "").split("&")
+ var params = logstash.parse_params(location.href);
for (var p in params) {
- var a = params[p].split("=");
- var key = a[0]
- var value = a[1]
- logstash.params[key] = unescape(value)
+ logstash.params[p] = params[p];
}
logstash.search(logstash.params.q)
return false;
diff --git a/lib/logstash/web/server.rb b/lib/logstash/web/server.rb
index 8175305f3..8ac0f10fe 100755
--- a/lib/logstash/web/server.rb
+++ b/lib/logstash/web/server.rb
@@ -32,17 +32,51 @@ class LogStash::Web::Server < Sinatra::Base
end # '/'
aget '/search' do
- headers({"Content-Type" => "text/html" })
+ result_callback = proc do
+ status 500 if @error
+
+ params[:format] ||= "html"
+ case params[:format]
+ when "html"
+ headers({"Content-Type" => "text/html" })
+ body haml :"search/results", :layout => !request.xhr?
+ when "text"
+ headers({"Content-Type" => "text/plain" })
+ body erb :"search/results.txt", :layout => false
+ when "txt"
+ headers({"Content-Type" => "text/plain" })
+ body erb :"search/results.txt", :layout => false
+ when "json"
+ headers({"Content-Type" => "text/plain" })
+ hits = @hits.collect { |h| h["_source"] }
+ response = {
+ "hits" => hits,
+ "facets" => (@results["facets"] rescue nil),
+ }
+
+ response["error"] = @error if @error
+ body response.to_json
+ end # case params[:format]
+ end # proc result_callback
+
+ # We'll still do a search query here even though most users
+ # have javascript enabled, we need to show the results in
+ # case a user doesn't have javascript.
if params[:q] and params[:q] != ""
elasticsearch.search(params) do |@results|
@hits = (@results["hits"]["hits"] rescue [])
- body haml :"search/results", :layout => !request.xhr?
+ begin
+ result_callback.call
+ rescue => e
+ puts e
+ end
end
else
+ #@error = "No query given."
@hits = []
- body haml :"search/results", :layout => !request.xhr?
+ result_callback.call
end
- end
+ end # aget '/search'
apost '/search/ajax' do
headers({"Content-Type" => "text/html" })
@@ -133,6 +167,11 @@ if settings.logfile
logfile = File.open(settings.logfile, "w")
STDOUT.reopen(logfile)
STDERR.reopen(logfile)
+elsif settings.daemonize
+ # Write to /dev/null if
+ devnull = File.open("/dev/null", "w")
+ STDOUT.reopen(devnull)
+ STDERR.reopen(devnull)
end
Rack::Handler::Thin.run(
diff --git a/lib/logstash/web/views/search/ajax.haml b/lib/logstash/web/views/search/ajax.haml
index 7f11fc4fd..97ca46735 100644
--- a/lib/logstash/web/views/search/ajax.haml
+++ b/lib/logstash/web/views/search/ajax.haml
@@ -31,9 +31,9 @@
last
- if @hits.length == 0
- if !params[:q]
- No query given. How about this?
+ %h3#querystatus No query given. How about this?
- else
- No results for query '#{params[:q]}'
+ %h3#querystatus No results for query '#{params[:q]}'
- else
%table.results
%tr
diff --git a/lib/logstash/web/views/search/results.txt.erb b/lib/logstash/web/views/search/results.txt.erb
new file mode 100644
index 000000000..d6d71db94
--- /dev/null
+++ b/lib/logstash/web/views/search/results.txt.erb
@@ -0,0 +1,10 @@
+<%
+ # Sinatra currently doesn't do ERB with newline trimming, so we
+ # have to write this funky mishmosh that is hard to read.
+if @error %>Error: <%= @error %><% else
+ @hits.each do |hit|
+ event = LogStash::Event.new(hit["_source"])
+%><%= event.message || event.to_hash.to_json %>
+<% end
+ end
+%>