zlog 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 09e454b71eb8ad7237defaeebfb4c5a04ed1e4c1
4
- data.tar.gz: c634bc81b2f2242fa3511a8164712480edcf7661
3
+ metadata.gz: 95b3fd6c53f48770f2b2751940346071debc8dc4
4
+ data.tar.gz: 3954a451f924c658cb5a3a0df8b0db729a1bfc3e
5
5
  SHA512:
6
- metadata.gz: 594b912a1186fab36e5b40f9c2b24f19528cdb4d6c7ab33fbb835cb9bb526542649e48994f838b24917268316e577d7867d93cf293b27c9901fc497ee3f892b2
7
- data.tar.gz: 9675234eacea1b2939be8841818237ce67f8fefa5470d892e4b9a065325e20ded7687a89810b20cd93f747fdec198c5d2d5c8e11d9b27a60f979011b3bd2a367
6
+ metadata.gz: 45b5d98da16c8d21d224ace756249d056be82d7f1c589c147879cb4ab9db9fae2b7b03ae6ccdf8e07ff46014833cc364cdb63776d12bc499a10e8fa00363dc3f
7
+ data.tar.gz: fd5cbfcfc6f24749f0adb8d2be32d9dd12daf0c040847b7355c40dc54a2d68963a7fb3f3aa3af86bf2a7baad8426172929abd352e8681fd9c14dc834d123b6b9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.8
2
+
3
+ * feature: support reading log files for zlog formatter
4
+ * feature: added convertor from json (log file format) to logevent in zlog
5
+ * feature: get a writable logfile from a list of candidates or generate a random one
6
+
1
7
  ## 0.7
2
8
 
3
9
  * improvement: correctly ordered log levels (now: ... warn ok section error ...)
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
  gem 'logging', '~> 1.8.1'
3
+ gem 'json'
3
4
 
4
5
  group :development do
5
6
  gem 'rake', '~> 10.1.0'
data/README.md CHANGED
@@ -8,12 +8,12 @@ Logging configuration on top of ruby's `logging` gem (see [github](https://githu
8
8
  * supports continuous logging (eg progress indicators which you don't want to clutter your commandline)
9
9
  * added section and ok log types
10
10
 
11
- # requirements
11
+ ## requirements
12
12
 
13
13
  * gems:
14
14
  * logging
15
15
 
16
- # installation
16
+ ## installation
17
17
 
18
18
  From rubygems:
19
19
 
@@ -23,7 +23,7 @@ From source:
23
23
 
24
24
  gem build *.gemspec && gem install *gem
25
25
 
26
- # example
26
+ ## example
27
27
 
28
28
  Code:
29
29
 
@@ -42,4 +42,12 @@ Code:
42
42
 
43
43
  See the `example` folder for more.
44
44
 
45
+ ## utility
46
+
47
+ You can use `zlog` to read and format json-based log files:
48
+
49
+ cat file.log | zlog
50
+
51
+ It will print out a formatted representation of the log.
52
+
45
53
  ![Example image in example/example.output.png](https://raw.github.com/arlimus/zlog/master/example/example.output.png)
data/bin/zlog ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ require 'zlog/cli'
3
+ require 'optparse'
4
+
5
+ Zlog.init_stdout
6
+ Log = Logging.logger['zlog']
7
+
8
+ # Define the options for commandline interaction
9
+ options = {}
10
+ opt = OptionParser.new do |opts|
11
+ opts.banner = "usage: zlog [options]\n cat my.log | zlog [options]"
12
+
13
+ opts.on("-f", "--file FILE", "Read log from file") do |file|
14
+ options[:file] = file
15
+ end
16
+
17
+ opts.on("-s", "--simple", "Print simple layout") do |v|
18
+ options[:layout] = :simple
19
+ end
20
+
21
+ opts.on("-n", "--named", "Print simple layout with names") do |v|
22
+ options[:layout] = :named
23
+ end
24
+ end
25
+ opt.parse!
26
+
27
+ # create the commandline object for zlog
28
+ cli = Zlog::CLI.new options
29
+
30
+ # tiny print helper for reuse
31
+ print_out = lambda{ |line| puts line }
32
+
33
+ # if we are part of a pipe (eg: cat file.log | zlog), read input from stdin
34
+ # otherwise just try to read from the provided file parameter
35
+ if STDIN.tty?
36
+ # check if we have a file parameter provided
37
+ if options[:file].nil?
38
+ Log.error "you must provide at least a file parameter"
39
+ puts opt
40
+ exit 0
41
+ end
42
+ # verify that the file exists
43
+ if not File::file? options[:file]
44
+ Log.abort "file '#{options[:file]}' doesn't exist"
45
+ end
46
+ # read lines from file and format them
47
+ File::readlines( options[:file] ).each do |line|
48
+ print_out.( cli.convert_line line )
49
+ end
50
+ else
51
+ cli.convert_stdin &print_out
52
+ end
data/lib/zlog/cli.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'zlog'
2
+
3
+ class Zlog::CLI
4
+ def initialize opts = {}
5
+ @layout = case opts[:layout]
6
+ when :named
7
+ Zlog::Layouts.named
8
+ else
9
+ Zlog::Layouts.simple
10
+ end
11
+ end
12
+
13
+ def convert_line line, opts = {}
14
+ e = Zlog::json_2_event(line)
15
+ if not e.nil?
16
+ @layout.format(e)
17
+ end
18
+ end
19
+
20
+ def convert_stdin opts = {}, &handler
21
+ # collect all results to an array which will be returned
22
+ # in case that no block is given for processing
23
+ res = []
24
+ handler = lambda{|line| res.push line} if not block_given?
25
+
26
+ # process each line
27
+ STDIN.readlines.each do |line|
28
+ handler.( convert_line line, opts )
29
+ end
30
+
31
+ # return the result, in case we have any
32
+ res
33
+ end
34
+ end
35
+
data/lib/zlog/zlog.rb CHANGED
@@ -1,11 +1,22 @@
1
+ require 'json'
2
+
1
3
  module Zlog
2
- VERSION = "0.7"
4
+ VERSION = "0.8"
5
+ extend self
6
+
7
+ def init_stdout opts = {layout: :simple, loglevel: nil}
8
+ # determine the layout from options
9
+ layout = case opts[:layout]
10
+ when :named
11
+ Zlog::Layouts.named
12
+ else
13
+ Zlog::Layouts.simple
14
+ end
3
15
 
4
- def self.init_stdout opts = {named: false, loglevel: nil}
5
16
  # configure the default stdout appender
6
17
  Logging.appenders.stdout(
7
18
  level: opts[:loglevel],
8
- layout: (opts[:named]) ? Zlog::Layouts.named : Zlog::Layouts.simple
19
+ layout: layout
9
20
  )
10
21
  # find all non-stdout appenders
11
22
  # this prevents duplicates of stdout appender
@@ -13,4 +24,44 @@ module Zlog
13
24
  # add back all appenders + our own stdout appender
14
25
  Logging.logger.root.appenders = as + ["stdout"]
15
26
  end
27
+
28
+ def get_writable_logfile *candidates
29
+ ret = candidates.compact.find do |f|
30
+ # testing if something is writable, options:
31
+ # #1: discarged, returns false if the file doesn't exist;
32
+ # it would require to check the folder too... :(
33
+ # File::writable? f
34
+ #2 trial+error
35
+ begin
36
+ File.open(f,"a").close
37
+ true
38
+ rescue
39
+ false
40
+ end
41
+ end
42
+ # in case none of the provided logfiles is writable, create one
43
+ if ret.nil?
44
+ # try to get a prefix as the filename from the first provided log file
45
+ prefix = File::basename( candidates[0].to_s )
46
+ # determine a random filename
47
+ File::join( Dir::tmpdir, Dir::Tmpname.make_tmpname( prefix, nil ) )
48
+ else
49
+ # return the found good filename
50
+ ret
51
+ end
52
+ end
53
+
54
+ def json_2_event str
55
+ begin
56
+ j = JSON::load str
57
+ # LogEvent = Struct.new( :logger, :level, :data, :time, :file, :line, :method )
58
+ # from: https://github.com/TwP/logging/blob/master/lib/logging/log_event.rb
59
+ # json example:
60
+ # {"timestamp":"2013-10-10T18:37:38.513438+02:00","level":"DEBUG",
61
+ # "logger":"Log1-debug","message":"debugging info, this won't show up on console"}
62
+ Logging::LogEvent.new( j['logger'], Logging.level_num(j['level']), j['message'], j['timestamp'] )
63
+ rescue
64
+ nil
65
+ end
66
+ end
16
67
  end
@@ -34,20 +34,20 @@ describe Zlog::Layouts::Simple do
34
34
  format(2).must_equal (pattern_for :warning) + "\n"
35
35
  end
36
36
 
37
- it "must add error events" do
38
- format(3).must_equal (pattern_for :error) + "\n"
37
+ it "must add ok events" do
38
+ format(3).must_equal (pattern_for :ok) + "\n"
39
39
  end
40
40
 
41
- it "must add fatal events" do
42
- format(4).must_equal (pattern_for :fatal) + "\n"
41
+ it "must add section events" do
42
+ format(4).must_equal (pattern_for :section) + "\n"
43
43
  end
44
44
 
45
- it "must add ok events" do
46
- format(5).must_equal (pattern_for :ok) + "\n"
45
+ it "must add error events" do
46
+ format(5).must_equal (pattern_for :error) + "\n"
47
47
  end
48
48
 
49
- it "must add section events" do
50
- format(6).must_equal (pattern_for :section) + "\n"
49
+ it "must add fatal events" do
50
+ format(6).must_equal (pattern_for :fatal) + "\n"
51
51
  end
52
52
 
53
53
  it "must support continuous loggin, 1 step" do
@@ -35,20 +35,20 @@ describe Zlog::Layouts::SimpleNamed do
35
35
  format(2).must_equal (pattern_for :warning) + "\n"
36
36
  end
37
37
 
38
- it "must add error events" do
39
- format(3).must_equal (pattern_for :error) + "\n"
38
+ it "must add ok events" do
39
+ format(3).must_equal (pattern_for :ok) + "\n"
40
40
  end
41
41
 
42
- it "must add fatal events" do
43
- format(4).must_equal (pattern_for :fatal) + "\n"
42
+ it "must add section events" do
43
+ format(4).must_equal (pattern_for :section) + "\n"
44
44
  end
45
45
 
46
- it "must add ok events" do
47
- format(5).must_equal (pattern_for :ok) + "\n"
46
+ it "must add error events" do
47
+ format(5).must_equal (pattern_for :error) + "\n"
48
48
  end
49
49
 
50
- it "must add section events" do
51
- format(6).must_equal (pattern_for :section) + "\n"
50
+ it "must add fatal events" do
51
+ format(6).must_equal (pattern_for :fatal) + "\n"
52
52
  end
53
53
 
54
54
  it "must support continuous loggin, 1 step" do
@@ -1,7 +1,63 @@
1
1
  require 'minitest_helper'
2
+ require 'tmpdir'
2
3
 
3
4
  describe Zlog do
4
5
  it "can initialize itself to STDOUT" do
5
6
  Zlog.must_respond_to :init_stdout
6
7
  end
8
+
9
+ describe 'get_writable_logfile' do
10
+
11
+ before :each do
12
+ @random_writable = File::join( Dir::tmpdir, Dir::Tmpname.make_tmpname( "", nil ) )
13
+ @random_non_writable = File::join( '/dev', Dir::Tmpname.make_tmpname("",nil) )
14
+ end
15
+
16
+ it "must give a working writable log file" do
17
+ Zlog.get_writable_logfile( @random_writable ).
18
+ must_equal @random_writable
19
+ end
20
+
21
+ it "must give return the first actually writable log file" do
22
+ Zlog.get_writable_logfile( @random_non_writable, @random_writable ).
23
+ must_equal @random_writable
24
+ end
25
+
26
+ it "must provide a random file if none of the provided candidates are writable" do
27
+ f = Zlog.get_writable_logfile( @random_non_writable, @random_writable )
28
+ f.must_be_instance_of String
29
+ f.wont_be_empty
30
+ end
31
+
32
+ end
33
+
34
+ describe 'json_2_event' do
35
+ before :each do
36
+ template = '{"timestamp":"2013-10-10T18:37:38.513438+02:00","level":"%level","logger":"Mocker%level","message":"mock message %level"}'
37
+ names = ["DEBUG","INFO","WARN","OK","SECTION","ERROR","FATAL"]
38
+ @examples = (0..(names.length-1)).
39
+ map do |level|
40
+ {
41
+ raw: template.gsub( '%level', names[level] ),
42
+ level: level,
43
+ name: names[level]
44
+ }
45
+ end
46
+ end
47
+
48
+ it "must give nil on incorrect json" do
49
+ Zlog.json_2_event( "" ).must_be_nil
50
+ end
51
+
52
+ it "must convert a logging json to a logevent" do
53
+ @examples.each do |e|
54
+ r = Zlog.json_2_event e[:raw]
55
+ r.must_be_instance_of Logging::LogEvent
56
+ r.level.must_equal e[:level]
57
+ r.logger.must_equal "Mocker#{e[:name]}"
58
+ r.data.must_equal "mock message #{e[:name]}"
59
+ end
60
+ end
61
+
62
+ end
7
63
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zlog
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.7'
4
+ version: '0.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-06 00:00:00.000000000 Z
11
+ date: 2013-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logging
@@ -26,7 +26,8 @@ dependencies:
26
26
  version: 1.8.1
27
27
  description: rudimentary simple logging for ruby
28
28
  email: dominik.richter@googlemail.com
29
- executables: []
29
+ executables:
30
+ - zlog
30
31
  extensions: []
31
32
  extra_rdoc_files: []
32
33
  files:
@@ -37,10 +38,12 @@ files:
37
38
  - LICENSE
38
39
  - README.md
39
40
  - Rakefile
41
+ - bin/zlog
40
42
  - example/example.file.rb
41
43
  - example/example.output.png
42
44
  - example/example.simple+stdout.rb
43
45
  - lib/zlog.rb
46
+ - lib/zlog/cli.rb
44
47
  - lib/zlog/layouts.rb
45
48
  - lib/zlog/logging.rb
46
49
  - lib/zlog/simple_layouts.rb