@ -576,37 +576,18 @@ func NewWithConfigPath(collection, dir, cmdName string, netMon *netmon.Monitor,
if envknob . NoLogsNoSupport ( ) || testenv . InTest ( ) {
if envknob . NoLogsNoSupport ( ) || testenv . InTest ( ) {
logf ( "You have disabled logging. Tailscale will not be able to provide support." )
logf ( "You have disabled logging. Tailscale will not be able to provide support." )
conf . HTTPC = & http . Client { Transport : noopPretendSuccessTransport { } }
conf . HTTPC = & http . Client { Transport : noopPretendSuccessTransport { } }
} else if val := getLogTarget ( ) ; val != "" {
} else {
// Only attach an on-disk filch buffer if we are going to be sending logs.
// No reason to persist them locally just to drop them later.
attachFilchBuffer ( & conf , dir , cmdName , logf )
if val := getLogTarget ( ) ; val != "" {
logf ( "You have enabled a non-default log target. Doing without being told to by Tailscale staff or your network administrator will make getting support difficult." )
logf ( "You have enabled a non-default log target. Doing without being told to by Tailscale staff or your network administrator will make getting support difficult." )
conf . BaseURL = val
conf . BaseURL = val
u , _ := url . Parse ( val )
u , _ := url . Parse ( val )
conf . HTTPC = & http . Client { Transport : NewLogtailTransport ( u . Host , netMon , health , logf ) }
conf . HTTPC = & http . Client { Transport : NewLogtailTransport ( u . Host , netMon , health , logf ) }
}
}
filchOptions := filch . Options {
ReplaceStderr : redirectStderrToLogPanics ( ) ,
}
filchPrefix := filepath . Join ( dir , cmdName )
// NAS disks cannot hibernate if we're writing logs to them all the time.
// https://github.com/tailscale/tailscale/issues/3551
if runtime . GOOS == "linux" && ( distro . Get ( ) == distro . Synology || distro . Get ( ) == distro . QNAP ) {
tmpfsLogs := "/tmp/tailscale-logs"
if err := os . MkdirAll ( tmpfsLogs , 0755 ) ; err == nil {
filchPrefix = filepath . Join ( tmpfsLogs , cmdName )
filchOptions . MaxFileSize = 1 << 20
} else {
// not a fatal error, we can leave the log files on the spinning disk
logf ( "Unable to create /tmp directory for log storage: %v\n" , err )
}
}
filchBuf , filchErr := filch . New ( filchPrefix , filchOptions )
if filchBuf != nil {
conf . Buffer = filchBuf
if filchBuf . OrigStderr != nil {
conf . Stderr = filchBuf . OrigStderr
}
}
}
lw := logtail . NewLogger ( conf , logf )
lw := logtail . NewLogger ( conf , logf )
@ -631,9 +612,6 @@ func NewWithConfigPath(collection, dir, cmdName string, netMon *netmon.Monitor,
goVersion ( ) ,
goVersion ( ) ,
os . Args )
os . Args )
logf ( "LogID: %v" , newc . PublicID )
logf ( "LogID: %v" , newc . PublicID )
if filchErr != nil {
logf ( "filch failed: %v" , filchErr )
}
if earlyErrBuf . Len ( ) != 0 {
if earlyErrBuf . Len ( ) != 0 {
logf ( "%s" , earlyErrBuf . Bytes ( ) )
logf ( "%s" , earlyErrBuf . Bytes ( ) )
}
}
@ -645,6 +623,40 @@ func NewWithConfigPath(collection, dir, cmdName string, netMon *netmon.Monitor,
}
}
}
}
// attachFilchBuffer creates an on-disk ring buffer using filch and attaches
// it to the logtail config. Note that this is optional; if no buffer is set,
// logtail will use an in-memory buffer.
func attachFilchBuffer ( conf * logtail . Config , dir , cmdName string , logf logger . Logf ) {
filchOptions := filch . Options {
ReplaceStderr : redirectStderrToLogPanics ( ) ,
}
filchPrefix := filepath . Join ( dir , cmdName )
// NAS disks cannot hibernate if we're writing logs to them all the time.
// https://github.com/tailscale/tailscale/issues/3551
if runtime . GOOS == "linux" && ( distro . Get ( ) == distro . Synology || distro . Get ( ) == distro . QNAP ) {
tmpfsLogs := "/tmp/tailscale-logs"
if err := os . MkdirAll ( tmpfsLogs , 0755 ) ; err == nil {
filchPrefix = filepath . Join ( tmpfsLogs , cmdName )
filchOptions . MaxFileSize = 1 << 20
} else {
// not a fatal error, we can leave the log files on the spinning disk
logf ( "Unable to create /tmp directory for log storage: %v\n" , err )
}
}
filchBuf , filchErr := filch . New ( filchPrefix , filchOptions )
if filchBuf != nil {
conf . Buffer = filchBuf
if filchBuf . OrigStderr != nil {
conf . Stderr = filchBuf . OrigStderr
}
}
if filchErr != nil {
logf ( "filch failed: %v" , filchErr )
}
}
// dialLog is used by NewLogtailTransport to log the happy path of its
// dialLog is used by NewLogtailTransport to log the happy path of its
// own dialing.
// own dialing.
//
//