@@ -3,6 +3,7 @@ package main
33import (
44 "errors"
55 "fmt"
6+ "log"
67 "os"
78 "runtime"
89 "strings"
@@ -103,7 +104,7 @@ func main() {
103104 defragCmd := newDefragCommand ()
104105 if err := defragCmd .Execute (); err != nil {
105106 if defragCmd .SilenceErrors {
106- fmt . Fprintln ( os . Stderr , "Error:" , err )
107+ log . Println ( "Error:" , err )
107108 os .Exit (1 )
108109 } else {
109110 os .Exit (1 )
@@ -125,52 +126,52 @@ func defragCommandFunc(cmd *cobra.Command, args []string) {
125126 printVersion (globalCfg .printVersion )
126127
127128 if globalCfg .dryRun {
128- fmt .Println ("Using dry run mode, will not perform defragmentation" )
129+ log .Println ("Using dry run mode, will not perform defragmentation" )
129130 }
130131
131- fmt .Println ("Validating configuration." )
132+ log .Println ("Validating configuration." )
132133 if err := validateConfig (cmd , globalCfg ); err != nil {
133- fmt . Fprintf ( os . Stderr , "Validating configuration failed: %v\n " , err )
134+ log . Printf ( "Validating configuration failed: %v\n " , err )
134135 os .Exit (1 )
135136 }
136137
137- fmt .Println ("Performing health check." )
138+ log .Println ("Performing health check." )
138139 if ! healthCheck (globalCfg ) {
139140 os .Exit (1 )
140141 }
141142
142- fmt .Println ("Getting members status" )
143+ log .Println ("Getting members status" )
143144 statusList , err := getMembersStatus (globalCfg )
144145 if err != nil {
145- fmt . Fprintf ( os . Stderr , "Failed to get members status: %v\n " , err )
146+ log . Printf ( "Failed to get members status: %v\n " , err )
146147 os .Exit (1 )
147148 }
148149
149150 eps , err := endpointsWithLeaderAtEnd (globalCfg , statusList )
150151 if err != nil {
151- fmt . Fprintf ( os . Stderr , "Failed to get endpoints: %v\n " , err )
152+ log . Printf ( "Failed to get endpoints: %v\n " , err )
152153 os .Exit (1 )
153154 }
154155
155156 if globalCfg .compaction && ! globalCfg .dryRun {
156- fmt .Printf ("Running compaction until revision: %d ... " , statusList [0 ].Resp .Header .Revision )
157+ log .Printf ("Running compaction until revision: %d ... " , statusList [0 ].Resp .Header .Revision )
157158 if err := compact (globalCfg , statusList [0 ].Resp .Header .Revision , eps [0 ]); err != nil {
158- fmt .Printf ("failed, %v\n " , err )
159+ log .Printf ("failed, %v\n " , err )
159160 } else {
160- fmt .Println ("successful" )
161+ log .Println ("successful" )
161162 }
162163 } else {
163- fmt .Println ("Skip compaction." )
164+ log .Println ("Skip compaction." )
164165 }
165166
166- fmt .Printf ("%d endpoint(s) need to be defragmented: %v\n " , len (eps ), eps )
167+ log .Printf ("%d endpoint(s) need to be defragmented: %v\n " , len (eps ), eps )
167168 failures := 0
168169 for _ , ep := range eps {
169- fmt .Print ("[Before defragmentation] " )
170+ log .Print ("[Before defragmentation] " )
170171 status , err := getMemberStatus (globalCfg , ep )
171172 if err != nil {
172173 failures ++
173- fmt . Fprintf ( os . Stderr , "Failed to get member (%q) status, error: %v\n " , ep , err )
174+ log . Printf ( "Failed to get member (%q) status, error: %v\n " , ep , err )
174175 if ! globalCfg .continueOnError {
175176 break
176177 }
@@ -181,27 +182,27 @@ func defragCommandFunc(cmd *cobra.Command, args []string) {
181182 if ! evalRet || err != nil {
182183 if err != nil {
183184 failures ++
184- fmt . Fprintf ( os . Stderr , "Evaluation failed, endpoint: %s, error:%v\n " , ep , err )
185+ log . Printf ( "Evaluation failed, endpoint: %s, error:%v\n " , ep , err )
185186 if ! globalCfg .continueOnError {
186187 break
187188 }
188189 continue
189190 }
190- fmt .Printf ("Evaluation result is false, so skipping endpoint: %s\n " , ep )
191+ log .Printf ("Evaluation result is false, so skipping endpoint: %s\n " , ep )
191192 continue
192193 }
193194
194195 if globalCfg .dryRun {
195- fmt .Printf ("[Dry run] skip defragmenting endpoint %q\n " , ep )
196+ log .Printf ("[Dry run] skip defragmenting endpoint %q\n " , ep )
196197 continue
197198 }
198199
199200 // Check if the member is a leader and move the leader if necessary
200201 if globalCfg .moveLeader {
201202 if status .Resp .Leader == status .Resp .Header .MemberId {
202- fmt .Println ("Transferring the leadership from the current leader" )
203+ log .Println ("Transferring the leadership from the current leader" )
203204 if err = moveLeader (globalCfg , status .Resp .Leader , ep ); err != nil {
204- fmt . Fprintf ( os . Stderr , "Failed to transfer the leadership from %x to a follower, error: %v\n " , status .Resp .Leader , err )
205+ log . Printf ( "Failed to transfer the leadership from %x to a follower, error: %v\n " , status .Resp .Leader , err )
205206 if ! globalCfg .continueOnError {
206207 break
207208 }
@@ -210,37 +211,37 @@ func defragCommandFunc(cmd *cobra.Command, args []string) {
210211 }
211212 }
212213
213- fmt .Printf ("Defragmenting endpoint %q\n " , ep )
214+ log .Printf ("Defragmenting endpoint %q\n " , ep )
214215 startTS := time .Now ()
215216 err = defragment (globalCfg , ep )
216217 d := time .Since (startTS )
217218 if err != nil {
218219 failures ++
219- fmt . Fprintf ( os . Stderr , "Failed to defragment etcd member %q. took %s. (%v)\n " , ep , d .String (), err )
220+ log . Printf ( "Failed to defragment etcd member %q. took %s. (%v)\n " , ep , d .String (), err )
220221 if ! globalCfg .continueOnError {
221222 break
222223 }
223224 continue
224225 } else {
225- fmt .Printf ("Finished defragmenting etcd endpoint %q. took %s\n " , ep , d .String ())
226+ log .Printf ("Finished defragmenting etcd endpoint %q. took %s\n " , ep , d .String ())
226227 }
227228
228- fmt .Print ("[Post defragmentation] " )
229+ log .Print ("[Post defragmentation] " )
229230 _ , err = getMemberStatus (globalCfg , ep )
230231 if err != nil {
231232 failures ++
232- fmt . Fprintf ( os . Stderr , "Failed to get member (%q) status, error: %v\n " , ep , err )
233+ log . Printf ( "Failed to get member (%q) status, error: %v\n " , ep , err )
233234 if ! globalCfg .continueOnError {
234235 break
235236 }
236237 continue
237238 }
238239 }
239240 if failures != 0 {
240- fmt . Fprintf ( os . Stderr , "%d (total %d) endpoint(s) failed to be defragmented.\n " , failures , len (eps ))
241+ log . Printf ( "%d (total %d) endpoint(s) failed to be defragmented.\n " , failures , len (eps ))
241242 os .Exit (1 )
242243 }
243- fmt .Println ("The defragmentation is successful." )
244+ log .Println ("The defragmentation is successful." )
244245}
245246
246247func validateConfig (cmd * cobra.Command , gcfg globalConfig ) error {
@@ -257,15 +258,15 @@ func validateConfig(cmd *cobra.Command, gcfg globalConfig) error {
257258 }
258259
259260 if len (gcfg .defragRule ) > 0 {
260- fmt .Printf ("Validating the defragmentation rule: %v ... " , gcfg .defragRule )
261+ log .Printf ("Validating the defragmentation rule: %v ... " , gcfg .defragRule )
261262
262263 if err := validateRule (gcfg .defragRule ); err != nil {
263- fmt .Println ("invalid" )
264+ log .Println ("invalid" )
264265 return fmt .Errorf ("invalid rule %q, error: %w" , gcfg .defragRule , err )
265266 }
266- fmt .Println ("valid" )
267+ log .Println ("valid" )
267268 } else {
268- fmt .Println ("No defragmentation rule provided" )
269+ log .Println ("No defragmentation rule provided" )
269270 }
270271
271272 return nil
@@ -274,7 +275,7 @@ func validateConfig(cmd *cobra.Command, gcfg globalConfig) error {
274275func healthCheck (gcfg globalConfig ) bool {
275276 healthInfos , err := clusterHealth (gcfg )
276277 if err != nil {
277- fmt . Fprintf ( os . Stderr , "Failed to get members' health info: %v\n " , err )
278+ log . Printf ( "Failed to get members' health info: %v\n " , err )
278279 return false
279280 }
280281
@@ -284,7 +285,7 @@ func healthCheck(gcfg globalConfig) bool {
284285 unhealthyCount ++
285286 }
286287
287- fmt .Println (healthInfo .String ())
288+ log .Println (healthInfo .String ())
288289 }
289290
290291 return unhealthyCount == 0
@@ -297,7 +298,7 @@ func getMembersStatus(gcfg globalConfig) ([]epStatus, error) {
297298 }
298299
299300 for _ , status := range statusList {
300- fmt .Println (status .String ())
301+ log .Println (status .String ())
301302 }
302303 return statusList , nil
303304}
@@ -307,7 +308,7 @@ func getMemberStatus(gcfg globalConfig, ep string) (epStatus, error) {
307308 if err != nil {
308309 return epStatus {}, err
309310 }
310- fmt .Println (status .String ())
311+ log .Println (status .String ())
311312 return status , nil
312313}
313314
@@ -318,7 +319,7 @@ func moveLeader(gcfg globalConfig, leaderID uint64, leaderEndpoint string) error
318319 }
319320
320321 if len (memberlistResp .Members ) == 1 {
321- fmt .Println ("Skip moving leader as there is only one member in the cluster" )
322+ log .Println ("Skip moving leader as there is only one member in the cluster" )
322323 return nil
323324 }
324325
@@ -335,6 +336,6 @@ func moveLeader(gcfg globalConfig, leaderID uint64, leaderEndpoint string) error
335336 return fmt .Errorf ("coundn't find a follower in the %d member cluster" , len (memberlistResp .Members ))
336337 }
337338
338- fmt .Printf ("Transferring the leadership from %x to %x\n " , leaderID , newLeaderID )
339+ log .Printf ("Transferring the leadership from %x to %x\n " , leaderID , newLeaderID )
339340 return transferLeadership (globalCfg , leaderEndpoint , newLeaderID )
340341}
0 commit comments