Kentaro Hayashi 2019-05-21 18:31:42 +0900 (Tue, 21 May 2019) Revision: e0f0c0291f7247412ae6414b4bf53361f82f3697 https://github.com/groonga/groonga/commit/e0f0c0291f7247412ae6414b4bf53361f82f3697 Message: Support grndb --log-flags (#944) * test: move common method to helper It is used from Groonga and GrnDB test case. * test: add missing --log-path option * test: add grndb test case * grndb: support --log-flags option Added files: lib/mrb/scripts/logger/flags.rb test/command_line/suite/grndb/test_options.rb Modified files: lib/mrb/mrb_logger.c lib/mrb/scripts/command_line_parser.rb lib/mrb/scripts/logger/sources.am src/grndb.c test/command_line/helper/command_runner.rb test/command_line/suite/groonga/test_options.rb Modified: lib/mrb/mrb_logger.c (+14 -0) =================================================================== --- lib/mrb/mrb_logger.c 2019-05-21 17:57:05 +0900 (7ca77e072) +++ lib/mrb/mrb_logger.c 2019-05-21 18:31:42 +0900 (5358bb4a9) @@ -58,6 +58,17 @@ logger_s_get_default_level(mrb_state *mrb, mrb_value self) } static mrb_value +logger_s_get_default_flags(mrb_state *mrb, mrb_value self) +{ + mrb_value mrb_flags_class; + mrb_value mrb_flags; + + mrb_flags_class = mrb_const_get(mrb, self, mrb_intern_lit(mrb, "Flags")); + mrb_flags = mrb_fixnum_value(grn_default_logger_get_flags()); + return mrb_funcall(mrb, mrb_flags_class, "new", 1, mrb_flags); +} + +static mrb_value logger_need_log_p(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; @@ -122,6 +133,8 @@ grn_mrb_logger_init(grn_ctx *ctx) logger_s_get_default_path, MRB_ARGS_NONE()); mrb_define_singleton_method(mrb, (struct RObject *)klass, "default_level", logger_s_get_default_level, MRB_ARGS_NONE()); + mrb_define_singleton_method(mrb, (struct RObject *)klass, "default_flags", + logger_s_get_default_flags, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "need_log?", logger_need_log_p, MRB_ARGS_REQ(1)); mrb_define_method(mrb, klass, "need_location_in_message?", @@ -129,6 +142,7 @@ grn_mrb_logger_init(grn_ctx *ctx) mrb_define_method(mrb, klass, "log_raw", logger_log_raw, MRB_ARGS_REQ(5)); grn_mrb_load(ctx, "logger/level.rb"); + grn_mrb_load(ctx, "logger/flags.rb"); grn_mrb_load(ctx, "logger.rb"); } #endif Modified: lib/mrb/scripts/command_line_parser.rb (+4 -0) =================================================================== --- lib/mrb/scripts/command_line_parser.rb 2019-05-21 17:57:05 +0900 (7dad55a75) +++ lib/mrb/scripts/command_line_parser.rb 2019-05-21 18:31:42 +0900 (be3f02c85) @@ -97,6 +97,10 @@ module Groonga options.string("--log-level", "Change log level (#{default_log_level.name})", default: default_log_level) + default_log_flags = Logger.default_flags + options.string("--log-flags", + "Change log flags (#{default_log_flags.to_s})", + default: default_log_flags) end def find_command(name) Added: lib/mrb/scripts/logger/flags.rb (+60 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/scripts/logger/flags.rb 2019-05-21 18:31:42 +0900 (8b3198ddd) @@ -0,0 +1,60 @@ +module Groonga + class Logger + class Flags + VALUES = { + time: 1, + title: 2, + message: 4, + location: 8, + process_id: 16, + thread_id: 32, + } + + attr_reader :value + def initialize(value) + case value + when String, Symbol + @value = VALUES[value.to_sym] + if****@value*****? + available_names = VALUES.keys.inspect + message = "unknown flag name: #{value.inspect}: #{available_names}" + raise ArgumentError, message + end + else + @value = value + end + end + + def to_i + @value + end + + def to_s + names = [] + VALUES.each do |name, value| + names << name.to_s unless (value & @value) == 0 + end + names.join("|") + end + + def |(other) + other = self.class.new(other) unless other.is_a?(self.class) + new(@value | other.to_i) + end + + def &(other) + other = self.class.new(other) unless other.is_a?(self.class) + new(@value & other.to_i) + end + + NONE = new(0) + TIME = new(:time) + TITLE = new(:title) + MESSAGE = new(:message) + LOCATION = new(:location) + PROCESS_ID = new(:process_id) + PID = PROCESS_ID + THREAD_ID = new(:thread_id) + end + end +end Modified: lib/mrb/scripts/logger/sources.am (+2 -1) =================================================================== --- lib/mrb/scripts/logger/sources.am 2019-05-21 17:57:05 +0900 (7231ee4ee) +++ lib/mrb/scripts/logger/sources.am 2019-05-21 18:31:42 +0900 (2096660af) @@ -1,2 +1,3 @@ RUBY_SCRIPT_FILES = \ - level.rb + level.rb \ + flags.rb Modified: src/grndb.c (+22 -0) =================================================================== --- src/grndb.c 2019-05-21 17:57:05 +0900 (5a968b680) +++ src/grndb.c 2019-05-21 18:31:42 +0900 (8b4016fac) @@ -133,6 +133,7 @@ main(int argc, char **argv) int exit_code = EXIT_SUCCESS; const char *log_path = GRN_LOG_PATH; const char *log_level_name = NULL; + const char *log_flags_name = NULL; { int i; @@ -149,6 +150,7 @@ main(int argc, char **argv) #define log_path_prefix "--log-path" #define log_level_prefix "--log-level" +#define log_flags_prefix "--log-flags" if (strcmp(arg, log_path_prefix) == 0) { if (i + 1 < argc) { log_path = argv[i + 1]; @@ -167,9 +169,19 @@ main(int argc, char **argv) log_level_prefix "=", strlen(log_level_prefix "=")) == 0) { log_level_name = arg + strlen(log_level_prefix "="); + } else if (strcmp(arg, log_flags_prefix) == 0) { + if (i + 1 < argc) { + log_flags_name = argv[i + 1]; + i++; + } + } else if (strncmp(arg, + log_flags_prefix "=", + strlen(log_flags_prefix "=")) == 0) { + log_flags_name = arg + strlen(log_flags_prefix "="); } #undef log_path_prefix #undef log_level_prefix +#undef log_flags_prefix } } @@ -184,6 +196,16 @@ main(int argc, char **argv) grn_default_logger_set_max_level(log_level); } + if (log_flags_name) { + int log_flags; + if (!grn_log_flags_parse(log_flags_name, -1, &log_flags)) { + fprintf(stderr, "%s: failed to parse log flags: <%s>\n", + argv[0], log_flags_name); + return EXIT_FAILURE; + } + grn_default_logger_set_flags(log_flags); + } + if (grn_init() != GRN_SUCCESS) { return EXIT_FAILURE; } Modified: test/command_line/helper/command_runner.rb (+39 -0) =================================================================== --- test/command_line/helper/command_runner.rb 2019-05-21 17:57:05 +0900 (7f9444dc7) +++ test/command_line/helper/command_runner.rb 2019-05-21 18:31:42 +0900 (e52ad080f) @@ -96,6 +96,7 @@ module CommandRunner command_line = [ grndb_path, command, + "--log-path", @log_path.to_s, @database_path.to_s, ] command_line.concat(arguments) @@ -143,6 +144,44 @@ module CommandRunner find_program("grndb", :prefer_libtool => true) end + def normalize_init_line(line) + line.chomp.gsub(/\A + (\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}\.\d+)? + \|\ + ([a-zA-Z]) + \|\ + ([^: ]+)? + ([|:]\ )? + (.+) + \z/x) do + timestamp = $1 + level = $2 + id_section = $3 + separator = $4 + message = $5 + timestamp = "1970-01-01 00:00:00.000000" if timestamp + case id_section + when nil + when /\|/ + id_section = "PROCESS_ID|THREAD_ID" + when /[a-zA-Z]/ + id_section = "THREAD_ID" + when /\A\d{8,}\z/ + id_section = "THREAD_ID" + else + id_section = "PROCESS_ID" + end + message = message.gsub(/grn_init: <.+?>/, "grn_init: <VERSION>") + timestamp.to_s + + "|" + + level + + "|" + + id_section.to_s + + separator.to_s + + message + end + end + private def run_command_interactive(*command_line) IO.pipe do |input_read, input_write| Added: test/command_line/suite/grndb/test_options.rb (+81 -0) 100644 =================================================================== --- /dev/null +++ test/command_line/suite/grndb/test_options.rb 2019-05-21 18:31:42 +0900 (efe0cf795) @@ -0,0 +1,81 @@ +# Copyright(C) 2019 Kouhei Sutou <kou****@clear*****> +# Copyright(C) 2019 Kentaro Hayashi <hayas****@clear*****> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1 as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +class TestGrnDBOptions < GroongaTestCase + sub_test_case("--log-flags") do + test("default") do + groonga("status") + grndb("check") + assert_equal("1970-01-01 00:00:00.000000|n| " + + "grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("add: one") do + flags = "+pid" + groonga("status") + grndb("check", "--log-flags", flags) + assert_equal("1970-01-01 00:00:00.000000|n|PROCESS_ID: " + + "grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("add: multiple") do + flags = "+process_id|+thread_id" + groonga("status") + grndb("check", "--log-flags", flags) + assert_equal("1970-01-01 00:00:00.000000|n|PROCESS_ID|THREAD_ID: " + + "grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("remove: one") do + flags = "-time" + groonga("status") + grndb("check", "--log-flags", flags) + assert_equal("|n| grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("remove: multiple") do + flags = "+pid|-time|-process_id" + groonga("status") + grndb("check", "--log-flags", flags) + assert_equal("|n| grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("replace") do + flags = "+process_id|default|+thread_id" + groonga("status") + grndb("check", "--log-flags", flags) + assert_equal("1970-01-01 00:00:00.000000|n|THREAD_ID: " + + "grn_fin (0)", + normalize_init_line(File.readlines(@log_path).last)) + end + + test("unknown") do + flags = "unknown" + groonga("status") + error = assert_raise(CommandRunner::Error) do + grndb("check", "--log-flags", flags) + end + assert_equal(<<-MESSAGE, error.error_output) +#{real_grndb_path}: failed to parse log flags: <unknown> + MESSAGE + end + end +end Modified: test/command_line/suite/groonga/test_options.rb (+0 -38) =================================================================== --- test/command_line/suite/groonga/test_options.rb 2019-05-21 17:57:05 +0900 (081e5e9fc) +++ test/command_line/suite/groonga/test_options.rb 2019-05-21 18:31:42 +0900 (3c07025e1) @@ -15,44 +15,6 @@ class TestGroongaOptions < GroongaTestCase sub_test_case("--log-flags") do - def normalize_init_line(line) - line.chomp.gsub(/\A - (\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}\.\d+)? - \|\ - ([a-zA-Z]) - \|\ - ([^: ]+)? - ([|:]\ )? - (.+) - \z/x) do - timestamp = $1 - level = $2 - id_section = $3 - separator = $4 - message = $5 - timestamp = "1970-01-01 00:00:00.000000" if timestamp - case id_section - when nil - when /\|/ - id_section = "PROCESS_ID|THREAD_ID" - when /[a-zA-Z]/ - id_section = "THREAD_ID" - when /\A\d{8,}\z/ - id_section = "THREAD_ID" - else - id_section = "PROCESS_ID" - end - message = message.gsub(/grn_init: <.+?>/, "grn_init: <VERSION>") - timestamp.to_s + - "|" + - level + - "|" + - id_section.to_s + - separator.to_s + - message - end - end - test("add: one") do groonga("status", command_line: ["--log-flags", "+pid"]) -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190521/33bc60f1/attachment-0001.html>