From b18636ef21922c26e3bcf9490e9251863f4929db Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Thu, 20 Jun 2024 16:21:15 -0700 Subject: [PATCH] [Ruby] Implement setter for logger of GRPC module (#36989) This commit implements `logger=` for GRPC module. It will allow us to inject a custom logger on the fly easily. Using `self.extend` inside this setter will help us deal with backward compatible for some custom Logger Module. Fixed #24084 cc @sampajano , @apolcyn and @alto-ruby TIA re: https://github.com/grpc/grpc/pull/24072 Closes #36989 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36989 from nvh0412:chore/add-logger-setter-for-GRPC-ruby-2 f5a91225e7e1b08cfd7b99e2ed8231f0cf3d75a7 PiperOrigin-RevId: 645189146 --- src/ruby/lib/grpc/logconfig.rb | 13 +++++++++++++ src/ruby/spec/logconfig_spec.rb | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/ruby/spec/logconfig_spec.rb diff --git a/src/ruby/lib/grpc/logconfig.rb b/src/ruby/lib/grpc/logconfig.rb index 4f135586272..e50141e27fc 100644 --- a/src/ruby/lib/grpc/logconfig.rb +++ b/src/ruby/lib/grpc/logconfig.rb @@ -14,6 +14,19 @@ # GRPC contains the General RPC module. module GRPC + def self.logger=(logger_obj) + # Need a free variable here to keep value of logger_obj for logger closure + @logger = logger_obj + + extend( + Module.new do + def logger + @logger + end + end + ) + end + # DefaultLogger is a module included in GRPC if no other logging is set up for # it. See ../spec/spec_helpers an example of where other logging is added. module DefaultLogger diff --git a/src/ruby/spec/logconfig_spec.rb b/src/ruby/spec/logconfig_spec.rb new file mode 100644 index 00000000000..a3330086688 --- /dev/null +++ b/src/ruby/spec/logconfig_spec.rb @@ -0,0 +1,30 @@ +# Copyright 2024 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'spec_helper' +require 'logger' + +describe GRPC do + describe '.logger=' do + it 'sets logger' do + noop_logger = GRPC::DefaultLogger::NoopLogger.new + GRPC.logger = noop_logger + expect(GRPC.logger).to be(noop_logger) + + custom_logger = Logger.new(STDOUT) + GRPC.logger = custom_logger + expect(GRPC.logger).to be(custom_logger) + end + end +end