🔊 feat(log): Log to file
This commit is contained in:
parent
6dd925467a
commit
d06436d993
5 changed files with 143 additions and 13 deletions
3
go.mod
3
go.mod
|
@ -12,9 +12,11 @@ require (
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
|
github.com/charmbracelet/log v0.4.0 // indirect
|
||||||
github.com/charmbracelet/x/ansi v0.2.3 // indirect
|
github.com/charmbracelet/x/ansi v0.2.3 // indirect
|
||||||
github.com/charmbracelet/x/term v0.2.0 // indirect
|
github.com/charmbracelet/x/term v0.2.0 // indirect
|
||||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
|
||||||
|
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-localereader v0.0.1 // indirect
|
github.com/mattn/go-localereader v0.0.1 // indirect
|
||||||
|
@ -23,6 +25,7 @@ require (
|
||||||
github.com/muesli/cancelreader v0.2.2 // indirect
|
github.com/muesli/cancelreader v0.2.2 // indirect
|
||||||
github.com/muesli/termenv v0.15.2 // indirect
|
github.com/muesli/termenv v0.15.2 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
golang.org/x/sys v0.25.0 // indirect
|
golang.org/x/sys v0.25.0 // indirect
|
||||||
golang.org/x/text v0.3.8 // indirect
|
golang.org/x/text v0.3.8 // indirect
|
||||||
|
|
6
go.sum
6
go.sum
|
@ -6,12 +6,16 @@ github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69J
|
||||||
github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
|
github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
|
||||||
github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw=
|
github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw=
|
||||||
github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY=
|
github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY=
|
||||||
|
github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM=
|
||||||
|
github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
|
||||||
github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY=
|
github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY=
|
||||||
github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
|
github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
|
||||||
github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
|
github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
|
||||||
github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
|
github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
|
||||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
|
||||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
|
||||||
|
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
|
||||||
|
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
|
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
|
||||||
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
|
@ -29,6 +33,8 @@ github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1n
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|
|
@ -2,7 +2,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"time"
|
"time"
|
||||||
|
@ -18,7 +17,7 @@ func (m menu) installPackage() tea.Cmd {
|
||||||
return func() tea.Msg {
|
return func() tea.Msg {
|
||||||
pkg := m.order[m.current]
|
pkg := m.order[m.current]
|
||||||
|
|
||||||
m.appendOutput(fmt.Sprintf("Installing %s", pkg))
|
m.logger.Infof("Installing %s...", pkg)
|
||||||
|
|
||||||
cmd := exec.Command("./test.sh")
|
cmd := exec.Command("./test.sh")
|
||||||
out, err := cmd.StdoutPipe()
|
out, err := cmd.StdoutPipe()
|
||||||
|
@ -35,8 +34,9 @@ func (m menu) installPackage() tea.Cmd {
|
||||||
line, _, err := buf.ReadLine()
|
line, _, err := buf.ReadLine()
|
||||||
|
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
m.appendOutput(fmt.Sprintf("Finished installing %s!", pkg))
|
m.logger.Infof("Finished installing %s!", pkg)
|
||||||
time.Sleep(3 * time.Second)
|
m.logger.Infof("Output: %s\n\n", *m.output)
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
return cmdDoneMsg{}
|
return cmdDoneMsg{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
108
log.txt
Normal file
108
log.txt
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
INFO Installing atuin...
|
||||||
|
INFO Finished installing atuin!
|
||||||
|
INFO Output:
|
||||||
|
0 line
|
||||||
|
1 line
|
||||||
|
2 line
|
||||||
|
3 line
|
||||||
|
4 line
|
||||||
|
5 line
|
||||||
|
6 line
|
||||||
|
7 line
|
||||||
|
8 line
|
||||||
|
9 line
|
||||||
|
10 line
|
||||||
|
11 line
|
||||||
|
12 line
|
||||||
|
13 line
|
||||||
|
14 line
|
||||||
|
15 line
|
||||||
|
16 line
|
||||||
|
17 line
|
||||||
|
18 line
|
||||||
|
19 line
|
||||||
|
20 line
|
||||||
|
21 line
|
||||||
|
22 line
|
||||||
|
23 line
|
||||||
|
24 line
|
||||||
|
25 line
|
||||||
|
26 line
|
||||||
|
27 line
|
||||||
|
28 line
|
||||||
|
29 line
|
||||||
|
30 line
|
||||||
|
|
||||||
|
|
||||||
|
INFO Installing bash-completion...
|
||||||
|
INFO Finished installing bash-completion!
|
||||||
|
INFO Output:
|
||||||
|
0 line
|
||||||
|
1 line
|
||||||
|
2 line
|
||||||
|
3 line
|
||||||
|
4 line
|
||||||
|
5 line
|
||||||
|
6 line
|
||||||
|
7 line
|
||||||
|
8 line
|
||||||
|
9 line
|
||||||
|
10 line
|
||||||
|
11 line
|
||||||
|
12 line
|
||||||
|
13 line
|
||||||
|
14 line
|
||||||
|
15 line
|
||||||
|
16 line
|
||||||
|
17 line
|
||||||
|
18 line
|
||||||
|
19 line
|
||||||
|
20 line
|
||||||
|
21 line
|
||||||
|
22 line
|
||||||
|
23 line
|
||||||
|
24 line
|
||||||
|
25 line
|
||||||
|
26 line
|
||||||
|
27 line
|
||||||
|
28 line
|
||||||
|
29 line
|
||||||
|
30 line
|
||||||
|
|
||||||
|
|
||||||
|
INFO Installing bandwhich...
|
||||||
|
INFO Finished installing bandwhich!
|
||||||
|
INFO Output:
|
||||||
|
0 line
|
||||||
|
1 line
|
||||||
|
2 line
|
||||||
|
3 line
|
||||||
|
4 line
|
||||||
|
5 line
|
||||||
|
6 line
|
||||||
|
7 line
|
||||||
|
8 line
|
||||||
|
9 line
|
||||||
|
10 line
|
||||||
|
11 line
|
||||||
|
12 line
|
||||||
|
13 line
|
||||||
|
14 line
|
||||||
|
15 line
|
||||||
|
16 line
|
||||||
|
17 line
|
||||||
|
18 line
|
||||||
|
19 line
|
||||||
|
20 line
|
||||||
|
21 line
|
||||||
|
22 line
|
||||||
|
23 line
|
||||||
|
24 line
|
||||||
|
25 line
|
||||||
|
26 line
|
||||||
|
27 line
|
||||||
|
28 line
|
||||||
|
29 line
|
||||||
|
30 line
|
||||||
|
|
||||||
|
|
31
main.go
31
main.go
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/charmbracelet/bubbles/viewport"
|
"github.com/charmbracelet/bubbles/viewport"
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
"github.com/charmbracelet/lipgloss"
|
"github.com/charmbracelet/lipgloss"
|
||||||
|
"github.com/charmbracelet/log"
|
||||||
"golang.org/x/term"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ type menu struct {
|
||||||
sub chan string
|
sub chan string
|
||||||
output *string
|
output *string
|
||||||
viewport viewport.Model
|
viewport viewport.Model
|
||||||
|
logger *log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -34,23 +36,28 @@ const (
|
||||||
softwareGroup = "_Full-Desktop"
|
softwareGroup = "_Full-Desktop"
|
||||||
)
|
)
|
||||||
|
|
||||||
func initialModel() menu {
|
func initialModel(logFile *os.File) menu {
|
||||||
s := spinner.New()
|
s := spinner.New()
|
||||||
s.Spinner = spinner.MiniDot
|
s.Spinner = spinner.MiniDot
|
||||||
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("3"))
|
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("3"))
|
||||||
width, height, _ := term.GetSize(int(os.Stdout.Fd()))
|
width, height, _ := term.GetSize(int(os.Stdout.Fd()))
|
||||||
|
|
||||||
|
logger := log.New(logFile)
|
||||||
|
logger.SetLevel(log.InfoLevel)
|
||||||
|
logger.SetFormatter(log.TextFormatter)
|
||||||
|
|
||||||
m := menu{
|
m := menu{
|
||||||
current: 0,
|
current: 0,
|
||||||
keys: keys,
|
|
||||||
help: help.New(),
|
|
||||||
spinner: s,
|
|
||||||
quitting: false,
|
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
sub: make(chan string),
|
sub: make(chan string),
|
||||||
output: new(string),
|
output: new(string),
|
||||||
viewport: viewport.New(0, 30),
|
viewport: viewport.New(0, 30),
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
spinner: s,
|
||||||
|
keys: keys,
|
||||||
|
help: help.New(),
|
||||||
|
logger: logger,
|
||||||
|
quitting: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -135,7 +142,7 @@ func (m menu) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
m.viewport.Height = lipgloss.Height(m.mainView())
|
m.viewport.Height = lipgloss.Height(m.mainView())
|
||||||
|
|
||||||
case errMsg:
|
case errMsg:
|
||||||
m.appendOutput("Error: " + msg.Error())
|
m.logger.Error("Error: " + msg.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
m.viewport, cmd = m.viewport.Update(msg)
|
m.viewport, cmd = m.viewport.Update(msg)
|
||||||
|
@ -159,8 +166,14 @@ func (m menu) View() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
l, err := os.Create("log.txt")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
p := tea.NewProgram(
|
p := tea.NewProgram(
|
||||||
initialModel(),
|
initialModel(l),
|
||||||
tea.WithAltScreen(),
|
tea.WithAltScreen(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue