Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd2d7628

Browse files
authored
fix(enterprise/cli): add CODER_PROVISIONER_DAEMON_LOG_* options (#11279)
- Extracts cli.BuildLogger to clilog package- Updates existing usage of cli.BuildLogger and removes it- Use clilog to initialize provisionerd logger
1 parent7c4fbe5 commitd2d7628

File tree

8 files changed

+587
-128
lines changed

8 files changed

+587
-128
lines changed

‎cli/clilog/clilog.go‎

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
package clilog
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"os"
8+
"regexp"
9+
"strings"
10+
11+
"golang.org/x/xerrors"
12+
13+
"cdr.dev/slog"
14+
"cdr.dev/slog/sloggers/sloghuman"
15+
"cdr.dev/slog/sloggers/slogjson"
16+
"cdr.dev/slog/sloggers/slogstackdriver"
17+
"github.com/coder/coder/v2/cli/clibase"
18+
"github.com/coder/coder/v2/coderd/tracing"
19+
"github.com/coder/coder/v2/codersdk"
20+
)
21+
22+
type (
23+
Optionfunc(*Builder)
24+
Builderstruct {
25+
Filter []string
26+
Humanstring
27+
JSONstring
28+
Stackdriverstring
29+
Tracebool
30+
Verbosebool
31+
}
32+
)
33+
34+
funcNew(opts...Option)*Builder {
35+
b:=&Builder{}
36+
for_,opt:=rangeopts {
37+
opt(b)
38+
}
39+
returnb
40+
}
41+
42+
funcWithFilter(filters...string)Option {
43+
returnfunc(b*Builder) {
44+
b.Filter=filters
45+
}
46+
}
47+
48+
funcWithHuman(locstring)Option {
49+
returnfunc(b*Builder) {
50+
b.Human=loc
51+
}
52+
}
53+
54+
funcWithJSON(locstring)Option {
55+
returnfunc(b*Builder) {
56+
b.JSON=loc
57+
}
58+
}
59+
60+
funcWithStackdriver(locstring)Option {
61+
returnfunc(b*Builder) {
62+
b.Stackdriver=loc
63+
}
64+
}
65+
66+
funcWithTrace()Option {
67+
returnfunc(b*Builder) {
68+
b.Trace=true
69+
}
70+
}
71+
72+
funcWithVerbose()Option {
73+
returnfunc(b*Builder) {
74+
b.Verbose=true
75+
}
76+
}
77+
78+
funcFromDeploymentValues(vals*codersdk.DeploymentValues)Option {
79+
returnfunc(b*Builder) {
80+
b.Filter=vals.Logging.Filter.Value()
81+
b.Human=vals.Logging.Human.Value()
82+
b.JSON=vals.Logging.JSON.Value()
83+
b.Stackdriver=vals.Logging.Stackdriver.Value()
84+
b.Trace=vals.Trace.Enable.Value()
85+
b.Verbose=vals.Verbose.Value()
86+
}
87+
}
88+
89+
func (b*Builder)Build(inv*clibase.Invocation) (log slog.Logger,closeLogfunc(),errerror) {
90+
var (
91+
sinks= []slog.Sink{}
92+
closers= []func()error{}
93+
)
94+
deferfunc() {
95+
iferr!=nil {
96+
for_,closer:=rangeclosers {
97+
_=closer()
98+
}
99+
}
100+
}()
101+
102+
noopClose:=func() {}
103+
104+
addSinkIfProvided:=func(sinkFnfunc(io.Writer) slog.Sink,locstring)error {
105+
switchloc {
106+
case"":
107+
108+
case"/dev/stdout":
109+
sinks=append(sinks,sinkFn(inv.Stdout))
110+
111+
case"/dev/stderr":
112+
sinks=append(sinks,sinkFn(inv.Stderr))
113+
114+
default:
115+
fi,err:=os.OpenFile(loc,os.O_WRONLY|os.O_CREATE|os.O_APPEND,0o644)
116+
iferr!=nil {
117+
returnxerrors.Errorf("open log file %q: %w",loc,err)
118+
}
119+
closers=append(closers,fi.Close)
120+
sinks=append(sinks,sinkFn(fi))
121+
}
122+
returnnil
123+
}
124+
125+
err=addSinkIfProvided(sloghuman.Sink,b.Human)
126+
iferr!=nil {
127+
return slog.Logger{},noopClose,xerrors.Errorf("add human sink: %w",err)
128+
}
129+
err=addSinkIfProvided(slogjson.Sink,b.JSON)
130+
iferr!=nil {
131+
return slog.Logger{},noopClose,xerrors.Errorf("add json sink: %w",err)
132+
}
133+
err=addSinkIfProvided(slogstackdriver.Sink,b.Stackdriver)
134+
iferr!=nil {
135+
return slog.Logger{},noopClose,xerrors.Errorf("add stackdriver sink: %w",err)
136+
}
137+
138+
ifb.Trace {
139+
sinks=append(sinks, tracing.SlogSink{})
140+
}
141+
142+
// User should log to null device if they don't want logs.
143+
iflen(sinks)==0 {
144+
return slog.Logger{},noopClose,xerrors.New("no loggers provided, use /dev/null to disable logging")
145+
}
146+
147+
filter:=&debugFilterSink{next:sinks}
148+
149+
err=filter.compile(b.Filter)
150+
iferr!=nil {
151+
return slog.Logger{},noopClose,xerrors.Errorf("compile filters: %w",err)
152+
}
153+
154+
level:=slog.LevelInfo
155+
// Debug logging is always enabled if a filter is present.
156+
ifb.Verbose||filter.re!=nil {
157+
level=slog.LevelDebug
158+
}
159+
160+
returninv.Logger.AppendSinks(filter).Leveled(level),func() {
161+
for_,closer:=rangeclosers {
162+
_=closer()
163+
}
164+
},nil
165+
}
166+
167+
var_ slog.Sink=&debugFilterSink{}
168+
169+
typedebugFilterSinkstruct {
170+
next []slog.Sink
171+
re*regexp.Regexp
172+
}
173+
174+
func (f*debugFilterSink)compile(res []string)error {
175+
iflen(res)==0 {
176+
returnnil
177+
}
178+
179+
varreb strings.Builder
180+
fori,re:=rangeres {
181+
_,_=fmt.Fprintf(&reb,"(%s)",re)
182+
ifi!=len(res)-1 {
183+
_,_=reb.WriteRune('|')
184+
}
185+
}
186+
187+
re,err:=regexp.Compile(reb.String())
188+
iferr!=nil {
189+
returnxerrors.Errorf("compile regex: %w",err)
190+
}
191+
f.re=re
192+
returnnil
193+
}
194+
195+
func (f*debugFilterSink)LogEntry(ctx context.Context,ent slog.SinkEntry) {
196+
ifent.Level==slog.LevelDebug {
197+
logName:=strings.Join(ent.LoggerNames,".")
198+
iff.re!=nil&&!f.re.MatchString(logName)&&!f.re.MatchString(ent.Message) {
199+
return
200+
}
201+
}
202+
for_,sink:=rangef.next {
203+
sink.LogEntry(ctx,ent)
204+
}
205+
}
206+
207+
func (f*debugFilterSink)Sync() {
208+
for_,sink:=rangef.next {
209+
sink.Sync()
210+
}
211+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp