betterlog 0.20.3 → 1.0.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.
- checksums.yaml +4 -4
- data/.semaphore/semaphore.yml +0 -18
- data/.tool-versions +0 -1
- data/Rakefile +1 -3
- data/VERSION +1 -1
- data/betterlog.gemspec +8 -12
- data/lib/betterlog/version.rb +1 -1
- data/lib/betterlog.rb +0 -1
- data/spec/spec_helper.rb +0 -6
- metadata +3 -49
- data/Dockerfile +0 -49
- data/Makefile +0 -65
- data/TODO.md +0 -1
- data/betterlog/config.go +0 -11
- data/betterlog/healthz.go +0 -71
- data/betterlog/redis_cert_cache.go +0 -83
- data/bin/betterlog_pusher +0 -51
- data/bin/betterlog_sink +0 -47
- data/cmd/betterlog-server/LICENSE +0 -13
- data/cmd/betterlog-server/main.go +0 -83
- data/go.mod +0 -25
- data/go.sum +0 -127
- data/lib/betterlog/logger.rb +0 -143
- data/spec/betterlog/logger_spec.rb +0 -96
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c5171f51dc33171a188c72054895f947fe0fd9ccbe3e3d0e18a9762195cf74b0
|
|
4
|
+
data.tar.gz: 6111239b6014bf07aadba0431c2f586245f51b7f61f1a6fb5530c0e95bb94705
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f7a065c7e29dbb54423a04128fdc5570d1a2ebf972d0898a4da072b2e215d734c0df3223f9e8b2f704ce8ece011994f17cd6629d20bec494f9808d3ed8350133
|
|
7
|
+
data.tar.gz: 69833be6a6378e8891f08861f1eaba1207871582cf71b6275f08dd6a87bde9c177c9dbb7757296879c23bf1907b0207547c6ed25b3f4e64c677ac5a7430c4765
|
data/.semaphore/semaphore.yml
CHANGED
|
@@ -43,21 +43,3 @@ blocks:
|
|
|
43
43
|
- name: RSpec Unit Tests
|
|
44
44
|
commands:
|
|
45
45
|
- bundle exec rake
|
|
46
|
-
|
|
47
|
-
- name: Building Docker Image
|
|
48
|
-
task:
|
|
49
|
-
|
|
50
|
-
secrets:
|
|
51
|
-
- name: GCP
|
|
52
|
-
|
|
53
|
-
prologue:
|
|
54
|
-
commands:
|
|
55
|
-
- gcloud auth activate-service-account --key-file=.secrets/gcp.json
|
|
56
|
-
- gcloud auth configure-docker -q eu.gcr.io
|
|
57
|
-
- checkout
|
|
58
|
-
|
|
59
|
-
jobs:
|
|
60
|
-
- name: Building and pushing
|
|
61
|
-
commands:
|
|
62
|
-
- make build
|
|
63
|
-
- test "$SEMAPHORE_GIT_BRANCH" = "master" && make push-latest || true
|
data/.tool-versions
CHANGED
data/Rakefile
CHANGED
|
@@ -16,21 +16,19 @@ GemHadar do
|
|
|
16
16
|
'gospace'
|
|
17
17
|
readme 'README.md'
|
|
18
18
|
title "#{name.camelize}"
|
|
19
|
-
executables %w[ betterlog
|
|
19
|
+
executables %w[ betterlog ]
|
|
20
20
|
|
|
21
21
|
dependency 'tins', '~>1.3', '>=1.22.0'
|
|
22
22
|
dependency 'complex_config'
|
|
23
23
|
dependency 'file-tail', '~>1.0'
|
|
24
24
|
dependency 'json', '~>2.0'
|
|
25
25
|
dependency 'term-ansicolor', '~>1.3'
|
|
26
|
-
dependency 'redis', '>=2.8'
|
|
27
26
|
dependency 'redlock'
|
|
28
27
|
dependency 'excon'
|
|
29
28
|
|
|
30
29
|
development_dependency 'rake'
|
|
31
30
|
development_dependency 'rspec'
|
|
32
31
|
development_dependency 'simplecov'
|
|
33
|
-
development_dependency 'mock_redis'
|
|
34
32
|
end
|
|
35
33
|
|
|
36
34
|
task :default => :spec
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
1.0.0
|
data/betterlog.gemspec
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
# stub: betterlog 0.
|
|
2
|
+
# stub: betterlog 1.0.0 ruby lib
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = "betterlog".freeze
|
|
6
|
-
s.version = "0.
|
|
6
|
+
s.version = "1.0.0"
|
|
7
7
|
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
9
9
|
s.require_paths = ["lib".freeze]
|
|
10
10
|
s.authors = ["betterplace Developers".freeze]
|
|
11
|
-
s.date = "
|
|
11
|
+
s.date = "2023-01-30"
|
|
12
12
|
s.description = "This library provides structure json logging for our rails projects".freeze
|
|
13
13
|
s.email = "developers@betterplace.org".freeze
|
|
14
|
-
s.executables = ["betterlog".freeze
|
|
15
|
-
s.extra_rdoc_files = ["README.md".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/
|
|
16
|
-
s.files = [".github/workflows/codeql-analysis.yml".freeze, ".gitignore".freeze, ".semaphore/semaphore.yml".freeze, ".tool-versions".freeze, "
|
|
14
|
+
s.executables = ["betterlog".freeze]
|
|
15
|
+
s.extra_rdoc_files = ["README.md".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/notifiers.rb".freeze, "lib/betterlog/railtie.rb".freeze, "lib/betterlog/version.rb".freeze]
|
|
16
|
+
s.files = [".github/workflows/codeql-analysis.yml".freeze, ".gitignore".freeze, ".semaphore/semaphore.yml".freeze, ".tool-versions".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "betterlog.gemspec".freeze, "bin/betterlog".freeze, "config/log.yml".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/notifiers.rb".freeze, "lib/betterlog/railtie.rb".freeze, "lib/betterlog/version.rb".freeze, "spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/version_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
|
17
17
|
s.homepage = "http://github.com/betterplace/betterlog".freeze
|
|
18
18
|
s.rdoc_options = ["--title".freeze, "Betterlog".freeze, "--main".freeze, "README.md".freeze]
|
|
19
|
-
s.rubygems_version = "3.3.
|
|
19
|
+
s.rubygems_version = "3.3.25".freeze
|
|
20
20
|
s.summary = "Structured logging support for bp".freeze
|
|
21
|
-
s.test_files = ["spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/
|
|
21
|
+
s.test_files = ["spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/version_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
|
22
22
|
|
|
23
23
|
if s.respond_to? :specification_version then
|
|
24
24
|
s.specification_version = 4
|
|
@@ -29,13 +29,11 @@ Gem::Specification.new do |s|
|
|
|
29
29
|
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
|
30
30
|
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
|
31
31
|
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
32
|
-
s.add_development_dependency(%q<mock_redis>.freeze, [">= 0"])
|
|
33
32
|
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.3", ">= 1.22.0"])
|
|
34
33
|
s.add_runtime_dependency(%q<complex_config>.freeze, [">= 0"])
|
|
35
34
|
s.add_runtime_dependency(%q<file-tail>.freeze, ["~> 1.0"])
|
|
36
35
|
s.add_runtime_dependency(%q<json>.freeze, ["~> 2.0"])
|
|
37
36
|
s.add_runtime_dependency(%q<term-ansicolor>.freeze, ["~> 1.3"])
|
|
38
|
-
s.add_runtime_dependency(%q<redis>.freeze, [">= 2.8"])
|
|
39
37
|
s.add_runtime_dependency(%q<redlock>.freeze, [">= 0"])
|
|
40
38
|
s.add_runtime_dependency(%q<excon>.freeze, [">= 0"])
|
|
41
39
|
else
|
|
@@ -43,13 +41,11 @@ Gem::Specification.new do |s|
|
|
|
43
41
|
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
|
44
42
|
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
|
45
43
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
46
|
-
s.add_dependency(%q<mock_redis>.freeze, [">= 0"])
|
|
47
44
|
s.add_dependency(%q<tins>.freeze, ["~> 1.3", ">= 1.22.0"])
|
|
48
45
|
s.add_dependency(%q<complex_config>.freeze, [">= 0"])
|
|
49
46
|
s.add_dependency(%q<file-tail>.freeze, ["~> 1.0"])
|
|
50
47
|
s.add_dependency(%q<json>.freeze, ["~> 2.0"])
|
|
51
48
|
s.add_dependency(%q<term-ansicolor>.freeze, ["~> 1.3"])
|
|
52
|
-
s.add_dependency(%q<redis>.freeze, [">= 2.8"])
|
|
53
49
|
s.add_dependency(%q<redlock>.freeze, [">= 0"])
|
|
54
50
|
s.add_dependency(%q<excon>.freeze, [">= 0"])
|
|
55
51
|
end
|
data/lib/betterlog/version.rb
CHANGED
data/lib/betterlog.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
|
@@ -9,11 +9,5 @@ begin
|
|
|
9
9
|
require 'byebug'
|
|
10
10
|
rescue LoadError
|
|
11
11
|
end
|
|
12
|
-
require 'mock_redis'
|
|
13
|
-
class MockRedis
|
|
14
|
-
class BaseConnectionError < StandardError; end
|
|
15
|
-
class CannotConnectError < BaseConnectionError; end
|
|
16
|
-
end
|
|
17
|
-
Redis=MockRedis
|
|
18
12
|
require 'betterlog'
|
|
19
13
|
Betterlog::Log.default_logger = Logger.new(nil)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: betterlog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- betterplace Developers
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-01-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: gem_hadar
|
|
@@ -66,20 +66,6 @@ dependencies:
|
|
|
66
66
|
- - ">="
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: mock_redis
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
69
|
- !ruby/object:Gem::Dependency
|
|
84
70
|
name: tins
|
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -156,20 +142,6 @@ dependencies:
|
|
|
156
142
|
- - "~>"
|
|
157
143
|
- !ruby/object:Gem::Version
|
|
158
144
|
version: '1.3'
|
|
159
|
-
- !ruby/object:Gem::Dependency
|
|
160
|
-
name: redis
|
|
161
|
-
requirement: !ruby/object:Gem::Requirement
|
|
162
|
-
requirements:
|
|
163
|
-
- - ">="
|
|
164
|
-
- !ruby/object:Gem::Version
|
|
165
|
-
version: '2.8'
|
|
166
|
-
type: :runtime
|
|
167
|
-
prerelease: false
|
|
168
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
-
requirements:
|
|
170
|
-
- - ">="
|
|
171
|
-
- !ruby/object:Gem::Version
|
|
172
|
-
version: '2.8'
|
|
173
145
|
- !ruby/object:Gem::Dependency
|
|
174
146
|
name: redlock
|
|
175
147
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -202,8 +174,6 @@ description: This library provides structure json logging for our rails projects
|
|
|
202
174
|
email: developers@betterplace.org
|
|
203
175
|
executables:
|
|
204
176
|
- betterlog
|
|
205
|
-
- betterlog_pusher
|
|
206
|
-
- betterlog_sink
|
|
207
177
|
extensions: []
|
|
208
178
|
extra_rdoc_files:
|
|
209
179
|
- README.md
|
|
@@ -214,7 +184,6 @@ extra_rdoc_files:
|
|
|
214
184
|
- lib/betterlog/log/event_formatter.rb
|
|
215
185
|
- lib/betterlog/log/severity.rb
|
|
216
186
|
- lib/betterlog/log_event_formatter.rb
|
|
217
|
-
- lib/betterlog/logger.rb
|
|
218
187
|
- lib/betterlog/notifiers.rb
|
|
219
188
|
- lib/betterlog/railtie.rb
|
|
220
189
|
- lib/betterlog/version.rb
|
|
@@ -223,26 +192,14 @@ files:
|
|
|
223
192
|
- ".gitignore"
|
|
224
193
|
- ".semaphore/semaphore.yml"
|
|
225
194
|
- ".tool-versions"
|
|
226
|
-
- Dockerfile
|
|
227
195
|
- Gemfile
|
|
228
196
|
- LICENSE
|
|
229
|
-
- Makefile
|
|
230
197
|
- README.md
|
|
231
198
|
- Rakefile
|
|
232
|
-
- TODO.md
|
|
233
199
|
- VERSION
|
|
234
200
|
- betterlog.gemspec
|
|
235
|
-
- betterlog/config.go
|
|
236
|
-
- betterlog/healthz.go
|
|
237
|
-
- betterlog/redis_cert_cache.go
|
|
238
201
|
- bin/betterlog
|
|
239
|
-
- bin/betterlog_pusher
|
|
240
|
-
- bin/betterlog_sink
|
|
241
|
-
- cmd/betterlog-server/LICENSE
|
|
242
|
-
- cmd/betterlog-server/main.go
|
|
243
202
|
- config/log.yml
|
|
244
|
-
- go.mod
|
|
245
|
-
- go.sum
|
|
246
203
|
- lib/betterlog.rb
|
|
247
204
|
- lib/betterlog/global_metadata.rb
|
|
248
205
|
- lib/betterlog/log.rb
|
|
@@ -250,7 +207,6 @@ files:
|
|
|
250
207
|
- lib/betterlog/log/event_formatter.rb
|
|
251
208
|
- lib/betterlog/log/severity.rb
|
|
252
209
|
- lib/betterlog/log_event_formatter.rb
|
|
253
|
-
- lib/betterlog/logger.rb
|
|
254
210
|
- lib/betterlog/notifiers.rb
|
|
255
211
|
- lib/betterlog/railtie.rb
|
|
256
212
|
- lib/betterlog/version.rb
|
|
@@ -259,7 +215,6 @@ files:
|
|
|
259
215
|
- spec/betterlog/log/severity_spec.rb
|
|
260
216
|
- spec/betterlog/log_event_formatter_spec.rb
|
|
261
217
|
- spec/betterlog/log_spec.rb
|
|
262
|
-
- spec/betterlog/logger_spec.rb
|
|
263
218
|
- spec/betterlog/version_spec.rb
|
|
264
219
|
- spec/spec_helper.rb
|
|
265
220
|
homepage: http://github.com/betterplace/betterlog
|
|
@@ -284,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
284
239
|
- !ruby/object:Gem::Version
|
|
285
240
|
version: '0'
|
|
286
241
|
requirements: []
|
|
287
|
-
rubygems_version: 3.3.
|
|
242
|
+
rubygems_version: 3.3.25
|
|
288
243
|
signing_key:
|
|
289
244
|
specification_version: 4
|
|
290
245
|
summary: Structured logging support for bp
|
|
@@ -294,6 +249,5 @@ test_files:
|
|
|
294
249
|
- spec/betterlog/log/severity_spec.rb
|
|
295
250
|
- spec/betterlog/log_event_formatter_spec.rb
|
|
296
251
|
- spec/betterlog/log_spec.rb
|
|
297
|
-
- spec/betterlog/logger_spec.rb
|
|
298
252
|
- spec/betterlog/version_spec.rb
|
|
299
253
|
- spec/spec_helper.rb
|
data/Dockerfile
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
FROM golang:1.18-alpine AS builder
|
|
2
|
-
|
|
3
|
-
# Update/Upgrade/Add packages for building
|
|
4
|
-
|
|
5
|
-
RUN apk add --no-cache bash git build-base
|
|
6
|
-
|
|
7
|
-
# Create appuser.
|
|
8
|
-
ENV USER=appuser
|
|
9
|
-
ENV UID=10001
|
|
10
|
-
|
|
11
|
-
RUN adduser \
|
|
12
|
-
--disabled-password \
|
|
13
|
-
--gecos "" \
|
|
14
|
-
--home "/none" \
|
|
15
|
-
--shell "/sbin/nologin" \
|
|
16
|
-
--no-create-home \
|
|
17
|
-
--uid "${UID}" \
|
|
18
|
-
"${USER}"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# Build betterlog
|
|
22
|
-
|
|
23
|
-
WORKDIR /build/betterlog
|
|
24
|
-
|
|
25
|
-
ADD . .
|
|
26
|
-
|
|
27
|
-
ENV GOPATH=/build/betterlog/gospace
|
|
28
|
-
|
|
29
|
-
RUN make clobber
|
|
30
|
-
|
|
31
|
-
RUN make setup all
|
|
32
|
-
|
|
33
|
-
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags='-w -s' -o betterlog-server cmd/betterlog-server/main.go
|
|
34
|
-
|
|
35
|
-
FROM scratch AS runner
|
|
36
|
-
|
|
37
|
-
COPY --from=builder /etc/passwd /etc/passwd
|
|
38
|
-
|
|
39
|
-
COPY --from=builder /etc/group /etc/group
|
|
40
|
-
|
|
41
|
-
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
|
|
42
|
-
|
|
43
|
-
WORKDIR /
|
|
44
|
-
|
|
45
|
-
COPY --from=builder --chown=appuser:appuser /build/betterlog/betterlog-server /
|
|
46
|
-
|
|
47
|
-
EXPOSE 5514
|
|
48
|
-
|
|
49
|
-
ENTRYPOINT [ "/betterlog-server" ]
|
data/Makefile
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
DOCKER_IMAGE_LATEST = betterlog
|
|
2
|
-
DOCKER_IMAGE = $(DOCKER_IMAGE_LATEST):$(REVISION_SHORT)
|
|
3
|
-
PROJECT_ID = betterplace-183212
|
|
4
|
-
REMOTE_LATEST_TAG := eu.gcr.io/${PROJECT_ID}/$(DOCKER_IMAGE_LATEST)
|
|
5
|
-
REMOTE_TAG = eu.gcr.io/$(PROJECT_ID)/$(DOCKER_IMAGE)
|
|
6
|
-
REVISION := $(shell git rev-parse HEAD)
|
|
7
|
-
REVISION_SHORT := $(shell echo $(REVISION) | head -c 7)
|
|
8
|
-
GOPATH := $(shell pwd)/gospace
|
|
9
|
-
GOBIN = $(GOPATH)/bin
|
|
10
|
-
|
|
11
|
-
.EXPORT_ALL_VARIABLES:
|
|
12
|
-
|
|
13
|
-
all: betterlog-server
|
|
14
|
-
|
|
15
|
-
betterlog-server: cmd/betterlog-server/main.go betterlog/*.go
|
|
16
|
-
go build -o $@ $<
|
|
17
|
-
|
|
18
|
-
local: betterlog-server
|
|
19
|
-
REDIS_URL=$(REDIS_URL) ./betterlog-server
|
|
20
|
-
|
|
21
|
-
setup: fake-package
|
|
22
|
-
go mod download
|
|
23
|
-
|
|
24
|
-
fake-package:
|
|
25
|
-
rm -rf $(GOPATH)/src/github.com/betterplace/betterlog
|
|
26
|
-
mkdir -p $(GOPATH)/src/github.com/betterplace
|
|
27
|
-
ln -s $(shell pwd) $(GOPATH)/src/github.com/betterplace/betterlog
|
|
28
|
-
|
|
29
|
-
coverage-display: coverage
|
|
30
|
-
@go tool cover -html=coverage.out
|
|
31
|
-
|
|
32
|
-
clean:
|
|
33
|
-
@rm -f betterlog-server coverage.out tags
|
|
34
|
-
|
|
35
|
-
clobber: clean
|
|
36
|
-
@rm -rf $(GOPATH)/*
|
|
37
|
-
|
|
38
|
-
tags: clean
|
|
39
|
-
@gotags -tag-relative=false -silent=true -R=true -f $@ . $(GOPATH)
|
|
40
|
-
|
|
41
|
-
build-info:
|
|
42
|
-
@echo $(DOCKER_IMAGE)
|
|
43
|
-
|
|
44
|
-
build:
|
|
45
|
-
docker build --pull -t $(DOCKER_IMAGE) .
|
|
46
|
-
$(MAKE) build-info
|
|
47
|
-
|
|
48
|
-
build-force:
|
|
49
|
-
docker build --pull -t $(DOCKER_IMAGE) --no-cache .
|
|
50
|
-
$(MAKE) build-info
|
|
51
|
-
|
|
52
|
-
server:
|
|
53
|
-
docker run --rm -it $(DOCKER_IMAGE)
|
|
54
|
-
|
|
55
|
-
pull:
|
|
56
|
-
docker pull $(REMOTE_TAG)
|
|
57
|
-
docker tag $(REMOTE_TAG) $(DOCKER_IMAGE)
|
|
58
|
-
|
|
59
|
-
push: build
|
|
60
|
-
docker tag $(DOCKER_IMAGE) $(REMOTE_TAG)
|
|
61
|
-
docker push $(REMOTE_TAG)
|
|
62
|
-
|
|
63
|
-
push-latest: push
|
|
64
|
-
docker tag ${DOCKER_IMAGE} ${REMOTE_LATEST_TAG}
|
|
65
|
-
docker push ${REMOTE_LATEST_TAG}
|
data/TODO.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
- `complex_config` config files
|
data/betterlog/config.go
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
package betterlog
|
|
2
|
-
|
|
3
|
-
type Config struct {
|
|
4
|
-
PORT int `default:"5514"`
|
|
5
|
-
HEALTHZ_PORT int `default:"5513"`
|
|
6
|
-
HTTP_REALM string `default:"betterlog"`
|
|
7
|
-
HTTP_AUTH string
|
|
8
|
-
SSL bool
|
|
9
|
-
REDIS_PREFIX string
|
|
10
|
-
REDIS_URL string `default:"redis://localhost:6379"`
|
|
11
|
-
}
|
data/betterlog/healthz.go
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
package betterlog
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"log"
|
|
6
|
-
"net/http"
|
|
7
|
-
"os"
|
|
8
|
-
|
|
9
|
-
"github.com/labstack/echo/v4"
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
type Health struct {
|
|
13
|
-
PORT int
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
type Response struct {
|
|
17
|
-
Hostname string `json:"hostname"`
|
|
18
|
-
Healthy bool `json:"healthy"`
|
|
19
|
-
Error string `json:"error,omitempty"`
|
|
20
|
-
Message string `json:"message,omitempty"`
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
func determineHostname() string {
|
|
24
|
-
hostname, err := os.Hostname()
|
|
25
|
-
if err != nil {
|
|
26
|
-
hostname = "unknown"
|
|
27
|
-
}
|
|
28
|
-
return hostname
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
func (health Health) Check() error {
|
|
32
|
-
return nil
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
func (health Health) ZPage(next echo.HandlerFunc) echo.HandlerFunc {
|
|
36
|
-
hostname := determineHostname()
|
|
37
|
-
return func(c echo.Context) error {
|
|
38
|
-
if c.Path() == "/healthz" {
|
|
39
|
-
if err := health.Check(); err == nil {
|
|
40
|
-
return c.JSON(
|
|
41
|
-
http.StatusOK,
|
|
42
|
-
Response{
|
|
43
|
-
Hostname: hostname,
|
|
44
|
-
Healthy: true,
|
|
45
|
-
},
|
|
46
|
-
)
|
|
47
|
-
} else {
|
|
48
|
-
log.Printf("error: %v", err)
|
|
49
|
-
return c.JSON(
|
|
50
|
-
http.StatusInternalServerError,
|
|
51
|
-
Response{
|
|
52
|
-
Hostname: hostname,
|
|
53
|
-
Healthy: false,
|
|
54
|
-
Error: err.Error(),
|
|
55
|
-
Message: "problem detected",
|
|
56
|
-
},
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
return next(c)
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
func StartHealthzEcho(health Health) {
|
|
66
|
-
e := echo.New()
|
|
67
|
-
|
|
68
|
-
e.Use(health.ZPage)
|
|
69
|
-
log.Printf("Starting :%d/healthz", health.PORT)
|
|
70
|
-
e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", health.PORT)))
|
|
71
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
package betterlog
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"context"
|
|
5
|
-
"strings"
|
|
6
|
-
|
|
7
|
-
"github.com/go-redis/redis"
|
|
8
|
-
"golang.org/x/crypto/acme/autocert"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
type RedisCertCache struct {
|
|
12
|
-
Redis *redis.Client
|
|
13
|
-
PREFIX string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Get reads certificate data from the specified key name.
|
|
17
|
-
func (cache RedisCertCache) Get(ctx context.Context, name string) ([]byte, error) {
|
|
18
|
-
name = strings.Join([]string{cache.PREFIX, name}, "/")
|
|
19
|
-
done := make(chan struct{})
|
|
20
|
-
var (
|
|
21
|
-
err error
|
|
22
|
-
data string
|
|
23
|
-
)
|
|
24
|
-
go func() {
|
|
25
|
-
defer close(done)
|
|
26
|
-
result := cache.Redis.Get(name)
|
|
27
|
-
err = result.Err()
|
|
28
|
-
if err == nil {
|
|
29
|
-
data, err = result.Result()
|
|
30
|
-
}
|
|
31
|
-
}()
|
|
32
|
-
select {
|
|
33
|
-
case <-ctx.Done():
|
|
34
|
-
return nil, ctx.Err()
|
|
35
|
-
case <-done:
|
|
36
|
-
}
|
|
37
|
-
if err == redis.Nil {
|
|
38
|
-
return nil, autocert.ErrCacheMiss
|
|
39
|
-
}
|
|
40
|
-
return []byte(data), err
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Put writes the certificate data to the specified redis key name.
|
|
44
|
-
func (cache RedisCertCache) Put(ctx context.Context, name string, data []byte) error {
|
|
45
|
-
name = strings.Join([]string{cache.PREFIX, name}, "/")
|
|
46
|
-
done := make(chan struct{})
|
|
47
|
-
var err error
|
|
48
|
-
go func() {
|
|
49
|
-
defer close(done)
|
|
50
|
-
select {
|
|
51
|
-
case <-ctx.Done():
|
|
52
|
-
// Don't overwrite the key if the context was canceled.
|
|
53
|
-
default:
|
|
54
|
-
result := cache.Redis.Set(name, string(data), 0)
|
|
55
|
-
err = result.Err()
|
|
56
|
-
}
|
|
57
|
-
}()
|
|
58
|
-
select {
|
|
59
|
-
case <-ctx.Done():
|
|
60
|
-
return ctx.Err()
|
|
61
|
-
case <-done:
|
|
62
|
-
}
|
|
63
|
-
return err
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Delete removes the specified key name.
|
|
67
|
-
func (cache RedisCertCache) Delete(ctx context.Context, name string) error {
|
|
68
|
-
name = strings.Join([]string{cache.PREFIX, name}, "/")
|
|
69
|
-
var (
|
|
70
|
-
err error
|
|
71
|
-
done = make(chan struct{})
|
|
72
|
-
)
|
|
73
|
-
go func() {
|
|
74
|
-
defer close(done)
|
|
75
|
-
err = cache.Redis.Del(name).Err()
|
|
76
|
-
}()
|
|
77
|
-
select {
|
|
78
|
-
case <-ctx.Done():
|
|
79
|
-
return ctx.Err()
|
|
80
|
-
case <-done:
|
|
81
|
-
}
|
|
82
|
-
return err
|
|
83
|
-
}
|
data/bin/betterlog_pusher
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# vim: set ft=ruby et sw=2 ts=2:
|
|
3
|
-
|
|
4
|
-
require 'betterlog'
|
|
5
|
-
require 'excon'
|
|
6
|
-
require 'redlock'
|
|
7
|
-
|
|
8
|
-
lines = Integer(ENV.fetch('BETTERLOG_LINES', 1_000))
|
|
9
|
-
lock_time = Integer(ENV.fetch('BETTERLOG_LOCK_TIME', 60_000))
|
|
10
|
-
url = ENV.fetch('BETTERLOG_SERVER_URL')
|
|
11
|
-
name = ENV['BETTERLOG_NAME']
|
|
12
|
-
redis_url = ENV.fetch('REDIS_URL')
|
|
13
|
-
redis =
|
|
14
|
-
if redis_sentinels = ENV['REDIS_SENTINELS']&.split(?,)
|
|
15
|
-
redis_sentinels.map! { |s|
|
|
16
|
-
h, p = s.split(?:, 2)
|
|
17
|
-
{ host: h, port: (p || 26379).to_i }
|
|
18
|
-
}
|
|
19
|
-
Redis.new(url: redis_url, sentinels: redis_sentinels, role: :master)
|
|
20
|
-
else
|
|
21
|
-
Redis.new(url: redis_url)
|
|
22
|
-
end
|
|
23
|
-
lm = Redlock::Client.new([ redis_url ])
|
|
24
|
-
logger = Betterlog::Logger.new(redis, name: name)
|
|
25
|
-
|
|
26
|
-
quit = false
|
|
27
|
-
[ :TERM, :INT, :QUIT ].each { |s| trap(s) { quit = true } }
|
|
28
|
-
|
|
29
|
-
STDOUT.sync = true
|
|
30
|
-
loop do
|
|
31
|
-
count = 0
|
|
32
|
-
lm.lock!(File.basename($0), lock_time) do
|
|
33
|
-
print ?…
|
|
34
|
-
logger.each_slice(lines).with_index do |batch, i|
|
|
35
|
-
count.zero? and print ?○
|
|
36
|
-
count += batch.sum(&:size)
|
|
37
|
-
attempt(attempts: 10, sleep: -60, reraise: true) do
|
|
38
|
-
print ?┄
|
|
39
|
-
Excon.post(url, body: batch.join)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
quit and exit
|
|
44
|
-
if count.zero?
|
|
45
|
-
sleep 1
|
|
46
|
-
else
|
|
47
|
-
print "→ %s sent.\n" % Tins::Unit.format(count, format: '%.2f %U', prefix: 1024, unit: ?b)
|
|
48
|
-
end
|
|
49
|
-
rescue Redlock::LockError => e
|
|
50
|
-
STDERR.puts "Caught #{e.class}: #{e} => Retrying!"
|
|
51
|
-
end
|
data/bin/betterlog_sink
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# vim: set ft=ruby et sw=2 ts=2:
|
|
3
|
-
|
|
4
|
-
require 'betterlog'
|
|
5
|
-
require 'complex_config/rude'
|
|
6
|
-
require 'json'
|
|
7
|
-
|
|
8
|
-
LOG_ENV = ENV.fetch('LOG_ENV', 'production')
|
|
9
|
-
|
|
10
|
-
@config = complex_config.log(LOG_ENV).sink
|
|
11
|
-
|
|
12
|
-
ENV['KUBECONFIG'] = File.join(
|
|
13
|
-
ENV.fetch('HOME'),
|
|
14
|
-
'.kube',
|
|
15
|
-
@config.cluster.name
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
def authenticate
|
|
19
|
-
return if File.exist?(ENV['KUBECONFIG'])
|
|
20
|
-
context = [
|
|
21
|
-
'gke',
|
|
22
|
-
@config.cluster.project,
|
|
23
|
-
@config.cluster.zone,
|
|
24
|
-
@config.cluster.name,
|
|
25
|
-
] * ?_
|
|
26
|
-
system(%{
|
|
27
|
-
gcloud --no-user-output-enabled container clusters get-credentials \
|
|
28
|
-
#{@config.cluster.name.inspect} \
|
|
29
|
-
--zone #{@config.cluster.zone.inspect} \
|
|
30
|
-
--project #{@config.cluster.project.inspect}
|
|
31
|
-
}) or fail "failed to authenticate for context #{context.inspect}"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
authenticate
|
|
35
|
-
|
|
36
|
-
pods = JSON(
|
|
37
|
-
%x{ kubectl -n #{@config.namespace} -ojson get pods },
|
|
38
|
-
object_class: JSON::GenericObject
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
if pod = pods.items.find { |i| i.metadata.labels.app == @config.source }
|
|
42
|
-
system %{
|
|
43
|
-
kubectl logs -n #{@config.namespace} #{ARGV.join(' ')} #{pod.metadata.name}
|
|
44
|
-
}
|
|
45
|
-
else
|
|
46
|
-
exit 1
|
|
47
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Copyright 2018 Florian Frank
|
|
2
|
-
|
|
3
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
you may not use this file except in compliance with the License.
|
|
5
|
-
You may obtain a copy of the License at
|
|
6
|
-
|
|
7
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
|
|
9
|
-
Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
See the License for the specific language governing permissions and
|
|
13
|
-
limitations under the License.
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"io/ioutil"
|
|
6
|
-
"log"
|
|
7
|
-
"net/http"
|
|
8
|
-
"os"
|
|
9
|
-
"strings"
|
|
10
|
-
|
|
11
|
-
betterlog "github.com/betterplace/betterlog/betterlog"
|
|
12
|
-
"github.com/go-redis/redis"
|
|
13
|
-
"github.com/kelseyhightower/envconfig"
|
|
14
|
-
"github.com/labstack/echo/v4"
|
|
15
|
-
"github.com/labstack/echo/v4/middleware"
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
func postLogHandler(c echo.Context) error {
|
|
19
|
-
body := c.Request().Body
|
|
20
|
-
data, err := ioutil.ReadAll(body)
|
|
21
|
-
if err == nil {
|
|
22
|
-
defer body.Close()
|
|
23
|
-
os.Stdout.Write(data)
|
|
24
|
-
return c.NoContent(http.StatusOK)
|
|
25
|
-
} else {
|
|
26
|
-
return c.String(http.StatusInternalServerError, err.Error())
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
func basicAuthConfig(config betterlog.Config) middleware.BasicAuthConfig {
|
|
31
|
-
return middleware.BasicAuthConfig{
|
|
32
|
-
Realm: config.HTTP_REALM,
|
|
33
|
-
Validator: func(username, password string, c echo.Context) (bool, error) {
|
|
34
|
-
httpAuth := strings.Split(config.HTTP_AUTH, ":")
|
|
35
|
-
if username == httpAuth[0] && password == httpAuth[1] {
|
|
36
|
-
return true, nil
|
|
37
|
-
}
|
|
38
|
-
return false, nil
|
|
39
|
-
},
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
func initializeRedis(config betterlog.Config) *redis.Client {
|
|
44
|
-
options, err := redis.ParseURL(config.REDIS_URL)
|
|
45
|
-
if err != nil {
|
|
46
|
-
log.Panic(err)
|
|
47
|
-
}
|
|
48
|
-
options.MaxRetries = 3
|
|
49
|
-
return redis.NewClient(options)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
func main() {
|
|
53
|
-
var config betterlog.Config
|
|
54
|
-
err := envconfig.Process("", &config)
|
|
55
|
-
if err != nil {
|
|
56
|
-
log.Fatal(err)
|
|
57
|
-
}
|
|
58
|
-
e := echo.New()
|
|
59
|
-
|
|
60
|
-
if !config.SSL {
|
|
61
|
-
e.Use(betterlog.Health{}.ZPage)
|
|
62
|
-
}
|
|
63
|
-
if config.HTTP_AUTH != "" {
|
|
64
|
-
fmt.Println("info: Configuring HTTP Auth access control")
|
|
65
|
-
e.Use(middleware.BasicAuthWithConfig(basicAuthConfig(config)))
|
|
66
|
-
}
|
|
67
|
-
e.POST("/log", postLogHandler)
|
|
68
|
-
if config.SSL {
|
|
69
|
-
log.Println("Starting SSL AutoTLS service.")
|
|
70
|
-
redis := initializeRedis(config)
|
|
71
|
-
e.AutoTLSManager.Cache = betterlog.RedisCertCache{
|
|
72
|
-
Redis: redis,
|
|
73
|
-
PREFIX: config.REDIS_PREFIX,
|
|
74
|
-
}
|
|
75
|
-
go betterlog.StartHealthzEcho(
|
|
76
|
-
betterlog.Health{
|
|
77
|
-
PORT: config.HEALTHZ_PORT,
|
|
78
|
-
})
|
|
79
|
-
e.Logger.Fatal(e.StartAutoTLS(fmt.Sprintf(":%d", config.PORT)))
|
|
80
|
-
} else {
|
|
81
|
-
e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", config.PORT)))
|
|
82
|
-
}
|
|
83
|
-
}
|
data/go.mod
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
module github.com/betterplace/betterlog
|
|
2
|
-
|
|
3
|
-
go 1.19
|
|
4
|
-
|
|
5
|
-
require (
|
|
6
|
-
github.com/go-redis/redis v6.15.9+incompatible
|
|
7
|
-
github.com/kelseyhightower/envconfig v1.4.0
|
|
8
|
-
github.com/labstack/echo/v4 v4.8.0
|
|
9
|
-
golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
require (
|
|
13
|
-
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
|
|
14
|
-
github.com/labstack/gommon v0.3.1 // indirect
|
|
15
|
-
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
16
|
-
github.com/mattn/go-isatty v0.0.16 // indirect
|
|
17
|
-
github.com/onsi/ginkgo v1.16.5 // indirect
|
|
18
|
-
github.com/onsi/gomega v1.19.0 // indirect
|
|
19
|
-
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
|
20
|
-
github.com/valyala/fasttemplate v1.2.1 // indirect
|
|
21
|
-
golang.org/x/net v0.0.0-20220812174116-3211cb980234 // indirect
|
|
22
|
-
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2 // indirect
|
|
23
|
-
golang.org/x/text v0.3.7 // indirect
|
|
24
|
-
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect
|
|
25
|
-
)
|
data/go.sum
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
2
|
-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
3
|
-
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
4
|
-
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
5
|
-
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
|
6
|
-
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
7
|
-
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
|
|
8
|
-
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
|
9
|
-
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
|
10
|
-
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
|
11
|
-
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
|
12
|
-
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
13
|
-
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
|
14
|
-
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
15
|
-
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
16
|
-
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
17
|
-
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
18
|
-
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
19
|
-
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
20
|
-
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
21
|
-
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
22
|
-
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
|
23
|
-
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
|
24
|
-
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
|
25
|
-
github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI=
|
|
26
|
-
github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
|
|
27
|
-
github.com/labstack/echo/v4 v4.8.0 h1:wdc6yKVaHxkNOEdz4cRZs1pQkwSXPiRjq69yWP4QQS8=
|
|
28
|
-
github.com/labstack/echo/v4 v4.8.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
|
|
29
|
-
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
|
|
30
|
-
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
|
|
31
|
-
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
|
|
32
|
-
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
|
33
|
-
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
|
34
|
-
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
|
35
|
-
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
|
36
|
-
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
|
37
|
-
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
|
38
|
-
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
|
39
|
-
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
|
40
|
-
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
|
41
|
-
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
|
42
|
-
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
43
|
-
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
|
44
|
-
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
|
45
|
-
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
|
46
|
-
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
|
47
|
-
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
|
48
|
-
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
|
|
49
|
-
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
|
50
|
-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
51
|
-
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
52
|
-
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
53
|
-
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
54
|
-
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
55
|
-
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
56
|
-
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
|
57
|
-
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
|
58
|
-
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
|
|
59
|
-
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
|
60
|
-
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
|
61
|
-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
62
|
-
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
63
|
-
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
64
|
-
golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8=
|
|
65
|
-
golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
|
66
|
-
golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c=
|
|
67
|
-
golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
|
68
|
-
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
69
|
-
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
70
|
-
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
71
|
-
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
72
|
-
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
73
|
-
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
74
|
-
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
|
75
|
-
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
|
76
|
-
golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E=
|
|
77
|
-
golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
|
78
|
-
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
79
|
-
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
80
|
-
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
81
|
-
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
82
|
-
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
83
|
-
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
84
|
-
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
85
|
-
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
86
|
-
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
87
|
-
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
88
|
-
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
89
|
-
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
90
|
-
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
91
|
-
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
92
|
-
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
93
|
-
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
|
94
|
-
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
95
|
-
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
96
|
-
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2 h1:fqTvyMIIj+HRzMmnzr9NtpHP6uVpvB5fkHcgPDC4nu8=
|
|
97
|
-
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
98
|
-
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
99
|
-
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
100
|
-
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
|
101
|
-
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|
102
|
-
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
|
|
103
|
-
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
104
|
-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
105
|
-
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
106
|
-
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
107
|
-
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
108
|
-
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
109
|
-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
110
|
-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
111
|
-
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
112
|
-
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
113
|
-
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
114
|
-
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
115
|
-
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
116
|
-
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
117
|
-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
118
|
-
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
|
119
|
-
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
|
120
|
-
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
|
121
|
-
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
122
|
-
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
123
|
-
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
124
|
-
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
125
|
-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
126
|
-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
|
127
|
-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
data/lib/betterlog/logger.rb
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
begin
|
|
2
|
-
require 'redis' unless defined?(Redis)
|
|
3
|
-
rescue LoadError
|
|
4
|
-
end
|
|
5
|
-
require 'logger'
|
|
6
|
-
|
|
7
|
-
module Betterlog
|
|
8
|
-
class Logger < ::Logger
|
|
9
|
-
include ComplexConfig::Provider::Shortcuts
|
|
10
|
-
|
|
11
|
-
def initialize(redis, shift_age = 0, shift_size = 1048576, name: nil, buffer_size: nil, **opts)
|
|
12
|
-
@redis = redis
|
|
13
|
-
@fallback = ::Logger.new(STDERR)
|
|
14
|
-
if level = cc.log.level?
|
|
15
|
-
self.level = level
|
|
16
|
-
@fallback.level = level
|
|
17
|
-
end
|
|
18
|
-
@name = name || self.class.name
|
|
19
|
-
@buffer_size = determine_buffer_size(buffer_size)
|
|
20
|
-
super(nil, shift_age, shift_size, **opts)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.for_redis_url(url, shift_age = 0, shift_size = 1048576, **opts)
|
|
24
|
-
redis = Redis.new(url: url)
|
|
25
|
-
redis.ping
|
|
26
|
-
new(redis, shift_age, shift_size, **opts)
|
|
27
|
-
rescue Redis::CannotConnectError
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private def determine_buffer_size(buffer_size)
|
|
31
|
-
if buffer_size.nil? || buffer_size < 1 * 1024 ** 2
|
|
32
|
-
1 * 1024 ** 2 # Default to very small buffer
|
|
33
|
-
elsif buffer_size > 511 * 1024 ** 2
|
|
34
|
-
511 * 1024 ** 2 # Stay well below redis' 512Mb upper limit for strings
|
|
35
|
-
else
|
|
36
|
-
buffer_size
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private def redis_write(msg)
|
|
41
|
-
# Stop before reaching configured buffer_size limit, after warning a lot.
|
|
42
|
-
if @redis.strlen(@name) > (@buffer_size * 96) / 100
|
|
43
|
-
@fallback.error("Redis memory limit will soon be reached =>"\
|
|
44
|
-
" Log output to redis stops now unless log data is pushed away!")
|
|
45
|
-
return nil
|
|
46
|
-
end
|
|
47
|
-
@redis.append @name, msg
|
|
48
|
-
self
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def add(severity, message = nil, progname = nil)
|
|
53
|
-
severity ||= UNKNOWN
|
|
54
|
-
if severity < @level
|
|
55
|
-
return true
|
|
56
|
-
end
|
|
57
|
-
if progname.nil?
|
|
58
|
-
progname = @progname
|
|
59
|
-
end
|
|
60
|
-
if message.nil?
|
|
61
|
-
if block_given?
|
|
62
|
-
message = yield
|
|
63
|
-
else
|
|
64
|
-
message = progname
|
|
65
|
-
progname = @progname
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
redis_write(
|
|
69
|
-
format_message(format_severity(severity), Time.now, progname, message))
|
|
70
|
-
true
|
|
71
|
-
rescue Redis::BaseConnectionError
|
|
72
|
-
@fallback.add(severity, message, progname)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def <<(msg)
|
|
76
|
-
redis_write(msg)
|
|
77
|
-
rescue Redis::BaseConnectionError
|
|
78
|
-
@fallback << msg
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def clear
|
|
82
|
-
@redis.del @name
|
|
83
|
-
self
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def each_chunk(chunk_size: 100 * 1024, &block)
|
|
87
|
-
chunk_size > 0 or raise ArgumentError, 'chunk_size > 0 required'
|
|
88
|
-
|
|
89
|
-
# Delete any remaining temporary keys if we were interrtupted earlier
|
|
90
|
-
# (or in some other process.)
|
|
91
|
-
@redis.scan_each(match: "#{@name}_*") do |key|
|
|
92
|
-
@redis.del key
|
|
93
|
-
rescue Redis::BaseConnectionError
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
@redis.exists?(@name) or return Enumerator.new {}
|
|
97
|
-
|
|
98
|
-
Enumerator.new do |y|
|
|
99
|
-
name_tmp = "#{@name}_#{rand}"
|
|
100
|
-
@redis.rename @name, name_tmp
|
|
101
|
-
|
|
102
|
-
s = 0
|
|
103
|
-
e = @redis.strlen(name_tmp) - 1
|
|
104
|
-
until s > e
|
|
105
|
-
range = @redis.getrange(name_tmp, s, s + chunk_size - 1)
|
|
106
|
-
range.force_encoding 'ASCII-8BIT'
|
|
107
|
-
y.yield range
|
|
108
|
-
s += chunk_size
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
ensure
|
|
112
|
-
begin
|
|
113
|
-
@redis.del name_tmp
|
|
114
|
-
rescue Redis::BaseConnectionError
|
|
115
|
-
# We have to delete this later if del command failed here,
|
|
116
|
-
# see the beginning of this method.
|
|
117
|
-
end
|
|
118
|
-
end.each(&block)
|
|
119
|
-
|
|
120
|
-
rescue Redis::BaseConnectionError => e
|
|
121
|
-
# Maybe it works again later, just log the error…
|
|
122
|
-
@fallback.error(e)
|
|
123
|
-
Enumerator.new {}
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def each(chunk_size: 100 * 1024, &block)
|
|
127
|
-
chunk_size > 0 or raise ArgumentError, 'chunk_size > 0 required'
|
|
128
|
-
Enumerator.new do |y|
|
|
129
|
-
buffer = ''
|
|
130
|
-
buffer.encode! 'ASCII-8BIT'
|
|
131
|
-
each_chunk(chunk_size: chunk_size) do |chunk|
|
|
132
|
-
buffer << chunk
|
|
133
|
-
buffer.gsub!(/\A(.*?#$/)/n) do |line|
|
|
134
|
-
y.yield(line)
|
|
135
|
-
''
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
buffer.length > 0 and y.yield(buffer)
|
|
139
|
-
end.each(&block)
|
|
140
|
-
end
|
|
141
|
-
include Enumerable
|
|
142
|
-
end
|
|
143
|
-
end
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Betterlog::Logger do
|
|
4
|
-
let :logger do
|
|
5
|
-
described_class.new(Redis.new)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
describe '.for_redis_url' do
|
|
9
|
-
it 'can handle not being able to connect to redis' do
|
|
10
|
-
redis = double
|
|
11
|
-
allow(redis).to receive(:ping).and_raise Redis::CannotConnectError
|
|
12
|
-
allow(Redis).to receive(:new).with(url: 'the_url').and_return redis
|
|
13
|
-
expect(Betterlog::Logger.for_redis_url('the_url')).to be_nil
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'can connect to redis for the url' do
|
|
17
|
-
redis = double(ping: 'PONG')
|
|
18
|
-
allow(Redis).to receive(:new).with(url: 'the_url').and_return redis
|
|
19
|
-
expect(Betterlog::Logger.for_redis_url('the_url')).to be_a Betterlog::Logger
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#<<' do
|
|
24
|
-
it 'writes to redis' do
|
|
25
|
-
expect(logger.instance_variable_get(:@redis)).to receive(:append).
|
|
26
|
-
with('Betterlog::Logger', 'foo')
|
|
27
|
-
logger << 'foo'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'falls back if redis errors' do
|
|
31
|
-
allow(logger.instance_variable_get(:@redis)).to receive(:append).
|
|
32
|
-
and_raise(Redis::BaseConnectionError)
|
|
33
|
-
expect(logger.instance_variable_get(:@fallback)).to\
|
|
34
|
-
receive(:<<).with('foo')
|
|
35
|
-
logger << 'foo'
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
describe '#add' do
|
|
40
|
-
it 'writes to redis' do
|
|
41
|
-
expect(logger.instance_variable_get(:@redis)).to receive(:append).
|
|
42
|
-
with('Betterlog::Logger', /INFO -- : foo/)
|
|
43
|
-
logger.info 'foo'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it 'falls back if redis errors' do
|
|
47
|
-
allow(logger.instance_variable_get(:@redis)).to receive(:append).
|
|
48
|
-
and_raise(Redis::BaseConnectionError)
|
|
49
|
-
expect(logger.instance_variable_get(:@fallback)).to\
|
|
50
|
-
receive(:add).with(::Logger::INFO, 'foo', nil)
|
|
51
|
-
logger.info 'foo'
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
describe '#each_chunk' do
|
|
56
|
-
it 'iterates over chunks of data' do
|
|
57
|
-
logger.clear
|
|
58
|
-
logger << "foo" * 23
|
|
59
|
-
expect(logger.each_chunk(chunk_size: 10).to_a).to eq %w[
|
|
60
|
-
foofoofoof
|
|
61
|
-
oofoofoofo
|
|
62
|
-
ofoofoofoo
|
|
63
|
-
foofoofoof
|
|
64
|
-
oofoofoofo
|
|
65
|
-
ofoofoofoo
|
|
66
|
-
foofoofoo
|
|
67
|
-
]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it 'works if no data is there' do
|
|
71
|
-
logger.clear
|
|
72
|
-
expect(logger.each_chunk(chunk_size: 1).to_a).to eq []
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it 'iterates if chunk_size is 1 and 23' do
|
|
76
|
-
logger.clear
|
|
77
|
-
logger << ?. * 23
|
|
78
|
-
expect(logger.each_chunk(chunk_size: 1).to_a).to eq [ ?. ] * 23
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it 'iterates if chunk_size is 1 and 22' do
|
|
82
|
-
logger.clear
|
|
83
|
-
logger << ?. * 22
|
|
84
|
-
expect(logger.each_chunk(chunk_size: 1).to_a).to eq [ ?. ] * 22
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
describe '#each' do
|
|
89
|
-
it 'iterates over log lines' do
|
|
90
|
-
logger.clear
|
|
91
|
-
logger << "foo\n"
|
|
92
|
-
logger << "bar\n"
|
|
93
|
-
expect(logger.to_a).to eq [ "foo\n", "bar\n" ]
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|