pretty_logger 1.1.4 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/pretty_logger/pretty_logger.rb +121 -0
- data/lib/pretty_logger/request_logger.rb +6 -6
- data/lib/pretty_logger/version.rb +2 -2
- data/lib/pretty_logger.rb +1 -1
- data/pretty_logger.gemspec +35 -0
- metadata +4 -3
- data/lib/pretty_logger/base_logger.rb +0 -95
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dffc0a00043f3c8cdd85dbf8357c14056635577225f2e85d608e4f8cdcd62e0
|
4
|
+
data.tar.gz: ba73d0d550463108a0d0f8d1a049bb6cb8a97a7b708d3569b46be3bd7da9431e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 746a7712134dc57153a6fa6ddca97a42bb5f2be6aeb79df7340903ef100f584331cc5d0c16127eaeafb75c62ee78392871f98b1278f6cfdf9ff332d42756aa51
|
7
|
+
data.tar.gz: 2cb1701efb5d9c66d44727aed1074c566253902336a4c03c0e921c61b297c20a92d2b785b988fa2c592f5a45a57fb28de5a27c1987356cdacc83b0cd69342c51
|
data/README.md
CHANGED
@@ -29,6 +29,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
29
29
|
- [ ] Add a config that can be set in an initializer for accessing user and prettifying in logs
|
30
30
|
- [ ] Customize location of custom_log file
|
31
31
|
- [ ] Don't auto-hijack errors, should need to add that manually?
|
32
|
+
- [ ] Don't require Rails- should be able to include in a basic Ruby project just as easily
|
32
33
|
|
33
34
|
## License
|
34
35
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module PrettyLogger
|
2
|
+
module_function
|
3
|
+
|
4
|
+
def instance
|
5
|
+
@instance ||= ::ActiveSupport::Logger.new("log/custom.log")
|
6
|
+
end
|
7
|
+
|
8
|
+
def timestamp
|
9
|
+
Time.current.in_time_zone("Mountain Time (US & Canada)").strftime("[%b %d, %I:%M:%S%P]")
|
10
|
+
end
|
11
|
+
|
12
|
+
def pretty_message(obj)
|
13
|
+
return obj if obj.is_a?(::String)
|
14
|
+
|
15
|
+
::CodeRay.scan(obj, :ruby).terminal.gsub(
|
16
|
+
/\e\[36m:(\w+)\e\[0m=>/i, ("\e[36m" + '\1: ' + "\e[0m") # hashrocket(sym) to colon(sym)
|
17
|
+
).gsub(
|
18
|
+
/\e\[0m=>/, "\e[0m: " # all hashrockets to colons
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def debug(*messages)
|
23
|
+
instance.debug("\e[90m#{timestamp}\e[90m[DEBUG]\e[0m " + messages.map { |m| pretty_message(m) }.join("\n"))
|
24
|
+
end
|
25
|
+
|
26
|
+
def info(*messages)
|
27
|
+
instance.info("\e[90m#{timestamp}\e[36m[INFO]\e[0m " + messages.map { |m| pretty_message(m) }.join("\n"))
|
28
|
+
end
|
29
|
+
|
30
|
+
def warn(*messages)
|
31
|
+
instance.warn("\e[90m#{timestamp}\e[38;5;208m[WARN]\e[0m " + messages.map { |m| pretty_message(m) }.join("\n"))
|
32
|
+
end
|
33
|
+
|
34
|
+
def error(*messages)
|
35
|
+
instance.error("\e[90m#{timestamp}\e[31m[ERROR]\e[0m " + messages.map { |m| pretty_message(m) }.join("\n"))
|
36
|
+
end
|
37
|
+
|
38
|
+
def cl
|
39
|
+
"\033[0m"
|
40
|
+
end
|
41
|
+
|
42
|
+
def rgb(r, g, b)
|
43
|
+
"\033[38;2;#{r};#{g};#{b}m"
|
44
|
+
end
|
45
|
+
|
46
|
+
def colorize(name, text)
|
47
|
+
return "" if text.blank?
|
48
|
+
"#{colors[name]}#{text}#{cl}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def colors
|
52
|
+
{
|
53
|
+
black: rgb(0, 0, 0),
|
54
|
+
white: rgb(255, 255, 255),
|
55
|
+
lime: rgb(0, 255, 0),
|
56
|
+
red: rgb(255, 0, 0),
|
57
|
+
blue: rgb(0, 0, 255),
|
58
|
+
yellow: rgb(255, 255, 0),
|
59
|
+
cyan: rgb(0, 255, 255),
|
60
|
+
magenta: rgb(255, 0, 255),
|
61
|
+
gold: rgb(218, 165, 32),
|
62
|
+
silver: rgb(192, 192, 192),
|
63
|
+
grey: rgb(150, 150, 150),
|
64
|
+
maroon: rgb(128, 0, 0),
|
65
|
+
olive: rgb(128, 128, 0),
|
66
|
+
green: rgb(0, 128, 0),
|
67
|
+
purple: rgb(128, 0, 128),
|
68
|
+
teal: rgb(0, 128, 128),
|
69
|
+
navy: rgb(0, 0, 128),
|
70
|
+
rocco: rgb(1, 96, 255),
|
71
|
+
orange: rgb(255, 150, 0),
|
72
|
+
pink: rgb(255, 150, 150),
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def focused_backtrace(trace)
|
77
|
+
return [] unless trace
|
78
|
+
trace.select { |line|
|
79
|
+
line.include?("/app/")
|
80
|
+
}.map { |line|
|
81
|
+
line.gsub(/^.*?#{Rails.root}/, "").gsub(/(app)?\/app\//, "app/").gsub(":in `", " `").gsub(/(:\d+) .*?$/, '\1')
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def clean_message(message)
|
86
|
+
message.gsub(/\#\<([\w\:]+)( id: \d+)?.*?\>\n/im) { |found|
|
87
|
+
"#<#{Regexp.last_match(1)}#{Regexp.last_match(2)}>\n"
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
def truncate(input, max_visible_length=2000, with: "...")
|
92
|
+
full = input.length
|
93
|
+
return input if full <= max_visible_length
|
94
|
+
|
95
|
+
clean = input.gsub(/\e\[[\d;]*[a-z]/i, "").length
|
96
|
+
return input if clean <= max_visible_length
|
97
|
+
|
98
|
+
max_visible_length -= with.gsub(/\e\[[\d;]*[a-z]/i, "").length
|
99
|
+
|
100
|
+
visible_length = 0
|
101
|
+
truncated_string = ""
|
102
|
+
|
103
|
+
input.scan(/(\e\[[\d;]*[a-z]|[^\e]+)/i) do |match|
|
104
|
+
part = match[0]
|
105
|
+
if part.match?(/\e\[[\d;]*[a-z]/i) # Match ANSI escape sequences
|
106
|
+
truncated_string += part # Do not add to the count
|
107
|
+
else
|
108
|
+
part.each_char do |char|
|
109
|
+
if visible_length < max_visible_length
|
110
|
+
truncated_string += char
|
111
|
+
visible_length += 1
|
112
|
+
else
|
113
|
+
break
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
"#{truncated_string}#{with}"
|
120
|
+
end
|
121
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
class PrettyLogger::RequestLogger
|
1
|
+
class PrettyLogger::RequestLogger
|
2
|
+
include PrettyLogger
|
2
3
|
attr_accessor :request, :current_user
|
3
4
|
|
4
5
|
def initialize(request:nil, current_user:nil)
|
@@ -7,17 +8,16 @@ class PrettyLogger::RequestLogger < PrettyLogger::BaseLogger
|
|
7
8
|
end
|
8
9
|
|
9
10
|
def log_request(extra_text=nil)
|
10
|
-
|
11
|
-
::PrettyLogger::BaseLogger.info([
|
11
|
+
info([
|
12
12
|
"#{pretty_user} #{request.method.upcase} #{request.path} #{extra_text}",
|
13
|
-
params.blank? ? nil :
|
13
|
+
params.blank? ? nil : truncate(pretty_message(params)),
|
14
14
|
].compact.join("\n"))
|
15
15
|
end
|
16
16
|
|
17
17
|
def log_error(exception)
|
18
|
-
|
18
|
+
error([
|
19
19
|
"#{pretty_user} #{request.path} #{colorize(:red, exception.class)}",
|
20
|
-
params.blank? ? nil :
|
20
|
+
params.blank? ? nil : truncate(pretty_message(params)),
|
21
21
|
colorize(:red, focused_backtrace(exception.backtrace).first),
|
22
22
|
colorize(:red, clean_message("#{exception.class} #{exception.message}")),
|
23
23
|
].compact.join("\n"))
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "1.
|
1
|
+
class PrettyLogger
|
2
|
+
VERSION = "1.2.0"
|
3
3
|
end
|
data/lib/pretty_logger.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "pretty_logger/version"
|
4
|
+
require_relative "pretty_logger/pretty_logger"
|
4
5
|
require_relative "pretty_logger/override_console_colors"
|
5
|
-
require_relative "pretty_logger/base_logger"
|
6
6
|
require_relative "pretty_logger/request_logger"
|
7
7
|
require_relative "pretty_logger/controller_methods"
|
8
8
|
require_relative "pretty_logger/railtie" if defined?(Rails)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/pretty_logger/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "pretty_logger"
|
7
|
+
spec.version = PrettyLogger::VERSION
|
8
|
+
spec.authors = ["Rocco Nicholls"]
|
9
|
+
spec.email = ["rocco11nicholls@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Quick logger that lets you output to a different log file for more controlled breakdowns of site visits."
|
12
|
+
spec.description = "Quick logger that lets you output to a different log file for more controlled breakdowns of site visits"
|
13
|
+
spec.homepage = "https://github.com/Rockster160/pretty_logger"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">= 2.6.0"
|
16
|
+
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/Rockster160/pretty_logger"
|
19
|
+
spec.metadata["changelog_uri"] = "https://github.com/Rockster160/pretty_logger/blob/master/CHANGELOG.md"
|
20
|
+
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
24
|
+
f.match(%r{\A(?:bin/|test/|spec/|features/|\.git|\.circleci/|appveyor\.yml)})
|
25
|
+
end
|
26
|
+
spec.bindir = "exe"
|
27
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ["lib"]
|
29
|
+
|
30
|
+
# Uncomment to register a new dependency of your gem
|
31
|
+
spec.add_dependency "coderay", "~> 1.1.3"
|
32
|
+
|
33
|
+
# For more information and examples about making a new gem, check out our
|
34
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pretty_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rocco Nicholls
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coderay
|
@@ -41,12 +41,13 @@ files:
|
|
41
41
|
- README.md
|
42
42
|
- Rakefile
|
43
43
|
- lib/pretty_logger.rb
|
44
|
-
- lib/pretty_logger/base_logger.rb
|
45
44
|
- lib/pretty_logger/controller_methods.rb
|
46
45
|
- lib/pretty_logger/override_console_colors.rb
|
46
|
+
- lib/pretty_logger/pretty_logger.rb
|
47
47
|
- lib/pretty_logger/railtie.rb
|
48
48
|
- lib/pretty_logger/request_logger.rb
|
49
49
|
- lib/pretty_logger/version.rb
|
50
|
+
- pretty_logger.gemspec
|
50
51
|
- sig/pretty_logger.rbs
|
51
52
|
homepage: https://github.com/Rockster160/pretty_logger
|
52
53
|
licenses:
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# debug
|
2
|
-
# info
|
3
|
-
# warn
|
4
|
-
# error
|
5
|
-
|
6
|
-
class PrettyLogger::BaseLogger < ActiveSupport::Logger
|
7
|
-
class << self
|
8
|
-
def instance
|
9
|
-
@instance ||= new("log/custom.log")
|
10
|
-
end
|
11
|
-
|
12
|
-
def timestamp
|
13
|
-
Time.current.in_time_zone("Mountain Time (US & Canada)").strftime("[%b %d, %I:%M:%S%P]")
|
14
|
-
end
|
15
|
-
|
16
|
-
def pretty_message(obj)
|
17
|
-
return obj if obj.is_a?(::String)
|
18
|
-
|
19
|
-
::CodeRay.scan(obj, :ruby).terminal.gsub(
|
20
|
-
/\e\[36m:([a-z]+)\e\[0m=>/i, ("\e[36m" + '\1: ')
|
21
|
-
).gsub(
|
22
|
-
/\e\[0m=>/, "\e[0m: "
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
|
-
def debug(message)
|
27
|
-
instance.debug("\e[90m#{timestamp}\e[90m[DEBUG]\e[0m #{pretty_message(message)}")
|
28
|
-
end
|
29
|
-
|
30
|
-
def info(message)
|
31
|
-
instance.info("\e[90m#{timestamp}\e[36m[INFO]\e[0m #{pretty_message(message)}")
|
32
|
-
end
|
33
|
-
|
34
|
-
def warn(message)
|
35
|
-
instance.warn("\e[90m#{timestamp}\e[38;5;208m[WARN]\e[0m #{pretty_message(message)}")
|
36
|
-
end
|
37
|
-
|
38
|
-
def error(message)
|
39
|
-
instance.error("\e[90m#{timestamp}\e[31m[ERROR]\e[0m #{pretty_message(message)}")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def cl
|
44
|
-
"\033[0m"
|
45
|
-
end
|
46
|
-
|
47
|
-
def rgb(r, g, b)
|
48
|
-
"\033[38;2;#{r};#{g};#{b}m"
|
49
|
-
end
|
50
|
-
|
51
|
-
def colorize(name, text)
|
52
|
-
return "" if text.blank?
|
53
|
-
"#{colors[name]}#{text}#{cl}"
|
54
|
-
end
|
55
|
-
|
56
|
-
def colors
|
57
|
-
{
|
58
|
-
black: rgb(0, 0, 0),
|
59
|
-
white: rgb(255, 255, 255),
|
60
|
-
lime: rgb(0, 255, 0),
|
61
|
-
red: rgb(255, 0, 0),
|
62
|
-
blue: rgb(0, 0, 255),
|
63
|
-
yellow: rgb(255, 255, 0),
|
64
|
-
cyan: rgb(0, 255, 255),
|
65
|
-
magenta: rgb(255, 0, 255),
|
66
|
-
gold: rgb(218, 165, 32),
|
67
|
-
silver: rgb(192, 192, 192),
|
68
|
-
grey: rgb(150, 150, 150),
|
69
|
-
maroon: rgb(128, 0, 0),
|
70
|
-
olive: rgb(128, 128, 0),
|
71
|
-
green: rgb(0, 128, 0),
|
72
|
-
purple: rgb(128, 0, 128),
|
73
|
-
teal: rgb(0, 128, 128),
|
74
|
-
navy: rgb(0, 0, 128),
|
75
|
-
rocco: rgb(1, 96, 255),
|
76
|
-
orange: rgb(255, 150, 0),
|
77
|
-
pink: rgb(255, 150, 150),
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
def focused_backtrace(trace)
|
82
|
-
return [] unless trace
|
83
|
-
trace.select { |line|
|
84
|
-
line.include?("/app/")
|
85
|
-
}.map { |line|
|
86
|
-
line.gsub(/^.*?#{Rails.root}/, "").gsub(/(app)?\/app\//, "app/").gsub(":in `", " `").gsub(/(:\d+) .*?$/, '\1')
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
|
-
def clean_message(message)
|
91
|
-
message.gsub(/\#\<([\w\:]+)( id: \d+)?.*?\>\n/im) { |found|
|
92
|
-
"#<#{Regexp.last_match(1)}#{Regexp.last_match(2)}>\n"
|
93
|
-
}
|
94
|
-
end
|
95
|
-
end
|