Update build
This commit is contained in:
9
.air.toml
Normal file
9
.air.toml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
root = "."
|
||||||
|
tmp_dir = "tmp"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
cmd = "go build -buildvcs=false -o ./tmp/main ."
|
||||||
|
bin = "tmp/main"
|
||||||
|
delay = 1000
|
||||||
|
exclude_dir = ["tmp", "vendor"]
|
||||||
|
|
||||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
tmp/
|
||||||
@@ -7,4 +7,4 @@ FROM scratch
|
|||||||
|
|
||||||
COPY --from=prep-image /lilog /lilog
|
COPY --from=prep-image /lilog /lilog
|
||||||
|
|
||||||
CMD ["/lilog"]
|
ENTRYPOINT ["/lilog"]
|
||||||
|
|||||||
10
Makefile
10
Makefile
@@ -2,3 +2,13 @@ docker-build:
|
|||||||
docker build -t liffsh/lilog:latest --progress=plain ./
|
docker build -t liffsh/lilog:latest --progress=plain ./
|
||||||
docker-run:
|
docker-run:
|
||||||
docker run -v /var/run/docker.sock:/var/run/docker.sock liffsh/lilog:latest
|
docker run -v /var/run/docker.sock:/var/run/docker.sock liffsh/lilog:latest
|
||||||
|
ship:
|
||||||
|
docker build -t liffsh/lilog:latest . && docker push liffsh/lilog:latest
|
||||||
|
dev:
|
||||||
|
docker run --rm -it \
|
||||||
|
-v $$(pwd):/app \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-w /app \
|
||||||
|
-p 8080:8080 \
|
||||||
|
golang:latest \
|
||||||
|
sh -c "go install github.com/air-verse/air@latest && air"
|
||||||
|
|||||||
107
main.go
107
main.go
@@ -16,58 +16,71 @@ import (
|
|||||||
"github.com/docker/docker/pkg/stdcopy"
|
"github.com/docker/docker/pkg/stdcopy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var containers = make(map[string]int)
|
||||||
|
|
||||||
|
type LogType struct {
|
||||||
|
Log string
|
||||||
|
Source string
|
||||||
|
ContainerName string
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
listContainersAndLogType()
|
ctx := context.Background()
|
||||||
pp.Println("Running")
|
pp.Println("Running")
|
||||||
ticker := time.NewTicker(1 * time.Second)
|
ticker := time.NewTicker(1 * time.Second)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
// for _ = range ticker.C {
|
logschan := make(chan LogType)
|
||||||
// fetchLogs(client)
|
listContainersAndLogType(ctx, logschan)
|
||||||
// }
|
|
||||||
|
go func() {
|
||||||
done := make(chan struct{})
|
time.Sleep(3 * time.Second)
|
||||||
<-done // block forever
|
slog.Info("Slept")
|
||||||
|
done := ctx.Done()
|
||||||
|
test := <- done
|
||||||
|
pp.Println(test)
|
||||||
|
}()
|
||||||
|
|
||||||
|
for i := range logschan {
|
||||||
|
pp.Println(i.ContainerName + ": " + i.Log)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func listContainersAndLogType() {
|
func listContainersAndLogType(ctx context.Context, logschan chan<- LogType) {
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error creating Docker client: %v", err)
|
log.Fatalf("Error creating Docker client: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// List running and stopped containers
|
|
||||||
containers, err := cli.ContainerList(ctx, container.ListOptions{All: true})
|
containers, err := cli.ContainerList(ctx, container.ListOptions{All: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error listing containers: %v", err)
|
log.Fatalf("Error listing containers: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pp.Println(containers)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
time.Sleep(3 * time.Second)
|
|
||||||
slog.Info("Slept")
|
|
||||||
ctx.Done()
|
|
||||||
}()
|
|
||||||
|
|
||||||
for _, curcont := range containers {
|
for _, curcont := range containers {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
streamContainerLogs(ctx, cli, curcont)
|
defer streamContainerLogs(ctx, cli, curcont, logschan)
|
||||||
}()
|
}()
|
||||||
// pp.Println(logs)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func streamContainerLogs(ctx context.Context, cli *client.Client, curcont container.Summary) {
|
func streamContainerLogs(ctx context.Context, cli *client.Client, curcont container.Summary, logschan chan<- LogType) {
|
||||||
|
|
||||||
inspect, err := cli.ContainerInspect(ctx, curcont.ID)
|
inspect, err := cli.ContainerInspect(ctx, curcont.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error inspecting container %s: %v", curcont.ID, err)
|
log.Printf("Error inspecting container %s: %v", curcont.ID, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println("Cmd: ", inspect.Config.Cmd)
|
||||||
|
fmt.Println("Entrypoint: ", inspect.Config.Entrypoint)
|
||||||
|
if len(inspect.Config.Cmd) == 0 {
|
||||||
|
slog.Info("Skipping container as cmd empty", "container-id", curcont.ID, "container-image", curcont.Image)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if inspect.Config.Cmd[0] == "/lilog" {
|
||||||
|
slog.Info("Skipping own container logs")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
logType := inspect.HostConfig.LogConfig.Type
|
logType := inspect.HostConfig.LogConfig.Type
|
||||||
fmt.Printf("Container: %-20s ID: %.12s LogDriver: %s\n",
|
fmt.Printf("Container: %-20s ID: %.12s LogDriver: %s\n",
|
||||||
curcont.Image, curcont.ID, logType)
|
curcont.Image, curcont.ID, logType)
|
||||||
@@ -76,40 +89,40 @@ func streamContainerLogs(ctx context.Context, cli *client.Client, curcont contai
|
|||||||
ShowStdout: true,
|
ShowStdout: true,
|
||||||
ShowStderr: true,
|
ShowStderr: true,
|
||||||
Follow: true,
|
Follow: true,
|
||||||
|
Tail: "3",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer reader.Close()
|
defer reader.Close()
|
||||||
|
stdoutPR, stdoutPW := io.Pipe()
|
||||||
|
stderrPR, stderrPW := io.Pipe()
|
||||||
|
|
||||||
if !inspect.Config.Tty {
|
defer stdoutPW.Close()
|
||||||
// stdcopy.StdCopy(os.Stdout, os.Stderr, reader)
|
defer stderrPW.Close()
|
||||||
|
|
||||||
scanner := bufio.NewScanner(reader)
|
|
||||||
for scanner.Scan() {
|
|
||||||
handleLog("stdout", scanner.Text())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// io.Copy(os.Stdout, reader)
|
|
||||||
|
|
||||||
stdout := newLogWriter("stdout", handleLog)
|
|
||||||
stderr := newLogWriter("stderr", handleLog)
|
|
||||||
stdcopy.StdCopy(stdout, stderr, reader)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newLogWriter(stream string, handle func(string, string)) io.Writer {
|
|
||||||
pr, pw := io.Pipe()
|
|
||||||
go func() {
|
go func() {
|
||||||
scanner := bufio.NewScanner(pr)
|
scanner := bufio.NewScanner(stdoutPR)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
handle(stream, scanner.Text())
|
logschan <- LogType{
|
||||||
|
ContainerName: inspect.Name,
|
||||||
|
Source: "tty",
|
||||||
|
Log: scanner.Text(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return pw
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleLog(t string, b string) {
|
go func() {
|
||||||
fmt.Println("handleLog", t, ":", b)
|
scanner := bufio.NewScanner(stderrPR)
|
||||||
|
for scanner.Scan() {
|
||||||
|
logschan <- LogType{
|
||||||
|
ContainerName: inspect.Name,
|
||||||
|
Source: "tty",
|
||||||
|
Log: scanner.Text(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
stdcopy.StdCopy(stdoutPW, stderrPW, reader)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user