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 +%>