File: logger.rb

package info (click to toggle)
ruby-selenium-webdriver 3.141.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,500 kB
  • sloc: ruby: 6,660; makefile: 3
file content (140 lines) | stat: -rw-r--r-- 4,021 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The SFC licenses this file
# to you 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 'forwardable'
require 'logger'

module Selenium
  module WebDriver
    #
    # @example Enable full logging
    #   Selenium::WebDriver.logger.level = :debug
    #
    # @example Log to file
    #   Selenium::WebDriver.logger.output = 'selenium.log'
    #
    # @example Use logger manually
    #   Selenium::WebDriver.logger.info('This is info message')
    #   Selenium::WebDriver.logger.warn('This is warning message')
    #
    class Logger
      extend Forwardable
      include ::Logger::Severity

      def_delegators :@logger, :debug, :debug?,
                     :info, :info?,
                     :warn, :warn?,
                     :error, :error?,
                     :fatal, :fatal?,
                     :level

      def initialize
        @logger = create_logger($stdout)
      end

      def output=(io)
        # `Logger#reopen` was added in Ruby 2.3
        if @logger.respond_to?(:reopen)
          @logger.reopen(io)
        else
          @logger = create_logger(io)
        end
      end

      #
      # For Ruby < 2.3 compatibility
      # Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
      #

      def level=(severity)
        if severity.is_a?(Integer)
          @logger.level = severity
        else
          case severity.to_s.downcase
          when 'debug'.freeze
            @logger.level = DEBUG
          when 'info'.freeze
            @logger.level = INFO
          when 'warn'.freeze
            @logger.level = WARN
          when 'error'.freeze
            @logger.level = ERROR
          when 'fatal'.freeze
            @logger.level = FATAL
          when 'unknown'.freeze
            @logger.level = UNKNOWN
          else
            raise ArgumentError, "invalid log level: #{severity}"
          end
        end
      end

      #
      # Returns IO object used by logger internally.
      #
      # Normally, we would have never needed it, but we want to
      # use it as IO object for all child processes to ensure their
      # output is redirected there.
      #
      # It is only used in debug level, in other cases output is suppressed.
      #
      # @api private
      #
      def io
        @logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
      end

      #
      # Marks code as deprecated with/without replacement.
      #
      # @param [String] old
      # @param [String, nil] new
      #
      def deprecate(old, new = nil)
        message = "[DEPRECATION] #{old} is deprecated"
        message << if new
                     ". Use #{new} instead."
                   else
                     ' and will be removed in the next releases.'
                   end

        warn message
      end

      private

      def create_logger(output)
        logger = ::Logger.new(output)
        logger.progname = 'Selenium'
        logger.level = default_level
        logger.formatter = proc do |severity, time, progname, msg|
          "#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
        end

        logger
      end

      def default_level
        if $DEBUG || ENV.key?('DEBUG')
          DEBUG
        else
          WARN
        end
      end
    end # Logger
  end # WebDriver
end # Selenium