Skip to content

Commit

Permalink
feat: read server logs directly from file (daytonaio#830)
Browse files Browse the repository at this point in the history
Signed-off-by: legionOfGo <[email protected]>
  • Loading branch information
joey1123455 authored Jul 26, 2024
1 parent be441d2 commit ca1826d
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 7 deletions.
1 change: 1 addition & 0 deletions docs/daytona_server_logs.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ daytona server logs [flags]
### Options

```
--file Read logs from local server log file
-f, --follow Follow logs
```

Expand Down
3 changes: 3 additions & 0 deletions hack/docs/daytona_server_logs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ name: daytona server logs
synopsis: Output Daytona Server logs
usage: daytona server logs [flags]
options:
- name: file
default_value: "false"
usage: Read logs from local server log file
- name: follow
shorthand: f
default_value: "false"
Expand Down
87 changes: 80 additions & 7 deletions pkg/cmd/server/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@
package server

import (
"context"
"fmt"
"io"
"os"

"github.com/charmbracelet/huh"
"github.com/daytonaio/daytona/cmd/daytona/config"
"github.com/daytonaio/daytona/internal/util"
"github.com/daytonaio/daytona/internal/util/apiclient"
"github.com/daytonaio/daytona/pkg/server"
"github.com/daytonaio/daytona/pkg/views"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

var followFlag bool
var fileFlag bool

var logsCmd = &cobra.Command{
Use: "logs",
Expand All @@ -33,22 +41,87 @@ var logsCmd = &cobra.Command{
query = "follow=true"
}

ws, res, err := apiclient.GetWebsocketConn("/log/server", &activeProfile, &query)
if err != nil {
log.Fatal(apiclient.HandleErrorResponse(res, err))
}
switch {
case fileFlag:
readServerLogFile()

default:
ws, res, err := apiclient.GetWebsocketConn("/log/server", &activeProfile, &query)

for {
_, msg, err := ws.ReadMessage()
if err != nil {
log.Error(apiclient.HandleErrorResponse(res, err))

if activeProfile.Id != "default" {
return
}

readLogsFile := true
form := huh.NewForm(
huh.NewGroup(
huh.NewConfirm().Description("An error occurred while connecting to the server. Would you like to read from local log file instead?").
Value(&readLogsFile),
),
).WithTheme(views.GetCustomTheme())
formErr := form.Run()
if formErr != nil {
log.Fatal(formErr)
}

if readLogsFile {
readServerLogFile()
}
return

}

fmt.Println(string(msg))
for {
_, msg, err := ws.ReadMessage()
if err != nil {
return
}

fmt.Println(string(msg))
}
}

},
}

func readServerLogFile() {
views.RenderBorderedMessage("Reading from server log file...")
cfg, err := server.GetConfig()
if err != nil {
log.Fatal(fmt.Errorf("failed to get server config: %w", err).Error())
}

file, err := os.Open(cfg.LogFilePath)
if err != nil {
log.Fatal(fmt.Errorf("while opening server logs: %v", err).Error())
}
defer file.Close()
msgChan := make(chan []byte)
errChan := make(chan error)

go util.ReadLog(context.Background(), file, followFlag, msgChan, errChan)

for {
select {
case <-context.Background().Done():
return
case err := <-errChan:
if err != nil {
if err != io.EOF {
log.Fatal(err)
}
return
}
case msg := <-msgChan:
fmt.Println(string(msg))
}
}
}

func init() {
logsCmd.Flags().BoolVarP(&followFlag, "follow", "f", false, "Follow logs")
logsCmd.Flags().BoolVar(&fileFlag, "file", false, "Read logs from local server log file")
}

0 comments on commit ca1826d

Please sign in to comment.