From 71ce64cf16ff140e06ec4ba13c00105ec3404fad Mon Sep 17 00:00:00 2001 From: Jordan Sissel Date: Wed, 22 Dec 2010 17:18:19 -0800 Subject: [PATCH 1/3] - Log to STDERR, but redirect STDERR/STDOUT according to the log settings. --- bin/logstash | 15 +++++++++++++-- lib/logstash/web/server.rb | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) 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/server.rb b/lib/logstash/web/server.rb index 8175305f3..e4da165fc 100755 --- a/lib/logstash/web/server.rb +++ b/lib/logstash/web/server.rb @@ -133,6 +133,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( From b0cdd55aa098068515e0c0615efb50219a63f0ed Mon Sep 17 00:00:00 2001 From: Jordan Sissel Date: Wed, 22 Dec 2010 17:22:48 -0800 Subject: [PATCH 2/3] - If we arrive with no location hash, try to take url parameters as the query arguments. --- lib/logstash/web/public/js/logstash.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/logstash/web/public/js/logstash.js b/lib/logstash/web/public/js/logstash.js index a679d2089..a63fadcf2 100644 --- a/lib/logstash/web/public/js/logstash.js +++ b/lib/logstash/web/public/js/logstash.js @@ -13,6 +13,17 @@ $("#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 +81,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 +101,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; From 4883264ec91ff7bb79f474b95b9d4d7f60217e9d Mon Sep 17 00:00:00 2001 From: Jordan Sissel Date: Wed, 22 Dec 2010 18:55:45 -0800 Subject: [PATCH 3/3] - Ignore javascript search calls if we don't have a query - Make /search support html, text, or json responses via ?format=(html|json|txt|text) - default is html. - If see "No query given" even after we have query, we'll update it to say "Loading query ...." --- lib/logstash/web/public/js/logstash.js | 5 +++ lib/logstash/web/server.rb | 42 +++++++++++++++++-- lib/logstash/web/views/search/ajax.haml | 4 +- lib/logstash/web/views/search/results.txt.erb | 10 +++++ 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 lib/logstash/web/views/search/results.txt.erb diff --git a/lib/logstash/web/public/js/logstash.js b/lib/logstash/web/public/js/logstash.js index a63fadcf2..60681020f 100644 --- a/lib/logstash/web/public/js/logstash.js +++ b/lib/logstash/web/public/js/logstash.js @@ -7,6 +7,11 @@ }, 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); diff --git a/lib/logstash/web/server.rb b/lib/logstash/web/server.rb index e4da165fc..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" }) 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 +%>