rcs-common 9.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/Rakefile +27 -0
- data/lib/rcs-common.rb +21 -0
- data/lib/rcs-common/binary.rb +64 -0
- data/lib/rcs-common/cgi.rb +7 -0
- data/lib/rcs-common/component.rb +87 -0
- data/lib/rcs-common/crypt.rb +71 -0
- data/lib/rcs-common/deploy.rb +96 -0
- data/lib/rcs-common/diagnosticable.rb +136 -0
- data/lib/rcs-common/evidence.rb +261 -0
- data/lib/rcs-common/evidence/addressbook.rb +173 -0
- data/lib/rcs-common/evidence/application.rb +59 -0
- data/lib/rcs-common/evidence/calendar.rb +62 -0
- data/lib/rcs-common/evidence/call.rb +185 -0
- data/lib/rcs-common/evidence/camera.rb +25 -0
- data/lib/rcs-common/evidence/chat.rb +272 -0
- data/lib/rcs-common/evidence/clibpoard.rb +58 -0
- data/lib/rcs-common/evidence/command.rb +50 -0
- data/lib/rcs-common/evidence/common.rb +78 -0
- data/lib/rcs-common/evidence/content/camera/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/coin/wallet_bit.dat +0 -0
- data/lib/rcs-common/evidence/content/coin/wallet_lite.dat +0 -0
- data/lib/rcs-common/evidence/content/file/Einstein.docx +0 -0
- data/lib/rcs-common/evidence/content/file/arabic.docx +0 -0
- data/lib/rcs-common/evidence/content/mouse/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/003.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/004.jpg +0 -0
- data/lib/rcs-common/evidence/content/print/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/003.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/003.jpg +0 -0
- data/lib/rcs-common/evidence/device.rb +23 -0
- data/lib/rcs-common/evidence/download.rb +54 -0
- data/lib/rcs-common/evidence/exec.rb +0 -0
- data/lib/rcs-common/evidence/file.rb +129 -0
- data/lib/rcs-common/evidence/filesystem.rb +71 -0
- data/lib/rcs-common/evidence/info.rb +24 -0
- data/lib/rcs-common/evidence/keylog.rb +84 -0
- data/lib/rcs-common/evidence/mail.rb +237 -0
- data/lib/rcs-common/evidence/mic.rb +39 -0
- data/lib/rcs-common/evidence/mms.rb +36 -0
- data/lib/rcs-common/evidence/money.rb +676 -0
- data/lib/rcs-common/evidence/mouse.rb +62 -0
- data/lib/rcs-common/evidence/password.rb +60 -0
- data/lib/rcs-common/evidence/photo.rb +80 -0
- data/lib/rcs-common/evidence/position.rb +303 -0
- data/lib/rcs-common/evidence/print.rb +50 -0
- data/lib/rcs-common/evidence/screenshot.rb +53 -0
- data/lib/rcs-common/evidence/sms.rb +91 -0
- data/lib/rcs-common/evidence/url.rb +133 -0
- data/lib/rcs-common/fixnum.rb +48 -0
- data/lib/rcs-common/gridfs.rb +294 -0
- data/lib/rcs-common/heartbeat.rb +96 -0
- data/lib/rcs-common/keywords.rb +50 -0
- data/lib/rcs-common/mime.rb +65 -0
- data/lib/rcs-common/mongoid.rb +19 -0
- data/lib/rcs-common/pascalize.rb +62 -0
- data/lib/rcs-common/path_utils.rb +67 -0
- data/lib/rcs-common/resolver.rb +40 -0
- data/lib/rcs-common/rest.rb +17 -0
- data/lib/rcs-common/sanitize.rb +42 -0
- data/lib/rcs-common/serializer.rb +404 -0
- data/lib/rcs-common/signature.rb +141 -0
- data/lib/rcs-common/stats.rb +94 -0
- data/lib/rcs-common/symbolize.rb +10 -0
- data/lib/rcs-common/systemstatus.rb +136 -0
- data/lib/rcs-common/temporary.rb +13 -0
- data/lib/rcs-common/time.rb +24 -0
- data/lib/rcs-common/trace.rb +138 -0
- data/lib/rcs-common/trace.yaml +42 -0
- data/lib/rcs-common/updater/client.rb +354 -0
- data/lib/rcs-common/updater/dsl.rb +178 -0
- data/lib/rcs-common/updater/payload.rb +79 -0
- data/lib/rcs-common/updater/server.rb +126 -0
- data/lib/rcs-common/updater/shared_key.rb +55 -0
- data/lib/rcs-common/updater/tmp_dir.rb +13 -0
- data/lib/rcs-common/utf16le.rb +83 -0
- data/lib/rcs-common/version.rb +5 -0
- data/lib/rcs-common/winfirewall.rb +235 -0
- data/rcs-common.gemspec +64 -0
- data/spec/gridfs_spec.rb +637 -0
- data/spec/mongoid.yaml +6 -0
- data/spec/signature_spec.rb +105 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/updater_spec.rb +80 -0
- data/tasks/deploy.rake +21 -0
- data/tasks/protect.rake +90 -0
- data/test/helper.rb +17 -0
- data/test/test_binary.rb +107 -0
- data/test/test_cgi.rb +14 -0
- data/test/test_crypt.rb +125 -0
- data/test/test_evidence.rb +52 -0
- data/test/test_evidence_manager.rb +119 -0
- data/test/test_fixnum.rb +35 -0
- data/test/test_keywords.rb +137 -0
- data/test/test_mime.rb +49 -0
- data/test/test_pascalize.rb +100 -0
- data/test/test_path_utils.rb +24 -0
- data/test/test_rcs-common.rb +7 -0
- data/test/test_sanitize.rb +40 -0
- data/test/test_serialization.rb +20 -0
- data/test/test_stats.rb +90 -0
- data/test/test_symbolize.rb +20 -0
- data/test/test_systemstatus.rb +35 -0
- data/test/test_time.rb +56 -0
- data/test/test_trace.rb +25 -0
- data/test/test_utf16le.rb +71 -0
- data/test/test_winfirewall.rb +68 -0
- metadata +423 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
#
|
2
|
+
# Class to keep statistics by minute, hour, day, week and so on...
|
3
|
+
# to be subclassed and customized
|
4
|
+
#
|
5
|
+
|
6
|
+
module RCS
|
7
|
+
|
8
|
+
class Stats
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@stats = {}
|
12
|
+
|
13
|
+
# the template can be provided by the subclass
|
14
|
+
@template ||= Hash.new(0)
|
15
|
+
|
16
|
+
# total statistics ever
|
17
|
+
@stats[:total] = @template.dup
|
18
|
+
|
19
|
+
# remember the time when the total count was started
|
20
|
+
@stats[:total][:start] = Time.now.getutc
|
21
|
+
|
22
|
+
# sections to keep stats for
|
23
|
+
# the values are the tipping point
|
24
|
+
@sections ||= {:minutes => 0, :hours => 60, :days => 24, :weeks => 7}
|
25
|
+
|
26
|
+
# create the templates for each section
|
27
|
+
@sections.each_key do |section|
|
28
|
+
@stats[section] = {}
|
29
|
+
@stats[section][:last] = Array.new(5) { @template.dup }
|
30
|
+
@stats[section][:average] = @template.dup
|
31
|
+
@stats[section][:average][:samples] = 0
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def stats(section = nil)
|
37
|
+
section ? @stats[section] : @stats
|
38
|
+
end
|
39
|
+
|
40
|
+
def add(hash)
|
41
|
+
# for each key sum up the counters in the total and in the current minute
|
42
|
+
hash.each_pair do |k, v|
|
43
|
+
next if @stats[:total][k].nil? or v.nil?
|
44
|
+
@stats[:total][k] += v
|
45
|
+
@sections.keys.each do |section|
|
46
|
+
add_to_section section, k, v
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_to_section(section, k, v)
|
52
|
+
@stats[section][:last][0][k] ||= 0
|
53
|
+
@stats[section][:last][0][k] += v
|
54
|
+
end
|
55
|
+
|
56
|
+
def calculate
|
57
|
+
calculate_section @sections.keys.first
|
58
|
+
|
59
|
+
# each value in the @sections is the number of element of the previous section
|
60
|
+
# needed to form the current section
|
61
|
+
@sections.keys.each_with_index do |section, index|
|
62
|
+
calculate_section(section) if sample_limit(index)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def calculate_section(section)
|
67
|
+
# calculate the average for this section
|
68
|
+
@stats[section][:last].first.each_pair do |k, v|
|
69
|
+
@stats[section][:average][k] = ((@stats[section][:average][k].to_f * @stats[section][:average][:samples] + v) / (@stats[section][:average][:samples] + 1)).round(2)
|
70
|
+
end
|
71
|
+
@stats[section][:average][:samples] += 1
|
72
|
+
# initialize a new element for the current section
|
73
|
+
@stats[section][:last].insert(0, @template.dup)
|
74
|
+
# remove the last one
|
75
|
+
@stats[section][:last].pop
|
76
|
+
end
|
77
|
+
|
78
|
+
def sample_limit(index)
|
79
|
+
# tipping point of 0 means never tip
|
80
|
+
return false if @sections[@sections.keys[index]] == 0
|
81
|
+
|
82
|
+
# all the previous must be on the tipping point
|
83
|
+
values = []
|
84
|
+
index.downto(1) do |i|
|
85
|
+
prev = @sections.keys[i - 1]
|
86
|
+
values[i] = @stats[prev][:average][:samples] != 0 && @stats[prev][:average][:samples] % @sections[@sections.keys[i]] == 0
|
87
|
+
end
|
88
|
+
|
89
|
+
values.compact.inject(:&)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end #RCS
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'sys/filesystem'
|
2
|
+
require 'sys/cpu'
|
3
|
+
|
4
|
+
include Sys
|
5
|
+
|
6
|
+
module RCS
|
7
|
+
module SystemStatusCodes
|
8
|
+
OK = "OK"
|
9
|
+
WARN = "WARN"
|
10
|
+
ERROR = "ERROR"
|
11
|
+
end
|
12
|
+
|
13
|
+
module SystemStatusMixin
|
14
|
+
def self.included(base)
|
15
|
+
base.extend(ClassMethods)
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def change_status(*args); SystemStatus.set(*args); end
|
20
|
+
end
|
21
|
+
|
22
|
+
def change_status(*args); SystemStatus.set(*args); end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Status of the process and system
|
26
|
+
class SystemStatus
|
27
|
+
include SystemStatusCodes
|
28
|
+
|
29
|
+
DEFAULT = {status: OK, message: "Idle"}
|
30
|
+
|
31
|
+
@@prev_cpu = {}
|
32
|
+
@@prev_time = {}
|
33
|
+
@@current = DEFAULT
|
34
|
+
@@windowsOS = RUBY_PLATFORM.downcase.include?("mingw")
|
35
|
+
@@filesystem_stat_path = nil
|
36
|
+
|
37
|
+
def self.reset
|
38
|
+
@@current = DEFAULT
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.set(status, message)
|
42
|
+
@@current = {status: status.to_s.upcase, message: message}
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.status
|
46
|
+
@@current[:status]
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.message
|
50
|
+
@@current[:message]
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.windows?
|
54
|
+
@@windowsOS
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.filesystem_stat(path)
|
58
|
+
Filesystem.stat(path) rescue nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.filesystem_stat_path
|
62
|
+
return @@filesystem_stat_path if @@filesystem_stat_path
|
63
|
+
|
64
|
+
pwd = Dir.pwd
|
65
|
+
|
66
|
+
if !windows?
|
67
|
+
return @@filesystem_stat_path = pwd
|
68
|
+
end
|
69
|
+
|
70
|
+
loop do
|
71
|
+
stat = filesystem_stat(pwd+"\\")
|
72
|
+
return @@filesystem_stat_path = stat.path if stat
|
73
|
+
pwd = File.dirname(pwd.gsub('\\', '/')).gsub('/', '\\')
|
74
|
+
raise "Unable to find a valid mount point" if pwd == "."
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# returns the percentage of free space
|
79
|
+
def self.disk_free
|
80
|
+
stat = Filesystem.stat(filesystem_stat_path)
|
81
|
+
# get the free and total blocks
|
82
|
+
free = stat.blocks_free.to_f
|
83
|
+
total = stat.blocks.to_f
|
84
|
+
# return the percentage (pessimistic)
|
85
|
+
return (free / total * 100).floor
|
86
|
+
end
|
87
|
+
|
88
|
+
# returns an indicator of the CPU usage in the last minute
|
89
|
+
# not exactly the CPU usage percentage, but very close to it
|
90
|
+
def self.cpu_load
|
91
|
+
# cpu load in the last minute
|
92
|
+
avg = CPU.load_avg
|
93
|
+
if avg.is_a? Array
|
94
|
+
# under unix like, there are 3 values (1, 15 and 15 minutes)
|
95
|
+
load_last_minute = avg.first
|
96
|
+
# default values for systems where the number is not reported (linux)
|
97
|
+
num_cpu = 1
|
98
|
+
num_cpu = CPU.num_cpu if CPU.num_cpu
|
99
|
+
# on multi core systems we have to divide by the number of CPUs
|
100
|
+
percentage = (load_last_minute / num_cpu * 100).floor
|
101
|
+
else
|
102
|
+
# under windows there is only one value that is the percentage
|
103
|
+
percentage = avg
|
104
|
+
# sometimes it returns nil under windows
|
105
|
+
percentage ||= 0
|
106
|
+
end
|
107
|
+
|
108
|
+
return percentage
|
109
|
+
end
|
110
|
+
|
111
|
+
# returns the CPU usage of the current process
|
112
|
+
def self.my_cpu_load(me)
|
113
|
+
|
114
|
+
# the first call to it, keep track of different thread calling the method
|
115
|
+
@@prev_cpu[me] ||= Process.times
|
116
|
+
@@prev_time[me] ||= Time.now
|
117
|
+
|
118
|
+
# calculate the current cpu time
|
119
|
+
current_cpu = Process.times
|
120
|
+
|
121
|
+
# diff them and divide by the call interval
|
122
|
+
cpu_time = (current_cpu.utime + current_cpu.stime) - (@@prev_cpu[me].utime + @@prev_cpu[me].stime)
|
123
|
+
time_diff = Time.now - @@prev_time[me]
|
124
|
+
# prevent division by zero on low res systems
|
125
|
+
time_diff = (time_diff == 0) ? 1 : time_diff
|
126
|
+
# calculate the percentage
|
127
|
+
cpu_percent = cpu_time / time_diff
|
128
|
+
|
129
|
+
# remember it for the next iteration
|
130
|
+
@@prev_cpu[me] = Process.times
|
131
|
+
@@prev_time[me] = Time.now
|
132
|
+
|
133
|
+
return cpu_percent.ceil
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# Helper methods for decoding Windows FILETIME structs.
|
3
|
+
#
|
4
|
+
|
5
|
+
class Time
|
6
|
+
# Convert the time to the FILETIME format, a 64-bit value representing the
|
7
|
+
# number of 100-nanosecond intervals since January 1, 1601 (UTC).
|
8
|
+
def to_filetime
|
9
|
+
t = self.to_f + 11644473600
|
10
|
+
t *= 10000000
|
11
|
+
t = t.to_i
|
12
|
+
return (t & 0xFFFFFFFF), (t & 0xFFFFFFFF00000000) >> 32
|
13
|
+
end
|
14
|
+
|
15
|
+
# Create a time object from the FILETIME format, a 64-bit value representing
|
16
|
+
# the number of 100-nanosecond intervals since January 1, 1601 (UTC).
|
17
|
+
def self.from_filetime(high, low)
|
18
|
+
wtime = Float((high << 32) | low)
|
19
|
+
unix_hundreds_nanosec = wtime - 116_444_736_000_000_000
|
20
|
+
seconds_with_frac = unix_hundreds_nanosec / 10_000_000
|
21
|
+
|
22
|
+
return Time.at(seconds_with_frac).getutc
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
#
|
2
|
+
# The logging module
|
3
|
+
#
|
4
|
+
|
5
|
+
# System
|
6
|
+
require 'log4r'
|
7
|
+
require 'log4r/yamlconfigurator'
|
8
|
+
require 'log4r/outputter/datefileoutputter'
|
9
|
+
|
10
|
+
module RCS
|
11
|
+
module Tracer
|
12
|
+
include Log4r
|
13
|
+
|
14
|
+
TRACE_YAML_NAME = 'trace.yaml'
|
15
|
+
|
16
|
+
# Ensures that the log directories exists
|
17
|
+
def trace_ensure_log_folders
|
18
|
+
pwd = File.expand_path(Dir.pwd)
|
19
|
+
|
20
|
+
["#{pwd}/log", "#{pwd}/log/err"].each do |path|
|
21
|
+
Dir.mkdir(path) unless File.directory?(path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def trace_setup
|
26
|
+
pwd = File.expand_path(Dir.pwd)
|
27
|
+
|
28
|
+
raise "FATAL: Invalid execution directory." unless File.directory?("#{pwd}/lib")
|
29
|
+
|
30
|
+
trace_file_path = File.exist?(TRACE_YAML_NAME) ? TRACE_YAML_NAME : "#{pwd}/config/#{TRACE_YAML_NAME}"
|
31
|
+
raise "FATAL: Unable to find #{TRACE_YAML_NAME} file" unless File.exist?(trace_file_path)
|
32
|
+
|
33
|
+
trace_ensure_log_folders
|
34
|
+
|
35
|
+
trace_cfg = YamlConfigurator
|
36
|
+
|
37
|
+
# the only parameter in the YAML, our HOME directory
|
38
|
+
trace_cfg['HOME'] = pwd
|
39
|
+
|
40
|
+
# load the YAML file with this
|
41
|
+
trace_cfg.load_yaml_file(trace_file_path)
|
42
|
+
rescue Exception => ex
|
43
|
+
raise "FATAL: Unable to load #{TRACE_YAML_NAME}: #{ex.message}"
|
44
|
+
end
|
45
|
+
|
46
|
+
# needed to initialize the trace subsystem.
|
47
|
+
# the path provided is the path where the 'trace.yaml' resides
|
48
|
+
# the configuration inside the yaml can be changed at will
|
49
|
+
# and the trace system will reflect it
|
50
|
+
#
|
51
|
+
# @deprecated Please use {#trace_setup} instead
|
52
|
+
def trace_init(path = '.', file = 'trace.yaml')
|
53
|
+
# the configuration file is YAML
|
54
|
+
# the file must be called trace.yaml and put in the working directory
|
55
|
+
# of the module that wants to use the 'trace' function
|
56
|
+
trace_cfg = YamlConfigurator
|
57
|
+
|
58
|
+
# the only parameter in the YAML, our HOME directory
|
59
|
+
trace_cfg['HOME'] = path
|
60
|
+
|
61
|
+
# load the YAML file with this
|
62
|
+
begin
|
63
|
+
trace_cfg.load_yaml_file(file)
|
64
|
+
rescue
|
65
|
+
raise "FATAL: cannot find trace.yaml file. aborting."
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
# http://log4r.rubyforge.org/manual.html#ndc
|
71
|
+
def trace_nested_push(msg)
|
72
|
+
# push the context
|
73
|
+
# the %x tag should appear in the YAML file if you want to see this traces
|
74
|
+
NDC.push(msg)
|
75
|
+
end
|
76
|
+
|
77
|
+
def trace_nested_pop
|
78
|
+
# pop the last context
|
79
|
+
NDC.pop
|
80
|
+
end
|
81
|
+
|
82
|
+
# http://log4r.rubyforge.org/manual.html#mdc
|
83
|
+
def trace_named_put(name, msg)
|
84
|
+
# create the named context
|
85
|
+
# the %X{name} tag should appear in the YAML file if you want to see this traces
|
86
|
+
MDC.put(name, msg)
|
87
|
+
end
|
88
|
+
|
89
|
+
def trace_named_remove(name)
|
90
|
+
# remove the specified context
|
91
|
+
MDC.remove(name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def thread_name
|
95
|
+
(Thread.current[:name] || Thread.current.object_id.to_s(32)).to_s
|
96
|
+
end
|
97
|
+
|
98
|
+
# the actual method used to output a trace
|
99
|
+
def trace(level, msg)
|
100
|
+
thread_info = "[Thread:#{thread_name}] " if ENV['TRACE_SHOW_THREAD_NAME']
|
101
|
+
msg = "#{thread_info}#{msg}"
|
102
|
+
|
103
|
+
log = Logger['rcslogger']
|
104
|
+
log.send(level, "#{msg}") unless log.nil?
|
105
|
+
|
106
|
+
# fallback if the logger is not initialized
|
107
|
+
puts "#{Time.now} [#{level.to_s.upcase}]: #{msg}" if log.nil? and not ENV['no_trace']
|
108
|
+
end
|
109
|
+
|
110
|
+
end # Tracer::
|
111
|
+
end # RCS::
|
112
|
+
|
113
|
+
if __FILE__ == $0
|
114
|
+
include RCS::Tracer
|
115
|
+
|
116
|
+
trace_init Dir.pwd
|
117
|
+
|
118
|
+
[:debug, :info, :warn, :error, :fatal].each do |level|
|
119
|
+
trace level, "this is a test"
|
120
|
+
end
|
121
|
+
|
122
|
+
trace_nested_push("level1")
|
123
|
+
trace :info, "test string"
|
124
|
+
|
125
|
+
trace_nested_push("level2")
|
126
|
+
trace :info, "test string"
|
127
|
+
|
128
|
+
trace_nested_pop
|
129
|
+
trace_nested_pop
|
130
|
+
trace :info, "test string"
|
131
|
+
|
132
|
+
trace_named_put(:test, "named tag")
|
133
|
+
trace :info, "test string"
|
134
|
+
|
135
|
+
trace_named_remove(:test)
|
136
|
+
trace :info, "test string"
|
137
|
+
|
138
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
# *** YAML2LOG4R ***
|
3
|
+
log4r_config:
|
4
|
+
# define all pre config ...
|
5
|
+
pre_config:
|
6
|
+
global:
|
7
|
+
level: DEBUG
|
8
|
+
root :
|
9
|
+
level: DEBUG
|
10
|
+
|
11
|
+
# define all loggers ...
|
12
|
+
loggers:
|
13
|
+
- name : rcslogger
|
14
|
+
level : DEBUG
|
15
|
+
additive : 'false'
|
16
|
+
trace : 'false'
|
17
|
+
outputters:
|
18
|
+
- stderr
|
19
|
+
# - logfile
|
20
|
+
|
21
|
+
# define all outputters (incl. formatters)
|
22
|
+
outputters:
|
23
|
+
- type : StderrOutputter
|
24
|
+
name : stderr
|
25
|
+
level : DEBUG
|
26
|
+
formatter:
|
27
|
+
# take a look at this: http://log4r.rubyforge.org/rdoc/Log4r/PatternFormatter.html
|
28
|
+
date_pattern: '%Y-%m-%d %H:%M:%S'
|
29
|
+
pattern : '%d [%l]: %X{:test} %x\t %m '
|
30
|
+
type : PatternFormatter
|
31
|
+
|
32
|
+
# - type : DateFileOutputter
|
33
|
+
# name : logfile
|
34
|
+
# level : DEBUG
|
35
|
+
# date_pattern: '%Y-%m-%d'
|
36
|
+
# trunc : 'false'
|
37
|
+
# dirname : "#{HOME}/logs"
|
38
|
+
# formatter :
|
39
|
+
# date_pattern: '%Y-%m-%d %H:%M:%S'
|
40
|
+
# pattern : '%d [%l]: %x %m'
|
41
|
+
# type : PatternFormatter
|
42
|
+
|