diff options
-rw-r--r-- | src/couchdb/couch_httpd_misc_handlers.erl | 9 | ||||
-rw-r--r-- | src/couchdb/couch_log.erl | 8 |
2 files changed, 10 insertions, 7 deletions
diff --git a/src/couchdb/couch_httpd_misc_handlers.erl b/src/couchdb/couch_httpd_misc_handlers.erl index 92e0252a..5daeeeea 100644 --- a/src/couchdb/couch_httpd_misc_handlers.erl +++ b/src/couchdb/couch_httpd_misc_handlers.erl @@ -198,12 +198,15 @@ increment_update_seq_req(Req, _Db) -> % httpd log handlers handle_log_req(#httpd{method='GET'}=Req) -> - LastBytes = list_to_integer(couch_httpd:qs_value(Req, "bytes", "1000")), + Bytes = list_to_integer(couch_httpd:qs_value(Req, "bytes", "1000")), + Offset = list_to_integer(couch_httpd:qs_value(Req, "offset", "0")), + Chunk = couch_log:read(Bytes, Offset), {ok, Resp} = start_chunked_response(Req, 200, [ % send a plaintext response - {"Content-Type", "text/plain; charset=utf-8"} + {"Content-Type", "text/plain; charset=utf-8"}, + {"Content-Length", integer_to_list(length(Chunk))} ]), - send_chunk(Resp, couch_log:read(LastBytes)), + send_chunk(Resp, Chunk), send_chunk(Resp, ""); handle_log_req(Req) -> send_method_not_allowed(Req, "GET"). diff --git a/src/couchdb/couch_log.erl b/src/couchdb/couch_log.erl index 693eed9b..14c262d0 100644 --- a/src/couchdb/couch_log.erl +++ b/src/couchdb/couch_log.erl @@ -16,7 +16,7 @@ -export([start_link/0,stop/0]). -export([debug_on/0,info_on/0,get_level/0,get_level_integer/0, set_level/1]). -export([init/1, handle_event/2, terminate/2, code_change/3, handle_info/2, handle_call/2]). --export([read/1]). +-export([read/2]). -define(LEVEL_ERROR, 3). -define(LEVEL_INFO, 2). @@ -122,12 +122,12 @@ log(Fd, Pid, Level, Format, Args) -> {ok, Msg2, _} = regexp:gsub(lists:flatten(Msg),"\\r\\n|\\r|\\n", "\r\n"), ok = io:format(Fd, "[~s] [~s] [~p] ~s\r~n\r~n", [httpd_util:rfc1123_date(), Level, Pid, Msg2]). -read(LastBytes) -> +read(Bytes, Offset) -> LogFileName = couch_config:get("log", "file"), LogFileSize = couch_util:file_read_size(LogFileName), - {ok, Fd} = file:open(LogFileName, [binary]), - Start = lists:max([LogFileSize - LastBytes, 0]), + {ok, Fd} = file:open(LogFileName, [read]), + Start = lists:max([LogFileSize - Bytes, 0]) + Offset, % TODO: truncate chopped first line % TODO: make streaming |