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