Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
- Add a dropdown on the "Receiver address" input in the send screen to select an account
- Add feedback link to guide and about settings
- Move active currencies to top of currency dropdown
- Export logs now includes rotated log file (log.txt.1) when present
- Android: fix connectivity misdetection when switching between WIFI and cellular network.
- Android: dropped support for Android versions lower than 7.
- Sort backups from newest to oldest in manage backups
Expand Down
21 changes: 6 additions & 15 deletions backend/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package backend
import (
"encoding/hex"
"fmt"
"io"
"net/http"
"net/url"
"os"
Expand Down Expand Up @@ -1102,28 +1101,20 @@ func (backend *Backend) ExportLogs() error {
}
backend.log.Infof("Export logs to %s.", path)

file, err := os.Create(path)
exportFile, err := os.Create(path)
if err != nil {
backend.log.WithError(err).Error("error creating new log file")
return err
}
logFilePath := filepath.Join(utilConfig.AppDir(), "log.txt")

existingLogFile, err := os.Open(logFilePath)
if err != nil {
backend.log.WithError(err).Error("error opening existing log file")
if err := logging.WriteCombinedLog(exportFile, logFilePath); err != nil {
backend.log.WithError(err).Error("error copying existing logs to new file")
_ = exportFile.Close()
return err
}

defer func() {
if err := existingLogFile.Close(); err != nil {
backend.log.WithError(err).Error("error closing existing log file")
}
}()

_, err = io.Copy(file, existingLogFile)
if err != nil {
backend.log.WithError(err).Error("error copying existing log to new file")
if err := exportFile.Close(); err != nil {
backend.log.WithError(err).Error("error closing new log file")
return err
}
backend.log.Infof("Exported logs copied to %s.", path)
Expand Down
58 changes: 58 additions & 0 deletions util/logging/export.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// SPDX-License-Identifier: Apache-2.0

package logging

import (
"errors"
"fmt"
"io"
"os"
"path/filepath"
)

// WriteCombinedLog writes the current log file and, if it exists, the rotated-out log file
// (with ".1" appended) into dst, in chronological order (rotated file first).
func WriteCombinedLog(dst io.Writer, logFilePath string) error {
paths := []string{}

rotatedLogFilePath := logFilePath + rotatedSuffix
if _, err := os.Stat(rotatedLogFilePath); err == nil {
paths = append(paths, rotatedLogFilePath)
} else if err != nil && !errors.Is(err, os.ErrNotExist) {
return err
}

if _, err := os.Stat(logFilePath); err == nil {
paths = append(paths, logFilePath)
} else if err != nil && !errors.Is(err, os.ErrNotExist) {
return err
}

if len(paths) == 0 {
return fmt.Errorf("no log files found at %s", logFilePath)
}

for idx, path := range paths {
if idx > 0 {
if _, err := io.WriteString(dst, "\n\n"); err != nil {
return err
}
}
if _, err := io.WriteString(dst, fmt.Sprintf("----- %s -----\n", filepath.Base(path))); err != nil {
return err
}
file, err := os.Open(path)
if err != nil {
return err
}
_, copyErr := io.Copy(dst, file)
closeErr := file.Close()
if copyErr != nil {
return copyErr
}
if closeErr != nil {
return closeErr
}
}
return nil
}
43 changes: 43 additions & 0 deletions util/logging/export_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-License-Identifier: Apache-2.0

package logging

import (
"bytes"
"os"
"path/filepath"
"testing"

"github.com/stretchr/testify/require"
)

func TestWriteCombinedLog(t *testing.T) {
tempdir := t.TempDir()

logfile := filepath.Join(tempdir, "log.txt")
require.NoError(t, os.WriteFile(logfile, []byte("new\n"), 0600))
require.NoError(t, os.WriteFile(logfile+".1", []byte("old\n"), 0600))

var buf bytes.Buffer
require.NoError(t, WriteCombinedLog(&buf, logfile))
require.Equal(t, "----- log.txt.1 -----\nold\n\n\n----- log.txt -----\nnew\n", buf.String())
}

func TestWriteCombinedLogNoRotatedFile(t *testing.T) {
tempdir := t.TempDir()

logfile := filepath.Join(tempdir, "log.txt")
require.NoError(t, os.WriteFile(logfile, []byte("new\n"), 0600))

var buf bytes.Buffer
require.NoError(t, WriteCombinedLog(&buf, logfile))
require.Equal(t, "----- log.txt -----\nnew\n", buf.String())
}

func TestWriteCombinedLogNoFiles(t *testing.T) {
tempdir := t.TempDir()
logfile := filepath.Join(tempdir, "log.txt")

var buf bytes.Buffer
require.Error(t, WriteCombinedLog(&buf, logfile))
}