package quicreuse
import (
"bufio"
"fmt"
"io"
"os"
"time"
golog "github.com/ipfs/go-log/v2"
"github.com/klauspost/compress/zstd"
"github.com/quic-go/quic-go"
"github.com/quic-go/quic-go/logging"
"github.com/quic-go/quic-go/qlog"
)
var log = golog .Logger ("quic-utils" )
var qlogTracerDir string
func init() {
qlogTracerDir = os .Getenv ("QLOGDIR" )
}
func qloggerForDir(qlogDir string , p logging .Perspective , ci quic .ConnectionID ) *logging .ConnectionTracer {
if err := os .MkdirAll (qlogDir , 0777 ); err != nil {
log .Errorf ("creating the QLOGDIR failed: %s" , err )
return nil
}
return qlog .NewConnectionTracer (newQlogger (qlogDir , p , ci ), p , ci )
}
type qlogger struct {
f *os .File
filename string
*bufio .Writer
}
func newQlogger(qlogDir string , role logging .Perspective , connID quic .ConnectionID ) io .WriteCloser {
t := time .Now ().UTC ().Format ("2006-01-02T15-04-05.999999999UTC" )
r := "server"
if role == logging .PerspectiveClient {
r = "client"
}
finalFilename := fmt .Sprintf ("%s%clog_%s_%s_%s.qlog.zst" , qlogDir , os .PathSeparator , t , r , connID )
filename := fmt .Sprintf ("%s%c.log_%s_%s_%s.qlog.swp" , qlogDir , os .PathSeparator , t , r , connID )
f , err := os .Create (filename )
if err != nil {
log .Errorf ("unable to create qlog file %s: %s" , filename , err )
return nil
}
return &qlogger {
f : f ,
filename : finalFilename ,
Writer : bufio .NewWriterSize (f , 128 <<10 ),
}
}
func (l *qlogger ) Close () error {
defer os .Remove (l .f .Name ())
defer l .f .Close ()
if err := l .Writer .Flush (); err != nil {
return err
}
if _ , err := l .f .Seek (0 , io .SeekStart ); err != nil {
return err
}
f , err := os .Create (l .filename )
if err != nil {
return err
}
defer f .Close ()
buf := bufio .NewWriterSize (f , 128 <<10 )
c , err := zstd .NewWriter (buf , zstd .WithEncoderLevel (zstd .SpeedFastest ), zstd .WithWindowSize (32 *1024 ))
if err != nil {
return err
}
if _ , err := io .Copy (c , l .f ); err != nil {
return err
}
if err := c .Close (); err != nil {
return err
}
return buf .Flush ()
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .