content_server 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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