Skip to content

Commit

Permalink
TUN-8783: fix log collectors for the diagnostic procedure
Browse files Browse the repository at this point in the history
## Summary

* The host log collector now verifies if the OS is linux and has systemd if so it will use journalctl to get the logs
* In linux systems docker will write the output of the command logs to the stderr therefore the function that handles the execution of the process will copy both the contents of stdout and stderr; this also affect the k8s collector

Closes TUN-8783
  • Loading branch information
lmpn committed Dec 10, 2024
1 parent e7dcb6e commit 29f0cf3
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 4 deletions.
36 changes: 34 additions & 2 deletions diagnostic/log_collector_host.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import (
"context"
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
)

const (
linuxManagedLogsPath = "/var/log/cloudflared.err"
darwinManagedLogsPath = "/Library/Logs/com.cloudflare.cloudflared.err.log"
linuxManagedLogsPath = "/var/log/cloudflared.err"
darwinManagedLogsPath = "/Library/Logs/com.cloudflare.cloudflared.err.log"
linuxServiceConfigurationPath = "/etc/systemd/system/cloudflared.service"
linuxSystemdPath = "/run/systemd/system"
)

type HostLogCollector struct {
Expand All @@ -23,6 +26,28 @@ func NewHostLogCollector(client HTTPClient) *HostLogCollector {
}
}

func extractLogsFromJournalCtl(ctx context.Context) (*LogInformation, error) {
tmp := os.TempDir()

outputHandle, err := os.Create(filepath.Join(tmp, logFilename))
if err != nil {
return nil, fmt.Errorf("error opening output file: %w", err)
}

defer outputHandle.Close()

command := exec.CommandContext(
ctx,
"journalctl",
"--since",
"2 weeks ago",
"-u",
"cloudflared.service",
)

return PipeCommandOutputToFile(command, outputHandle)
}

func getServiceLogPath() (string, error) {
switch runtime.GOOS {
case "darwin":
Expand Down Expand Up @@ -55,6 +80,13 @@ func (collector *HostLogCollector) Collect(ctx context.Context) (*LogInformation
}

if logConfiguration.uid == 0 {
_, statSystemdErr := os.Stat(linuxServiceConfigurationPath)

_, statServiceConfigurationErr := os.Stat(linuxServiceConfigurationPath)
if statSystemdErr == nil && statServiceConfigurationErr == nil && runtime.GOOS == "linux" {
return extractLogsFromJournalCtl(ctx)
}

path, err := getServiceLogPath()
if err != nil {
return nil, err
Expand Down
23 changes: 21 additions & 2 deletions diagnostic/log_collector_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,16 @@ func PipeCommandOutputToFile(command *exec.Cmd, outputHandle *os.File) (*LogInfo
stdoutReader, err := command.StdoutPipe()
if err != nil {
return nil, fmt.Errorf(
"error retrieving output from command '%s': %w",
"error retrieving stdout from command '%s': %w",
command.String(),
err,
)
}

stderrReader, err := command.StderrPipe()
if err != nil {
return nil, fmt.Errorf(
"error retrieving stderr from command '%s': %w",
command.String(),
err,
)
Expand All @@ -29,7 +38,17 @@ func PipeCommandOutputToFile(command *exec.Cmd, outputHandle *os.File) (*LogInfo
_, err = io.Copy(outputHandle, stdoutReader)
if err != nil {
return nil, fmt.Errorf(
"error copying output from %s to file %s: %w",
"error copying stdout from %s to file %s: %w",
command.String(),
outputHandle.Name(),
err,
)
}

_, err = io.Copy(outputHandle, stderrReader)
if err != nil {
return nil, fmt.Errorf(
"error copying stderr from %s to file %s: %w",
command.String(),
outputHandle.Name(),
err,
Expand Down

0 comments on commit 29f0cf3

Please sign in to comment.