content_server 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,47 +21,35 @@ module ContentServer
21
21
  # Start indexing on demand and write changes to queue
22
22
  thread = Thread.new do
23
23
  while true do
24
- Log.debug1 'Waiting on index input queue.'
25
24
  (state, is_dir, path, mtime, size) = @input_queue.pop
26
25
  $process_vars.set('monitor to index queue size', @input_queue.size)
27
- Log.debug1 "index event: state:#{state}, dir?#{is_dir}, path:#{path}, mtime:#{mtime}, size:#{size}."
26
+ Log.debug1("index event: state:%s dir?%s path:%s time:%s size:%s ",
27
+ state, is_dir, path, mtime, size)
28
28
  if state == FileMonitoring::FileStatEnum::STABLE && !is_dir
29
29
  # Calculating checksum
30
- instance_stats = nil # definition
30
+ checksum = calc_SHA1(path)
31
+ $process_vars.inc('indexed_files')
32
+ $indexed_file_count += 1
33
+ Log.debug1("Index checksum:%s Adding index to content data. put in queue for dynamic update.",
34
+ checksum)
31
35
  $local_content_data_lock.synchronize{
32
- instance_stats = $local_content_data.stats_by_location([Params['local_server_name'], path])
36
+ $local_content_data.add_instance(checksum, size, Params['local_server_name'], path, mtime)
33
37
  }
34
- Log.debug1("instance !#{instance_stats}! mtime: #{mtime.to_i}, size: #{size}")
35
- if instance_stats.nil? || mtime.to_i != instance_stats[1] || size != instance_stats[0]
36
- Log.debug1 "Indexing file:'#{path}'."
37
- checksum = calc_SHA1(path)
38
- $process_vars.inc('indexed_files')
39
- $indexed_file_count += 1
40
- Log.debug1("Index info:checksum:#{checksum} size:#{size} time:#{mtime.to_i}")
41
- Log.debug1('Adding index to content data. put in queue for dynamic update.')
42
- $local_content_data_lock.synchronize{
43
- $local_content_data.add_instance(checksum, size, Params['local_server_name'], path, mtime.to_i)
44
- }
45
- else
46
- Log.info("Skip file #{path} indexing (shallow check passed)")
47
- end
48
38
  elsif ((state == FileMonitoring::FileStatEnum::NON_EXISTING ||
49
39
  state == FileMonitoring::FileStatEnum::CHANGED) && !is_dir)
50
- Log.debug2("NonExisting/Changed (file): #{path}")
51
40
  # Remove file but only when non-existing.
52
- Log.debug1("File to remove: #{path}")
41
+ Log.debug1("File to remove: %s", path)
53
42
  $local_content_data_lock.synchronize{
54
43
  $local_content_data.remove_instance(Params['local_server_name'], path)
55
44
  }
56
45
  elsif state == FileMonitoring::FileStatEnum::NON_EXISTING && is_dir
57
- Log.debug2("NonExisting/Changed (dir): #{path}")
58
46
  # Remove directory but only when non-existing.
59
- Log.debug1("Directory to remove: #{path}")
47
+ Log.debug1("Directory to remove: %s", path)
60
48
  $local_content_data_lock.synchronize{
61
49
  $local_content_data.remove_directory(Params['local_server_name'], path)
62
50
  }
63
51
  else
64
- Log.debug1("This case should not be handled: #{state}, #{is_dir}, #{path}.")
52
+ Log.debug1("This case should not be handled: %s, %s, %s", state, is_dir, path)
65
53
  end
66
54
  end # while true do
67
55
  end # Thread.new do
@@ -27,7 +27,8 @@ module ContentServer
27
27
  @last_content_data_id = nil
28
28
  @content_server_content_data_path = File.join(local_backup_folder, 'remote',
29
29
  host + '_' + port.to_s)
30
- Log.debug3("Initialized RemoteContentClient: host:#{host} port:#{port} local_backup_folder:#{local_backup_folder}")
30
+ Log.debug3("Initialized RemoteContentClient: host:%s port:%s local_backup_folder:%s",
31
+ host, port, local_backup_folder)
31
32
  end
32
33
 
33
34
  # Receives content data, and writes it to file
@@ -47,7 +48,7 @@ module ContentServer
47
48
  $remote_content_data.to_file(path)
48
49
  @last_content_data_id = message.unique_id # save last content data ID
49
50
  }
50
- Log.debug1("Written content data to file:#{path}.")
51
+ Log.debug1("Written content data to file:%s.", path)
51
52
  else
52
53
  Log.debug1("No need to write remote content data, it has not changed.")
53
54
  end
@@ -59,14 +60,13 @@ module ContentServer
59
60
  threads = []
60
61
  threads << @remote_tcp.tcp_thread if @remote_tcp != nil
61
62
  threads << Thread.new do
62
- Log.debug1("New thread.")
63
63
  loop do
64
64
  # if need content data
65
65
  sleep_time_span = Params['remote_content_save_timeout']
66
66
  if @last_fetch_timestamp
67
67
  sleep_time_span = Time.now.to_i - @last_fetch_timestamp
68
68
  end
69
- Log.debug1("sleep_time_span: #{sleep_time_span}")
69
+ Log.debug1("sleep_time_span: %s", sleep_time_span)
70
70
  if sleep_time_span >= Params['remote_content_save_timeout']
71
71
  # Send ping!
72
72
  @remote_tcp.send_obj(nil)
@@ -85,7 +85,7 @@ module ContentServer
85
85
  # initializes class variables
86
86
  def initialize(port)
87
87
  @tcp_server = Networking::TCPServer.new(port, method(:content_requested))
88
- Log.debug3("initialize RemoteContentServer on port:#{port}")
88
+ Log.debug3("initialize RemoteContentServer on port:%s", port)
89
89
  end
90
90
 
91
91
  # content_requested
@@ -95,7 +95,7 @@ module ContentServer
95
95
  # Send response.
96
96
  Log.info("Content server received content data request")
97
97
  $local_content_data_lock.synchronize{
98
- Log.debug1("Sending content data:#{$local_content_data}")
98
+ Log.debug1("Sending content data:%s", $local_content_data)
99
99
  @tcp_server.send_obj($local_content_data)
100
100
  }
101
101
  Log.info('Content server sent content data')
@@ -42,12 +42,13 @@ module ContentServer
42
42
  "Backtrace:\n#{exception.backtrace.join("\n")}"
43
43
  puts(message)
44
44
 
45
+ # Block force write to file resolving Issue 217 https://github.com/bbfsdev/bbfs/issues/217
45
46
  # force write content data to file
46
- if $local_content_data
47
- puts("\nForce writing local content data to #{Params['local_content_data_path']}.")
48
- $local_content_data.to_file($tmp_content_data_file)
49
- File.rename($tmp_content_data_file, Params['local_content_data_path'])
50
- end
47
+ #if $local_content_data
48
+ # puts("\nForce writing local content data to #{Params['local_content_data_path']}.")
49
+ #$local_content_data.to_file($tmp_content_data_file)
50
+ #File.rename($tmp_content_data_file, Params['local_content_data_path'])
51
+ #end
51
52
 
52
53
  #Write exception message to log and mail(if enabled)
53
54
  Log.error(message)
@@ -83,9 +84,9 @@ module ContentServer
83
84
  report += "Type:#{type} raised in:#{diff} \n"
84
85
  objects_counters[type] = current_objects_counters[type]
85
86
  }
86
- Log.info("MEM REPORT at:#{time}:\n#{report}\n")
87
+ Log.info("MEM REPORT:\n%s\n", report)
87
88
  end
88
89
  end
89
90
 
90
91
  module_function :init_globals, :handle_program_termination, :monitor_general_process_vars
91
- end
92
+ end
@@ -1,3 +1,3 @@
1
1
  module ContentServer
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -13,7 +13,8 @@ module FileCopy
13
13
  password = (password and password.length > 0) ? password : nil
14
14
  port = 22 # 22 is a standart SSH port
15
15
  raise "Undefined server" unless server
16
- Log.debug1 "Trying to connect(ssh): #{username}, #{password}, #{server}, #{port}."
16
+ Log.debug1("Trying to connect(ssh): %s, %s, %s, %s.",
17
+ username, password, server, port)
17
18
  if (username and password)
18
19
  Net::SSH.start(server, username,
19
20
  :password => password,
@@ -22,7 +23,7 @@ module FileCopy
22
23
  Net::SSH.start(server, username,
23
24
  :port => port)
24
25
  else
25
- raise "Undefined username"
26
+ raise("Undefined username")
26
27
  end
27
28
  end
28
29
  module_function :ssh_connect
@@ -36,11 +37,11 @@ module FileCopy
36
37
  uploads = files_map.map { |from,to|
37
38
  remote_dir = File.dirname(to)
38
39
  sftp_mkdir_recursive(sftp, File.dirname(to))
39
- Log.debug1 "Copying #{from} to #{to}"
40
+ Log.debug1("Copying %s to %s",from, to)
40
41
  sftp.upload(from, to)
41
42
  }
42
43
  uploads.each { |u| u.wait }
43
- Log.debug1 "Done."
44
+ Log.debug1("Done.")
44
45
  end # ssh.sftp.connect
45
46
  end # def initialize
46
47
  module_function :sftp_copy
@@ -48,17 +49,17 @@ module FileCopy
48
49
  def sftp_mkdir_recursive(sftp, path)
49
50
  dir_stat = nil
50
51
  begin
51
- Log.debug1 "Stat remote dir: #{path}."
52
+ Log.debug1("Stat remote dir: %s.", path)
52
53
  dir_stat = sftp.stat!(path).directory?
53
- Log.debug1 "Stat result #{dir_stat}."
54
+ Log.debug1("Stat result %s.", dir_stat)
54
55
  rescue Net::SFTP::StatusException
55
56
  end
56
57
  if !dir_stat
57
- Log.debug1 "Directory does not exists: #{path}."
58
+ Log.debug1("Directory does not exists: %s.", path)
58
59
  sftp_mkdir_recursive sftp, File.dirname(path)
59
- Log.debug1 "Making dir #{path}."
60
+ Log.debug1("Making dir %s.", path)
60
61
  response = sftp.mkdir!(path)
61
- Log.debug1 "Making dir ok:#{response.ok?}."
62
+ Log.debug1("Making dir ok:%s.", response.ok?)
62
63
  end
63
64
  end
64
65
  module_function :sftp_mkdir_recursive
@@ -9,19 +9,6 @@ module FileMonitoring
9
9
  # Manages file monitoring of number of file system locations
10
10
  class FileMonitoring
11
11
 
12
- def initialize ()
13
- @content_data_cache = Set.new
14
- $local_content_data_lock.synchronize {
15
- $local_content_data.each_instance(){
16
- |_, _, _, _, _, file_path|
17
- # save files to cache
18
- Log.info("File in cache: #{file_path.clone}")
19
- @content_data_cache.add(file_path.clone)
20
- }
21
- }
22
- end
23
-
24
-
25
12
  # Set event queue used for communication between different proceses.
26
13
  # @param queue [Queue]
27
14
  def set_event_queue(queue)
@@ -41,16 +28,60 @@ module FileMonitoring
41
28
  # that provides path and file monitoring configuration data
42
29
  def monitor_files
43
30
  conf_array = Params['monitoring_paths']
31
+
32
+ # create root dirs of monitoring
33
+ dir_stat_array = []
34
+ conf_array.each { |elem|
35
+ dir_stat = DirStat.new(File.expand_path(elem['path']), elem['stable_state'])
36
+ dir_stat.set_event_queue(@event_queue) if @event_queue
37
+ dir_stat_array.push(dir_stat)
38
+ }
39
+
40
+ #Look over loaded content data if not empty
41
+ # If file is under monitoring path - Add to DirStat tree as stable with path,size,mod_time read from file
42
+ # If file is NOT under monitoring path - skip (not a valid usage)
43
+ unless $local_content_data.empty?
44
+ Log.info("Start build data base from loaded file")
45
+ $local_content_data.each_instance {
46
+ |_, size, _, mod_time, _, path|
47
+ # construct sub paths array from full file path:
48
+ # Example:
49
+ # instance path = /dir1/dir2/file_name
50
+ # Sub path 1: /dir1
51
+ # Sub path 2: /dir1/dir2
52
+ # Sub path 3: /dir1/dir2/file_name
53
+ # sub paths would create DirStat objs or FileStat(FileStat create using last sub path).
54
+ split_path = path.split(File::SEPARATOR)
55
+ sub_paths = (0..split_path.size-1).inject([]) { |paths, i|
56
+ paths.push(File.join(*split_path.values_at(0..i)))
57
+ }
58
+ # sub_paths holds array => ["/dir1","/dir1/dir2","/dir1/dir2/file_name"]
59
+
60
+ # Loop over monitor paths to start build tree under each
61
+ dir_stat_array.each { | dir_stat|
62
+ # check if monitor path is one of the sub paths and find it's sub path index
63
+ # if index is found then it the monitor path
64
+ # the next index indicates the next sub path to insert to the tree
65
+ # the index will be raised at each recursive call down the tree
66
+ sub_paths_index = sub_paths.index(dir_stat.path)
67
+ next if sub_paths_index.nil? # monitor path was not found. skip this instance.
68
+ # monitor path was found. Add to tree as stable.
69
+ dir_stat.state = FileStatEnum::STABLE
70
+ # start the recursive call with next sub path index
71
+ dir_stat.load_instance(sub_paths, sub_paths_index+1, size, mod_time)
72
+ }
73
+ }
74
+ Log.info("End build data base from loaded file")
75
+ end
76
+
44
77
  # Directories states stored in the priority queue,
45
78
  # where the key (priority) is a time when it should be checked next time.
46
79
  # Priority queue means that all entries arranged by key (time to check) in increasing order.
47
80
  pq = Containers::PriorityQueue.new
48
- conf_array.each { |elem|
81
+ conf_array.each_with_index { |elem, index|
49
82
  priority = (Time.now + elem['scan_period']).to_i
50
- dir_stat = DirStat.new(File.expand_path(elem['path']), elem['stable_state'], @content_data_cache, FileStatEnum::NON_EXISTING)
51
- dir_stat.set_event_queue(@event_queue) if @event_queue
52
- Log.debug1("File monitoring started for: #{elem}")
53
- pq.push([priority, elem, dir_stat], -priority)
83
+ #Log.info("File monitoring started for: #{elem}")
84
+ pq.push([priority, elem, dir_stat_array[index]], -priority)
54
85
  }
55
86
 
56
87
  #init log4r
@@ -85,7 +116,9 @@ module FileMonitoring
85
116
  end
86
117
 
87
118
  unless $testing_memory_active
119
+ Log.info("Start monitor for dir:%s", dir_stat.path)
88
120
  dir_stat.monitor
121
+ Log.info("End monitor for dir:%s", dir_stat.path)
89
122
  else
90
123
  $testing_memory_log.info("Start monitor at :#{Time.now}")
91
124
  puts "Start monitor at :#{Time.now}"
@@ -23,7 +23,8 @@ module FileMonitoring
23
23
 
24
24
  # This class holds current state of file and methods to control and report changes
25
25
  class FileStat
26
- attr_reader :cycles, :path, :stable_state, :state, :size, :modification_time
26
+ attr_reader :cycles, :path, :stable_state
27
+ attr_accessor :state, :size, :modification_time
27
28
 
28
29
  DEFAULT_STABLE_STATE = 10
29
30
 
@@ -33,15 +34,16 @@ module FileMonitoring
33
34
  # ==== Arguments:
34
35
  #
35
36
  # * <tt>path</tt> - File location
37
+ # * <tt>size</tt> - File size [Byte]
38
+ # * <tt>modification_time</tt> - file mod time [seconds]
39
+ # * <tt>cycles</tt> - # number of iterations from the last state change.
36
40
  # * <tt>stable_state</tt> - Number of iterations to move unchanged file to stable state
37
- def initialize(path, stable_state = DEFAULT_STABLE_STATE, content_data_cache, state)
41
+ def initialize(path, stable_state = DEFAULT_STABLE_STATE)
38
42
  @path ||= path
39
43
  @size = nil
40
- @creation_time = nil
41
44
  @modification_time = nil
42
- @cycles = 0 # number of iterations from the last file modification
43
- @state = state
44
- @stable_state = stable_state # number of iteration to move unchanged file to stable state
45
+ @cycles = 0
46
+ @stable_state = stable_state
45
47
  end
46
48
 
47
49
  def set_output_queue(event_queue)
@@ -61,23 +63,23 @@ module FileMonitoring
61
63
  def monitor
62
64
  file_stats = File.lstat(@path) rescue nil
63
65
  new_state = nil
64
- if file_stats == nil
66
+ if file_stats.nil?
65
67
  new_state = FileStatEnum::NON_EXISTING
66
68
  @size = nil
67
- @creation_time = nil
69
+ #@creation_time = nil
68
70
  @modification_time = nil
69
71
  @cycles = 0
70
- elsif @size == nil
72
+ elsif @size.nil?
71
73
  new_state = FileStatEnum::NEW
72
74
  @size = file_stats.size
73
- @creation_time = file_stats.ctime.utc
74
- @modification_time = file_stats.mtime.utc
75
+ #@creation_time = file_stats.ctime.utc
76
+ @modification_time = file_stats.mtime.to_i
75
77
  @cycles = 0
76
78
  elsif changed?(file_stats)
77
79
  new_state = FileStatEnum::CHANGED
78
80
  @size = file_stats.size
79
- @creation_time = file_stats.ctime.utc
80
- @modification_time = file_stats.mtime.utc
81
+ #@creation_time = file_stats.ctime.utc
82
+ @modification_time = file_stats.mtime.to_i
81
83
  @cycles = 0
82
84
  else
83
85
  new_state = FileStatEnum::UNCHANGED
@@ -88,14 +90,13 @@ module FileMonitoring
88
90
  end
89
91
 
90
92
  # The assignment
91
- self.state= new_state
93
+ set_state(new_state)
92
94
  end
93
95
 
94
96
  # Checks that stored file attributes are the same as file attributes taken from file system.
95
97
  def changed?(file_stats)
96
- not (file_stats.size == @size &&
97
- file_stats.ctime.utc == @creation_time.utc &&
98
- file_stats.mtime.utc == @modification_time.utc)
98
+ !((file_stats.size == @size) &&
99
+ (file_stats.mtime.to_i == @modification_time))
99
100
  end
100
101
 
101
102
  def set_event_queue(queue)
@@ -103,7 +104,7 @@ module FileMonitoring
103
104
  end
104
105
 
105
106
  # Sets and writes to the log a new state.
106
- def state= (new_state)
107
+ def set_state(new_state)
107
108
  if (@state != new_state or @state == FileStatEnum::CHANGED)
108
109
  @state = new_state
109
110
  if (@@log)
@@ -111,9 +112,8 @@ module FileMonitoring
111
112
  @@log.outputters[0].flush if Params['log_flush_each_message']
112
113
  end
113
114
  if @event_queue and FileStatEnum::NEW != @state # NEW state is ignored in indexer
114
- Log.debug1 "Writing to event queue [#{self.state}, #{self.path}]"
115
- @event_queue.push([self.state, self.instance_of?(DirStat), self.path,
116
- self.modification_time, self.size])
115
+ Log.debug1("Writing to event queue [%s, %s]", @state, @path)
116
+ @event_queue.push([@state, self.instance_of?(DirStat), @path, @modification_time, @size])
117
117
  $process_vars.set('monitor to index queue size', @event_queue.size)
118
118
  end
119
119
  end
@@ -137,12 +137,51 @@ module FileMonitoring
137
137
  #
138
138
  # * <tt>path</tt> - File location
139
139
  # * <tt>stable_state</tt> - Number of iterations to move unchanged directory to stable state
140
- def initialize(path, stable_state = DEFAULT_STABLE_STATE, content_data_cache, state)
140
+ def initialize(path, stable_state = DEFAULT_STABLE_STATE)
141
141
  super
142
- @dirs = nil
143
- @files = nil
144
- @non_utf8_paths = {}
145
- @content_data_cache = content_data_cache
142
+ @dirs = nil # Hash: ["path" -> DirStat]
143
+ @files = nil # Hash: ["path" -> FileStat]
144
+ @non_utf8_paths = {} # Hash: ["path" -> true|false]
145
+ end
146
+
147
+ # add instance while initializing tree using content data from file
148
+ # Parameters:
149
+ # sub_paths - Array of sub paths of the instance which is added to tree
150
+ # Example:
151
+ # instance path = /dir1/dir2/file_name
152
+ # Sub path 1: /dir1
153
+ # Sub path 2: /dir1/dir2
154
+ # Sub path 3: /dir1/dir2/file_name
155
+ # sub paths would create DirStat objs or FileStat(FileStat create using last sub path).
156
+ # sub_paths_index - the index indicates the next sub path to insert to the tree
157
+ # the index will be raised at each recursive call down the tree
158
+ # size - the instance size to insert to the tree
159
+ # modification_time - the instance modification_time to insert to the tree
160
+ def load_instance(sub_paths, sub_paths_index, size, modification_time)
161
+ # initialize dirs and files. This will indicate that the current DirStat is not new.
162
+ @dirs = {} unless @dirs
163
+ @files = {} unless @files
164
+ if sub_paths.size-1 == sub_paths_index
165
+ # Add File case - index points to last entry - leaf case.
166
+ file_stat = FileStat.new(sub_paths[sub_paths_index], @stable_state)
167
+ file_stat.set_event_queue(@event_queue)
168
+ file_stat.size = size
169
+ file_stat.modification_time = modification_time
170
+ file_stat.state = FileStatEnum::STABLE
171
+ add_file(file_stat)
172
+ else
173
+ # Add Dir to tree if not present. index points to new dir path.
174
+ dir_stat = @dirs[sub_paths[sub_paths_index]]
175
+ #create new dir if not exist
176
+ unless dir_stat
177
+ dir_stat = DirStat.new(sub_paths[sub_paths_index], @stable_state)
178
+ dir_stat.state = FileStatEnum::STABLE
179
+ dir_stat.set_event_queue(@event_queue)
180
+ add_dir(dir_stat)
181
+ end
182
+ # continue recursive call on tree with next sub path index
183
+ dir_stat.load_instance(sub_paths, sub_paths_index+1, size, modification_time)
184
+ end
146
185
  end
147
186
 
148
187
  # Adds directory for monitoring.
@@ -218,7 +257,7 @@ module FileMonitoring
218
257
  end
219
258
 
220
259
  # The assignment
221
- self.state= new_state
260
+ set_state(new_state)
222
261
  end
223
262
 
224
263
  # Updates the files and directories hashes and globs the directory for changes.
@@ -270,7 +309,7 @@ module FileMonitoring
270
309
  # change state only for existing directories
271
310
  # newly added directories have to remain with NEW state
272
311
  was_changed = true
273
- ds = DirStat.new(file, self.stable_state, @content_data_cache, FileStatEnum::NON_EXISTING)
312
+ ds = DirStat.new(file, self.stable_state)
274
313
  ds.set_event_queue(@event_queue) unless @event_queue.nil?
275
314
  ds.monitor
276
315
  add_dir(ds)
@@ -282,11 +321,7 @@ module FileMonitoring
282
321
  was_changed = true
283
322
  # check if file exist in content data cache - set state to STABLE
284
323
  file_state = FileStatEnum::NON_EXISTING
285
- if !@content_data_cache.nil? && @content_data_cache.include?(file)
286
- file_state = FileStatEnum::STABLE
287
- end
288
- fs = FileStat.new(file, self.stable_state, @content_data_cache, file_state)
289
-
324
+ fs = FileStat.new(file, self.stable_state)
290
325
  fs.set_event_queue(@event_queue) unless @event_queue.nil?
291
326
  fs.monitor
292
327
  add_file(fs)
data/lib/log.rb CHANGED
@@ -141,34 +141,70 @@ module Log
141
141
  end
142
142
 
143
143
  # Log info massages
144
- def Log.info(msg)
144
+ # params:
145
+ # msg, *args - Works to construct a string using: msg % args
146
+ # Examples:
147
+ # "hello" # no args provided
148
+ # "Time is %s. have a good day %s", Time.now, "Sir"
149
+ # Note: Use ONLY %s in msg. Since %d will crush for nil objects, while %s will print empty string.
150
+ # Implicit to_s is used to convert arg to %s.
151
+ # If no to_s exists then ruby uses inspection.
152
+ def Log.info(msg, *args)
145
153
  Log.init if @log4r.nil?
154
+ msg = msg % args
146
155
  @log4r.info(msg_with_caller(msg))
147
156
  Log.flush if Params['log_flush_each_message']
148
157
  end
149
158
 
150
159
  # Log debug level 1 massages
151
- def Log.debug1(msg)
160
+ # params:
161
+ # msg, *args - Works to construct a string using: msg % args
162
+ # Examples:
163
+ # "hello" # no args provided
164
+ # "Time is %s. have a good day %s", Time.now, "Sir"
165
+ # Note: Use ONLY %s in msg. Since %d will crush for nil objects, while %s will print empty string.
166
+ # Implicit to_s is used to convert arg to %s.
167
+ # If no to_s exists then ruby uses inspection.
168
+ def Log.debug1(msg, *args)
152
169
  if Params['log_debug_level'] >= 1
153
170
  Log.init if @log4r.nil?
171
+ msg = msg % args
154
172
  @log4r.debug(msg_with_caller(msg))
155
173
  Log.flush if Params['log_flush_each_message']
156
174
  end
157
175
  end
158
176
 
159
177
  # Log debug level 2 massages
160
- def Log.debug2(msg)
178
+ # params:
179
+ # msg, *args - Works to construct a string using: msg % args
180
+ # Examples:
181
+ # "hello" # no args provided
182
+ # "Time is %s. have a good day %s", Time.now, "Sir"
183
+ # Note: Use ONLY %s in msg. Since %d will crush for nil objects, while %s will print empty string.
184
+ # Implicit to_s is used to convert arg to %s.
185
+ # If no to_s exists then ruby uses inspection.
186
+ def Log.debug2(msg, *args)
161
187
  if Params['log_debug_level'] >= 2
162
188
  Log.init if @log4r.nil?
189
+ msg = msg % args
163
190
  @log4r.debug(msg_with_caller(msg))
164
191
  Log.flush if Params['log_flush_each_message']
165
192
  end
166
193
  end
167
194
 
168
195
  # Log debug level 3 massages
169
- def Log.debug3(msg)
196
+ # params:
197
+ # msg, *args - Works to construct a string using: msg % args
198
+ # Examples:
199
+ # "hello" # no args provided
200
+ # "Time is %s. have a good day %s", Time.now, "Sir"
201
+ # Note: Use ONLY %s in msg. Since %d will crush for nil objects, while %s will print empty string.
202
+ # Implicit to_s is used to convert arg to %s.
203
+ # If no to_s exists then ruby uses inspection.
204
+ def Log.debug3(msg, *args)
170
205
  if Params['log_debug_level'] >= 3
171
206
  Log.init if @log4r.nil?
207
+ msg = msg % args
172
208
  @log4r.debug(msg_with_caller(msg))
173
209
  Log.flush if Params['log_flush_each_message']
174
210
  end