openreplay/backend/internal/sink/sessionwriter/file.go
Alexander 45c956c489
Json logs format (#1952)
* feat(backend): try a new approach for logs formatting (http)

* feat(backend): added logger module

* feat(backend): added project/session info to /i endpoint

* feat(backend): found a solution for correct caller information

* feat(backend): finished logs for http handlers

* feat(backend): finished logs for mobile http handlers

* feat(backend): finished ender

* feat(backend): finished assets

* feat(backend): finished heuristics

* feat(backend): finished image-storage

* feat(backend): finished sink

* feat(backend): finished storage

* feat(backend): formatted logs in all services

* feat(backend): finished foss part

* feat(backend): added missed foss part

* feat(backend): fixed panic in memory manager and sink service

* feat(backend): connectors
2024-03-14 12:51:14 +01:00

74 lines
1.3 KiB
Go

package sessionwriter
import (
"bufio"
"io"
"os"
)
type File struct {
file *os.File
buffer *bufio.Writer
updated bool
}
func NewFile(path string, bufSize int) (*File, error) {
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
return nil, err
}
return &File{
file: file,
buffer: bufio.NewWriterSize(file, bufSize),
updated: false,
}, nil
}
func (f *File) Write(data []byte) error {
f.updated = true
if len(data) > f.buffer.Available()+f.buffer.Size() {
// Flush buffer to file
for i := 0; i < 3; i++ {
err := f.buffer.Flush()
if err == nil {
break
}
}
// Write big message directly to file
return f.write(f.file, data)
}
return f.write(f.buffer, data)
}
func (f *File) write(w io.Writer, data []byte) error {
leftToWrite := len(data)
for leftToWrite > 0 {
from := len(data) - leftToWrite
writtenDown, err := w.Write(data[from:])
if err != nil {
return err
}
leftToWrite -= writtenDown
}
return nil
}
func (f *File) Sync() error {
if !f.updated {
return nil
}
if err := f.buffer.Flush(); err != nil {
return err
}
if err := f.file.Sync(); err != nil {
return err
}
f.updated = false
return nil
}
func (f *File) Close() error {
_ = f.buffer.Flush()
_ = f.file.Sync()
return f.file.Close()
}