betterlog 0.20.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|