55 "fmt"
66 "io"
77 "os"
8+ "time"
89
910 "github.com/go-logr/logr"
1011 "github.com/loft-sh/devpod/pkg/agent/tunnel"
@@ -20,112 +21,136 @@ func NewTunnelLogger(ctx context.Context, client tunnel.TunnelClient, debug bool
2021 level = logrus .DebugLevel
2122 }
2223
23- return & tunnelLogger {ctx : ctx , client : client , level : level }
24+ logger := & tunnelLogger {
25+ ctx : ctx ,
26+ client : client ,
27+ level : level ,
28+ logChan : make (chan * tunnel.LogMessage , 1000 ), // Buffer size of 1000 messages
29+ }
30+
31+ go logger .worker ()
32+
33+ return logger
2434}
2535
2636type tunnelLogger struct {
27- ctx context.Context
28- level logrus.Level
29- client tunnel.TunnelClient
37+ ctx context.Context
38+ level logrus.Level
39+ client tunnel.TunnelClient
40+ logChan chan * tunnel.LogMessage
41+ }
42+
43+ func (s * tunnelLogger ) worker () {
44+ for {
45+ select {
46+ case msg := <- s .logChan :
47+ ctx , cancel := context .WithTimeout (s .ctx , 5 * time .Second )
48+ _ , _ = s .client .Log (ctx , msg )
49+ // ignore error since we can't use the logger itself
50+ cancel ()
51+ case <- s .ctx .Done ():
52+ return
53+ }
54+ }
3055}
3156
3257func (s * tunnelLogger ) Debug (args ... interface {}) {
3358 if s .level < logrus .DebugLevel {
3459 return
3560 }
3661
37- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
62+ s . logChan <- & tunnel.LogMessage {
3863 LogLevel : tunnel .LogLevel_DEBUG ,
3964 Message : fmt .Sprintln (args ... ),
40- })
65+ }
4166}
4267
4368func (s * tunnelLogger ) Debugf (format string , args ... interface {}) {
4469 if s .level < logrus .DebugLevel {
4570 return
4671 }
4772
48- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
73+ s . logChan <- & tunnel.LogMessage {
4974 LogLevel : tunnel .LogLevel_DEBUG ,
5075 Message : fmt .Sprintf (format , args ... ) + "\n " ,
51- })
76+ }
5277}
5378
5479func (s * tunnelLogger ) Info (args ... interface {}) {
5580 if s .level < logrus .InfoLevel {
5681 return
5782 }
5883
59- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
84+ s . logChan <- & tunnel.LogMessage {
6085 LogLevel : tunnel .LogLevel_INFO ,
6186 Message : fmt .Sprintln (args ... ),
62- })
87+ }
6388}
6489
6590func (s * tunnelLogger ) Infof (format string , args ... interface {}) {
6691 if s .level < logrus .InfoLevel {
6792 return
6893 }
6994
70- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
95+ s . logChan <- & tunnel.LogMessage {
7196 LogLevel : tunnel .LogLevel_INFO ,
7297 Message : fmt .Sprintf (format , args ... ) + "\n " ,
73- })
98+ }
7499}
75100
76101func (s * tunnelLogger ) Warn (args ... interface {}) {
77102 if s .level < logrus .WarnLevel {
78103 return
79104 }
80105
81- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
106+ s . logChan <- & tunnel.LogMessage {
82107 LogLevel : tunnel .LogLevel_WARNING ,
83108 Message : fmt .Sprintln (args ... ),
84- })
109+ }
85110}
86111
87112func (s * tunnelLogger ) Warnf (format string , args ... interface {}) {
88113 if s .level < logrus .WarnLevel {
89114 return
90115 }
91116
92- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
117+ s . logChan <- & tunnel.LogMessage {
93118 LogLevel : tunnel .LogLevel_WARNING ,
94119 Message : fmt .Sprintf (format , args ... ) + "\n " ,
95- })
120+ }
96121}
97122
98123func (s * tunnelLogger ) Error (args ... interface {}) {
99124 if s .level < logrus .ErrorLevel {
100125 return
101126 }
102127
103- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
128+ s . logChan <- & tunnel.LogMessage {
104129 LogLevel : tunnel .LogLevel_ERROR ,
105130 Message : fmt .Sprintln (args ... ),
106- })
131+ }
107132}
108133
109134func (s * tunnelLogger ) Errorf (format string , args ... interface {}) {
110135 if s .level < logrus .ErrorLevel {
111136 return
112137 }
113138
114- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
139+ s . logChan <- & tunnel.LogMessage {
115140 LogLevel : tunnel .LogLevel_ERROR ,
116141 Message : fmt .Sprintf (format , args ... ) + "\n " ,
117- })
142+ }
118143}
119144
120145func (s * tunnelLogger ) Fatal (args ... interface {}) {
121146 if s .level < logrus .FatalLevel {
122147 return
123148 }
124149
125- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
150+ s . logChan <- & tunnel.LogMessage {
126151 LogLevel : tunnel .LogLevel_ERROR ,
127152 Message : fmt .Sprintln (args ... ),
128- })
153+ }
129154
130155 os .Exit (1 )
131156}
@@ -135,10 +160,10 @@ func (s *tunnelLogger) Fatalf(format string, args ...interface{}) {
135160 return
136161 }
137162
138- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
163+ s . logChan <- & tunnel.LogMessage {
139164 LogLevel : tunnel .LogLevel_ERROR ,
140165 Message : fmt .Sprintf (format , args ... ) + "\n " ,
141- })
166+ }
142167
143168 os .Exit (1 )
144169}
@@ -148,21 +173,21 @@ func (s *tunnelLogger) Done(args ...interface{}) {
148173 return
149174 }
150175
151- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
176+ s . logChan <- & tunnel.LogMessage {
152177 LogLevel : tunnel .LogLevel_DONE ,
153178 Message : fmt .Sprintln (args ... ),
154- })
179+ }
155180}
156181
157182func (s * tunnelLogger ) Donef (format string , args ... interface {}) {
158183 if s .level < logrus .InfoLevel {
159184 return
160185 }
161186
162- _ , _ = s . client . Log ( s . ctx , & tunnel.LogMessage {
187+ s . logChan <- & tunnel.LogMessage {
163188 LogLevel : tunnel .LogLevel_DONE ,
164189 Message : fmt .Sprintf (format , args ... ) + "\n " ,
165- })
190+ }
166191}
167192
168193func (s * tunnelLogger ) Print (level logrus.Level , args ... interface {}) {
@@ -240,6 +265,15 @@ func (s *tunnelLogger) WriteString(level logrus.Level, message string) {
240265 s .Print (level , message )
241266}
242267
268+ func (s * tunnelLogger ) WriteLevel (level logrus.Level , message []byte ) (int , error ) {
269+ if s .level < level {
270+ return 0 , nil
271+ }
272+
273+ s .Print (level , string (message ))
274+ return len (message ), nil
275+ }
276+
243277func (s * tunnelLogger ) Question (params * survey.QuestionOptions ) (string , error ) {
244278 return "" , fmt .Errorf ("not supported" )
245279}
0 commit comments