apple-system-logger 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ba6fde620c359b96d2b984227aa7b22088a997366138e36652761f4df26f293b
4
+ data.tar.gz: d00f1c2f28139714f6ce39f2d582f5e4b19d34bad4bc3b87f10a0b1adb6b1bc5
5
+ SHA512:
6
+ metadata.gz: 939ff1063daba3109af937b97110af11cacff4e0f3bae322cf9da146f89b5f54b73cba7a23452af7c69c9593fa27885f331726465baf02050c0daacb33244041
7
+ data.tar.gz: afa1977b52a308db5d7ab84c27e50d0aa5458983611b2c70de8c82f584c0f35f84a2792916c8eafe79befed3db95d49a16fcae970c3c05087095c419637ba10f
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ ## 0.1.0 - 19-Oct-2019
2
+ * Initial release.
@@ -0,0 +1,11 @@
1
+ * CHANGES.md
2
+ * MANIFEST.md
3
+ * Rakefile
4
+ * README.md
5
+ * apple-system-logger.gemspec
6
+ * certs/djberg96_pub.pem
7
+ * lib/apple-system-logger.rb
8
+ * lib/apple/system/logger.rb
9
+ * lib/apple/system/logger/constants.rb
10
+ * lib/apple/system/logger/functions.rb
11
+ * spec/apple-system-logger_spec.rb
@@ -0,0 +1,51 @@
1
+ ## apple-system-logger
2
+ A Ruby interface for the Apple system logger.
3
+
4
+ ## Installation
5
+ gem install apple-system-logger
6
+
7
+ ## Synopsis
8
+ ```
9
+ require 'apple-system-logger'
10
+
11
+ # With defaults
12
+ log = Apple::System::Logger.new
13
+ log.warn("This is a warning")
14
+
15
+ # With all possible options, including multicast to $stderr
16
+ log = Apple::System::Logger.new(
17
+ facility: 'com.apple.console',
18
+ level: Apple::System::Logger::ASL_LEVEL_WARNING,
19
+ progname: 'myprog',
20
+ logdev: $stderr
21
+ )
22
+
23
+ log.warn("This is also a warning")
24
+
25
+ # Search for logs
26
+ log = Apple::System::Logger.new
27
+ results = log.search(:sender => 'bootlog', :level => 5)
28
+
29
+ # Always do this when finished, or use the block version of the constructor
30
+ log.close
31
+ ```
32
+
33
+ ## License
34
+ Apache-2.0
35
+
36
+ ## Known Issues
37
+ It does not seem that you can multicast to any fileno except stdout and
38
+ stderr. I am not sure if this is by design, or if I am missing something,
39
+ because the API does not explicitly forbid other file descriptors, nor
40
+ does it raise an error.
41
+
42
+ ## Copyright
43
+ (C) 2019 Daniel J. Berger, All Rights Reserved
44
+
45
+ ## Warranty
46
+ This package is provided "as is" and without any express or
47
+ implied warranties, including, without limitation, the implied
48
+ warranties of merchantability and fitness for a particular purpose.
49
+
50
+ ## Author
51
+ Daniel J. Berger
@@ -0,0 +1,27 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rbconfig'
4
+ require 'rspec/core/rake_task'
5
+ include RbConfig
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ CLEAN.include('**/*.gem', '**/*.rbc', '**/*.rbx')
10
+
11
+ namespace 'gem' do
12
+ desc "Create the apple-system-logger gem"
13
+ task :create => [:clean] do
14
+ require 'rubygems/package'
15
+ spec = eval(IO.read('apple-system-logger.gemspec'))
16
+ spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
17
+ Gem::Package.build(spec, true)
18
+ end
19
+
20
+ desc "Install the apple-system-logger gem"
21
+ task :install => [:create] do
22
+ file = Dir["*.gem"].first
23
+ sh "gem install -l #{file}"
24
+ end
25
+ end
26
+
27
+ task :default => :spec
@@ -0,0 +1,33 @@
1
+ require 'rubygems'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'apple-system-logger'
5
+ spec.version = '0.1.0'
6
+ spec.author = 'Daniel J. Berger'
7
+ spec.email = 'djberg96@gmail.com'
8
+ spec.license = 'Apache-2.0'
9
+ spec.homepage = 'https://github.com/djberg96/apple-system-logger'
10
+ spec.summary = 'A Ruby interface for the Apple System Logger'
11
+ spec.test_file = 'spec/apple-system-logger_spec.rb'
12
+ spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
13
+ spec.cert_chain = ['certs/djberg96_pub.pem']
14
+
15
+ spec.add_dependency('ffi')
16
+ spec.add_development_dependency('rake')
17
+ spec.add_development_dependency('rspec')
18
+
19
+ spec.metadata = {
20
+ 'homepage_uri' => 'https://github.com/djberg96/apple-system-logger',
21
+ 'bug_tracker_uri' => 'https://github.com/djberg96/apple-system-logger/issues',
22
+ 'changelog_uri' => 'https://github.com/djberg96/apple-system-logger/blob/master/CHANGES',
23
+ 'documentation_uri' => 'https://github.com/djberg96/apple-system-logger/wiki',
24
+ 'source_code_uri' => 'https://github.com/djberg96/apple-system-logger',
25
+ 'wiki_uri' => 'https://github.com/djberg96/apple-system-logger/wiki'
26
+ }
27
+
28
+ spec.description = <<-EOF
29
+ The apple-system-logger library provides an interface for the Apple System
30
+ Library. You can both write to, and search, your mac's system logs using
31
+ this library using an API that is very similar to the stdlib Logger interface.
32
+ EOF
33
+ end
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MREwDwYDVQQDDAhkamJl
3
+ cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
4
+ MB4XDTE4MDMxODE1MjIwN1oXDTI4MDMxNTE1MjIwN1owPzERMA8GA1UEAwwIZGpi
5
+ ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
6
+ bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALgfaroVM6CI06cxr0/h
7
+ A+j+pc8fgpRgBVmHFaFunq28GPC3IvW7Nvc3Y8SnAW7pP1EQIbhlwRIaQzJ93/yj
8
+ u95KpkP7tA9erypnV7dpzBkzNlX14ACaFD/6pHoXoe2ltBxk3CCyyzx70mTqJpph
9
+ 75IB03ni9a8yqn8pmse+s83bFJOAqddSj009sGPcQO+QOWiNxqYv1n5EHcvj2ebO
10
+ 6hN7YTmhx7aSia4qL/quc4DlIaGMWoAhvML7u1fmo53CYxkKskfN8MOecq2vfEmL
11
+ iLu+SsVVEAufMDDFMXMJlvDsviolUSGMSNRTujkyCcJoXKYYxZSNtIiyd9etI0X3
12
+ ctu0uhrFyrMZXCedutvXNjUolD5r9KGBFSWH1R9u2I3n3SAyFF2yzv/7idQHLJJq
13
+ 74BMnx0FIq6fCpu5slAipvxZ3ZkZpEXZFr3cIBtO1gFvQWW7E/Y3ijliWJS1GQFq
14
+ 058qERadHGu1yu1dojmFRo6W2KZvY9al2yIlbkpDrD5MYQIDAQABo3cwdTAJBgNV
15
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUFZsMapgzJimzsbaBG2Tm8j5e
16
+ AzgwHQYDVR0RBBYwFIESZGpiZXJnOTZAZ21haWwuY29tMB0GA1UdEgQWMBSBEmRq
17
+ YmVyZzk2QGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAW2tnYixXQtKxgGXq
18
+ /3iSWG2bLwvxS4go3srO+aRXZHrFUMlJ5W0mCxl03aazxxKTsVVpZD8QZxvK91OQ
19
+ h9zr9JBYqCLcCVbr8SkmYCi/laxIZxsNE5YI8cC8vvlLI7AMgSfPSnn/Epq1GjGY
20
+ 6L1iRcEDtanGCIvjqlCXO9+BmsnCfEVehqZkQHeYczA03tpOWb6pon2wzvMKSsKH
21
+ ks0ApVdstSLz1kzzAqem/uHdG9FyXdbTAwH1G4ZPv69sQAFAOCgAqYmdnzedsQtE
22
+ 1LQfaQrx0twO+CZJPcRLEESjq8ScQxWRRkfuh2VeR7cEU7L7KqT10mtUwrvw7APf
23
+ DYoeCY9KyjIBjQXfbj2ke5u1hZj94Fsq9FfbEQg8ygCgwThnmkTrrKEiMSs3alYR
24
+ ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
25
+ WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
26
+ -----END CERTIFICATE-----
@@ -0,0 +1 @@
1
+ require_relative 'apple/system/logger'
@@ -0,0 +1,288 @@
1
+ require_relative 'logger/functions'
2
+ require_relative 'logger/constants'
3
+
4
+ module Apple
5
+ module System
6
+ class Logger
7
+ include Apple::System::LoggerFunctions
8
+ include Apple::System::LoggerConstants
9
+
10
+ # The version of this library.
11
+ VERSION = '0.1.0'.freeze
12
+
13
+ # A syslogd facility. The system default is 'user'.
14
+ attr_reader :facility
15
+
16
+ # The logging severity threshold. The default is debug.
17
+ attr_reader :level
18
+
19
+ # The program name, or ident, that becomes the key sender. The default is nil.
20
+ attr_reader :progname
21
+
22
+ # If provided, a file or filehandle that the logger will multicast to. The default is nil.
23
+ attr_reader :logdev
24
+
25
+ # Create and return an Apple::System::Logger instance. The constructor takes a series
26
+ # of optional arguments:
27
+ #
28
+ # * facility
29
+ # * level
30
+ # * progname
31
+ # * logdev
32
+ #
33
+ # Note that the logdev only seems to work with $stdout or $stderr, if provided.
34
+ #
35
+ # For the severity level, the possible values are:
36
+ #
37
+ # * ASL_LEVEL_EMERG
38
+ # * ASL_LEVEL_ALERT
39
+ # * ASL_LEVEL_CRIT
40
+ # * ASL_LEVEL_ERR
41
+ # * ASL_LEVEL_WARNING
42
+ # * ASL_LEVEL_NOTICE
43
+ # * ASL_LEVEL_INFO
44
+ # * ASL_LEVEL_DEBUG
45
+ #
46
+ # You may optionally use a block, which will yield the logger instance and
47
+ # automatically close itself.
48
+ #
49
+ # Example:
50
+ #
51
+ # # Typical
52
+ # log = Apple::System::Logger.new(facility: 'com.apple.console', progname: 'my-program')
53
+ # log.warn("Some warning message")
54
+ #
55
+ # # Block form
56
+ # Apple::System::Logger.new(facility: 'com.apple.console', progname: 'my-program') do |log|
57
+ # log.warn("Some warning message")
58
+ # end
59
+ #--
60
+ # TODO: Add string format support and apply it to messages.
61
+ #
62
+ def initialize(**kwargs)
63
+ @facility = kwargs[:facility]
64
+ @level = kwargs[:level] || ASL_LEVEL_DEBUG
65
+ @progname = kwargs[:progname]
66
+ @logdev = kwargs[:logdev]
67
+
68
+ if @logdev || @facility || @progname
69
+ options = ASL_OPT_NO_DELAY | ASL_OPT_NO_REMOTE
70
+ @aslclient = asl_open(@progname, @facility, options)
71
+
72
+ if @logdev
73
+ asl_add_log_file(@aslclient, @logdev.fileno)
74
+ end
75
+ else
76
+ @aslclient = nil
77
+ end
78
+
79
+ @aslmsg = asl_new(ASL_TYPE_MSG)
80
+ asl_set(@aslmsg, ASL_KEY_FACILITY, @facility) if @facility
81
+ asl_set_filter(@aslclient, @level)
82
+
83
+ if block_given?
84
+ begin
85
+ yield self
86
+ ensure
87
+ close
88
+ end
89
+ end
90
+ end
91
+
92
+ # Dump a message with no formatting at the current severity level.
93
+ #
94
+ def <<(message)
95
+ asl_log(@aslclient, @aslmsg, @level, message)
96
+ end
97
+
98
+ # Log a message at the given level.
99
+ #
100
+ def add(level, message)
101
+ asl_log(@aslclient, @aslmsg, level, message)
102
+ end
103
+
104
+ # Log a debug message.
105
+ #
106
+ def debug(message)
107
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_DEBUG, message)
108
+ end
109
+
110
+ # Returns true if the current severity level allows for the printing of debug messages.
111
+ #
112
+ def debug?
113
+ level >= ASL_LEVEL_DEBUG
114
+ end
115
+
116
+ # Log an info message.
117
+ #
118
+ def info(message)
119
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_INFO, message)
120
+ end
121
+
122
+ # Returns true if the current severity level allows for the printing of info messages.
123
+ #
124
+ def info?
125
+ level >= ASL_LEVEL_INFO
126
+ end
127
+
128
+ # Log a warning message.
129
+ #
130
+ def warn(message)
131
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_WARNING, message)
132
+ end
133
+
134
+ # Returns true if the current severity level allows for the printing of warning messages.
135
+ #
136
+ def warn?
137
+ level >= ASL_LEVEL_WARNING
138
+ end
139
+
140
+ # Log an error message.
141
+ #
142
+ def error
143
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_ERR, message)
144
+ end
145
+
146
+ # Returns true if the current severity level allows for the printing of erro messages.
147
+ #
148
+ def error?
149
+ level >= ASL_LEVEL_ERR
150
+ end
151
+
152
+ # Log a fatal message. For this library that means an ASL_LEVEL_CRIT message.
153
+ #
154
+ def fatal
155
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_CRIT, message)
156
+ end
157
+
158
+ # Returns true if the current severity level allows for the printing of fatal messages.
159
+ #
160
+ def fatal?
161
+ level >= ASL_LEVEL_CRIT
162
+ end
163
+
164
+ # Log an unknown message. For this library that means an ASL_LEVEL_EMERG message.
165
+ #
166
+ def unknown(message)
167
+ asl_log(@aslclient, @aslmsg, ASL_LEVEL_EMERG, message)
168
+ end
169
+
170
+ # Search the logs using the provided query. The query should be a hash of
171
+ # options. Returns an array of hashes.
172
+ #
173
+ # Example:
174
+ #
175
+ # log = Apple::System::Logger.new
176
+ #
177
+ # options = {
178
+ # :sender => 'bootlog'
179
+ # :level => 5
180
+ # }
181
+ #
182
+ # results = log.search(options)
183
+ #
184
+ # # Sample output
185
+ #
186
+ # [{
187
+ # "ASLMessageID" => "1",
188
+ # "Time" => "1570858104",
189
+ # "TimeNanoSec" => "0",
190
+ # "Level" => "5",
191
+ # "PID" => "0",
192
+ # "UID" => "0",
193
+ # "GID" => "0",
194
+ # "ReadGID" => "80",
195
+ # "Host" => "localhost",
196
+ # "Sender" => "bootlog",
197
+ # "Facility" => "com.apple.system.utmpx",
198
+ # "Message" => "BOOT_TIME 1570858104 0",
199
+ # "ut_id" => "0x00 0x00 0x00 0x00",
200
+ # "ut_pid" => "1",
201
+ # "ut_type" => "2",
202
+ # "ut_tv.tv_sec" => "1570858104",
203
+ # "ut_tv.tv_usec" => "0",
204
+ # "ASLExpireTime" => "1602480504"
205
+ # }]
206
+ #
207
+ # Only equality checks are used for most options. In the future, I will allow
208
+ # for more advanced queries, such as substrings and <, >, <=, >=.
209
+ #
210
+ # Note that Time objects are queried using "greater than or equal to" for now.
211
+ #
212
+ # Example:
213
+ #
214
+ # # Find all logs from uid 501 from the last hour.
215
+ # log.search(:uid => 501, :time => Time.now - 3600)
216
+ #
217
+ def search(query)
218
+ value = nil
219
+ aslmsg = asl_new(ASL_TYPE_QUERY)
220
+ result = []
221
+
222
+ query.each do |key, value|
223
+ asl_key = map_key_to_asl_key(key)
224
+ flags = ASL_QUERY_OP_EQUAL
225
+ flags = (flags | ASL_QUERY_OP_NUMERIC) if value.is_a?(Numeric)
226
+ flags = (flags | ASL_QUERY_OP_TRUE) if value == true
227
+
228
+ if value.is_a?(Time)
229
+ flags = (flags | ASL_QUERY_OP_GREATER_EQUAL)
230
+ value = value.to_i
231
+ end
232
+
233
+ if value.is_a?(Regexp)
234
+ flags = (flags | ASL_QUERY_OP_REGEX)
235
+ flags = (flags | ASL_QUERY_OP_CASEFOLD) if value.casefold?
236
+ end
237
+
238
+ asl_set_query(aslmsg, asl_key, value.to_s, flags)
239
+ end
240
+
241
+ response = asl_search(@aslclient, aslmsg)
242
+
243
+ while m = aslresponse_next(response)
244
+ break if m.null?
245
+ i = 0
246
+ hash = {}
247
+ while key = asl_key(m, i)
248
+ break if key.nil? || key.empty?
249
+ value = asl_get(m, key)
250
+ hash[key] = value
251
+ i += 1
252
+ end
253
+ result << hash
254
+ end
255
+
256
+ result
257
+ ensure
258
+ aslresponse_free(response) if response
259
+ asl_free(aslmsg)
260
+ end
261
+
262
+ # Close the logger instance. You should always do this.
263
+ #
264
+ def close
265
+ asl_free(@aslmsg) if @aslmsg
266
+ asl_close(@aslclient) if @aslclient
267
+ @aslmsg = nil
268
+ @aslclient = nil
269
+ end
270
+
271
+ private
272
+
273
+ def map_key_to_asl_key(key)
274
+ {
275
+ :time => ASL_KEY_TIME,
276
+ :host => ASL_KEY_HOST,
277
+ :sender => ASL_KEY_SENDER,
278
+ :facility => ASL_KEY_FACILITY,
279
+ :pid => ASL_KEY_PID,
280
+ :uid => ASL_KEY_UID,
281
+ :gid => ASL_KEY_GID,
282
+ :level => ASL_KEY_LEVEL,
283
+ :message => ASL_KEY_MSG
284
+ }[key]
285
+ end
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,50 @@
1
+ module Apple
2
+ module System
3
+ module LoggerConstants
4
+ ASL_KEY_TIME = "Time"
5
+ ASL_KEY_HOST = "Host"
6
+ ASL_KEY_SENDER = "Sender"
7
+ ASL_KEY_FACILITY = "Facility"
8
+ ASL_KEY_PID = "PID"
9
+ ASL_KEY_UID = "UID"
10
+ ASL_KEY_GID = "GID"
11
+ ASL_KEY_LEVEL = "Level"
12
+ ASL_KEY_MSG = "Message"
13
+
14
+ ASL_LEVEL_EMERG = 0
15
+ ASL_LEVEL_ALERT = 1
16
+ ASL_LEVEL_CRIT = 2
17
+ ASL_LEVEL_ERR = 3
18
+ ASL_LEVEL_WARNING = 4
19
+ ASL_LEVEL_NOTICE = 5
20
+ ASL_LEVEL_INFO = 6
21
+ ASL_LEVEL_DEBUG = 7
22
+
23
+ ASL_TYPE_MSG = 0
24
+ ASL_TYPE_QUERY = 1
25
+ ASL_TYPE_LIST = 2
26
+ ASL_TYPE_FILE = 3
27
+ ASL_TYPE_STORE = 4
28
+ ASL_TYPE_CLIENT = 5
29
+
30
+ ASL_OPT_STDERR = 0x00000001
31
+ ASL_OPT_NO_DELAY = 0x00000002
32
+ ASL_OPT_NO_REMOTE = 0x00000004
33
+
34
+ ASL_QUERY_OP_CASEFOLD = 0x0010
35
+ ASL_QUERY_OP_PREFIX = 0x0020
36
+ ASL_QUERY_OP_SUFFIX = 0x0040
37
+ ASL_QUERY_OP_SUBSTRING = 0x0060
38
+ ASL_QUERY_OP_NUMERIC = 0x0080
39
+ ASL_QUERY_OP_REGEX = 0x0100
40
+
41
+ ASL_QUERY_OP_EQUAL = 0x0001
42
+ ASL_QUERY_OP_GREATER = 0x0002
43
+ ASL_QUERY_OP_GREATER_EQUAL = 0x0003
44
+ ASL_QUERY_OP_LESS = 0x0004
45
+ ASL_QUERY_OP_LESS_EQUAL = 0x0005
46
+ ASL_QUERY_OP_NOT_EQUAL = 0x0006
47
+ ASL_QUERY_OP_TRUE = 0x0007
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ require 'ffi'
2
+
3
+ module Apple
4
+ module System
5
+ module LoggerFunctions
6
+ extend FFI::Library
7
+ ffi_lib FFI::Library::LIBC
8
+
9
+ attach_function(:asl_add_log_file, [:pointer, :int], :int)
10
+ attach_function(:asl_close, [:pointer], :void)
11
+ attach_function(:asl_free, [:pointer], :void)
12
+ attach_function(:asl_get, [:pointer, :string], :string)
13
+ attach_function(:asl_key, [:pointer, :uint32], :string)
14
+ attach_function(:asl_log, [:pointer, :pointer, :int, :string, :varargs], :int)
15
+ attach_function(:asl_new, [:uint32], :pointer)
16
+ attach_function(:asl_open, [:string, :string, :uint32], :pointer)
17
+ attach_function(:asl_remove_log_file, [:pointer, :int], :int)
18
+ attach_function(:asl_search, [:pointer, :pointer], :pointer)
19
+ attach_function(:asl_send, [:pointer, :pointer], :int)
20
+ attach_function(:asl_set, [:pointer, :string, :string], :int)
21
+ attach_function(:asl_set_filter, [:pointer, :int], :int)
22
+ attach_function(:asl_set_query, [:pointer, :string, :string, :uint32], :int)
23
+ attach_function(:asl_unset, [:pointer, :string], :int)
24
+ attach_function(:asl_vlog, [:pointer, :pointer, :int, :string, :pointer], :int)
25
+ attach_function(:aslresponse_free, [:pointer], :void)
26
+ attach_function(:aslresponse_next, [:pointer], :pointer)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,115 @@
1
+ require 'apple-system-logger'
2
+
3
+ RSpec.describe Apple::System::Logger do
4
+ let(:log){ described_class.new }
5
+
6
+ context "instance methods" do
7
+ example "defines a facility method" do
8
+ expect(log).to respond_to(:facility)
9
+ end
10
+
11
+ example "the default facility is nil" do
12
+ expect(log.facility).to be_nil
13
+ end
14
+
15
+ example "defines a level method" do
16
+ expect(log).to respond_to(:level)
17
+ end
18
+
19
+ example "the default level is debug" do
20
+ expect(log.level).to eql(Apple::System::Logger::ASL_LEVEL_DEBUG)
21
+ end
22
+
23
+ example "defines a progname method" do
24
+ expect(log).to respond_to(:progname)
25
+ end
26
+
27
+ example "the default progname is nil" do
28
+ expect(log.progname).to be_nil
29
+ end
30
+
31
+ example "defines a logdev method" do
32
+ expect(log).to respond_to(:logdev)
33
+ end
34
+
35
+ example "the default logdev is nil" do
36
+ expect(log.logdev).to be_nil
37
+ end
38
+ end
39
+
40
+ context "logging methods" do
41
+ example "there is a << method" do
42
+ expect(log).to respond_to(:<<)
43
+ end
44
+
45
+ example "there is an add method" do
46
+ expect(log).to respond_to(:add)
47
+ end
48
+
49
+ example "there is a debug method" do
50
+ expect(log).to respond_to(:debug)
51
+ end
52
+
53
+ example "there is a debug? method that returns the expected value" do
54
+ expect(log.debug?).to be true
55
+ end
56
+
57
+ example "there is an info method" do
58
+ expect(log).to respond_to(:info)
59
+ end
60
+
61
+ example "there is a info? method that returns the expected value" do
62
+ expect(log.info?).to be true
63
+ end
64
+
65
+ example "there is a warn method" do
66
+ expect(log).to respond_to(:warn)
67
+ end
68
+
69
+ example "there is a warn? method that returns the expected value" do
70
+ expect(log.warn?).to be true
71
+ end
72
+
73
+ example "there is an error method" do
74
+ expect(log).to respond_to(:error)
75
+ end
76
+
77
+ example "there is a error? method that returns the expected value" do
78
+ expect(log.error?).to be true
79
+ end
80
+
81
+ example "there is a fatal method" do
82
+ expect(log).to respond_to(:error)
83
+ end
84
+
85
+ example "there is a fatal? method that returns the expected value" do
86
+ expect(log.fatal?).to be true
87
+ end
88
+
89
+ example "there is an unknown method" do
90
+ expect(log).to respond_to(:unknown)
91
+ end
92
+
93
+ example "there is a close method" do
94
+ expect(log).to respond_to(:close)
95
+ end
96
+
97
+ example "calling close on the logger instance works as expected" do
98
+ expect(log.close).to be_nil
99
+ expect(log.close).to be_nil
100
+ end
101
+ end
102
+
103
+ context "search" do
104
+ example "there is a search method" do
105
+ expect(log).to respond_to(:search)
106
+ end
107
+
108
+ example "a basic search returns the expected results" do
109
+ result = log.search(:sender => 'bootlog', :level => 5)
110
+ expect(result).to be_a_kind_of(Array)
111
+ expect(result.first).to be_a_kind_of(Hash)
112
+ expect(result.size).to eql(1)
113
+ end
114
+ end
115
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apple-system-logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel J. Berger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MREwDwYDVQQDDAhkamJl
14
+ cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
15
+ MB4XDTE4MDMxODE1MjIwN1oXDTI4MDMxNTE1MjIwN1owPzERMA8GA1UEAwwIZGpi
16
+ ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
17
+ bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALgfaroVM6CI06cxr0/h
18
+ A+j+pc8fgpRgBVmHFaFunq28GPC3IvW7Nvc3Y8SnAW7pP1EQIbhlwRIaQzJ93/yj
19
+ u95KpkP7tA9erypnV7dpzBkzNlX14ACaFD/6pHoXoe2ltBxk3CCyyzx70mTqJpph
20
+ 75IB03ni9a8yqn8pmse+s83bFJOAqddSj009sGPcQO+QOWiNxqYv1n5EHcvj2ebO
21
+ 6hN7YTmhx7aSia4qL/quc4DlIaGMWoAhvML7u1fmo53CYxkKskfN8MOecq2vfEmL
22
+ iLu+SsVVEAufMDDFMXMJlvDsviolUSGMSNRTujkyCcJoXKYYxZSNtIiyd9etI0X3
23
+ ctu0uhrFyrMZXCedutvXNjUolD5r9KGBFSWH1R9u2I3n3SAyFF2yzv/7idQHLJJq
24
+ 74BMnx0FIq6fCpu5slAipvxZ3ZkZpEXZFr3cIBtO1gFvQWW7E/Y3ijliWJS1GQFq
25
+ 058qERadHGu1yu1dojmFRo6W2KZvY9al2yIlbkpDrD5MYQIDAQABo3cwdTAJBgNV
26
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUFZsMapgzJimzsbaBG2Tm8j5e
27
+ AzgwHQYDVR0RBBYwFIESZGpiZXJnOTZAZ21haWwuY29tMB0GA1UdEgQWMBSBEmRq
28
+ YmVyZzk2QGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAW2tnYixXQtKxgGXq
29
+ /3iSWG2bLwvxS4go3srO+aRXZHrFUMlJ5W0mCxl03aazxxKTsVVpZD8QZxvK91OQ
30
+ h9zr9JBYqCLcCVbr8SkmYCi/laxIZxsNE5YI8cC8vvlLI7AMgSfPSnn/Epq1GjGY
31
+ 6L1iRcEDtanGCIvjqlCXO9+BmsnCfEVehqZkQHeYczA03tpOWb6pon2wzvMKSsKH
32
+ ks0ApVdstSLz1kzzAqem/uHdG9FyXdbTAwH1G4ZPv69sQAFAOCgAqYmdnzedsQtE
33
+ 1LQfaQrx0twO+CZJPcRLEESjq8ScQxWRRkfuh2VeR7cEU7L7KqT10mtUwrvw7APf
34
+ DYoeCY9KyjIBjQXfbj2ke5u1hZj94Fsq9FfbEQg8ygCgwThnmkTrrKEiMSs3alYR
35
+ ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
+ WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
+ -----END CERTIFICATE-----
38
+ date:
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: ffi
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ description: " The apple-system-logger library provides an interface for the Apple
83
+ System\n Library. You can both write to, and search, your mac's system logs using\n
84
+ \ this library using an API that is very similar to the stdlib Logger interface.
85
+ \n"
86
+ email: djberg96@gmail.com
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - apple-system-logger.gemspec
92
+ - spec
93
+ - spec/apple-system-logger_spec.rb
94
+ - README.md
95
+ - Rakefile
96
+ - MANIFEST.md
97
+ - certs
98
+ - certs/djberg96_pub.pem
99
+ - lib
100
+ - lib/apple
101
+ - lib/apple/system
102
+ - lib/apple/system/logger
103
+ - lib/apple/system/logger/constants.rb
104
+ - lib/apple/system/logger/functions.rb
105
+ - lib/apple/system/logger.rb
106
+ - lib/apple-system-logger.rb
107
+ - CHANGES.md
108
+ homepage: https://github.com/djberg96/apple-system-logger
109
+ licenses:
110
+ - Apache-2.0
111
+ metadata:
112
+ homepage_uri: https://github.com/djberg96/apple-system-logger
113
+ bug_tracker_uri: https://github.com/djberg96/apple-system-logger/issues
114
+ changelog_uri: https://github.com/djberg96/apple-system-logger/blob/master/CHANGES
115
+ documentation_uri: https://github.com/djberg96/apple-system-logger/wiki
116
+ source_code_uri: https://github.com/djberg96/apple-system-logger
117
+ wiki_uri: https://github.com/djberg96/apple-system-logger/wiki
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.0.6
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: A Ruby interface for the Apple System Logger
137
+ test_files:
138
+ - spec/apple-system-logger_spec.rb
Binary file