forked from mirrors/gotosocial
07727753b9
* Add whereNotEmptyAndNotNull * Add GetRemoteOlderThanDays * Add GetRemoteOlderThanDays * Add PruneRemote to Manager interface * Start implementing PruneRemote * add new attachment + status to tests * fix up and test GetRemoteOlderThan * fix bad import * PruneRemote: return number pruned * add Cached column to mediaattachment * update + test pruneRemote * update mediaTest * use Cached column * upstep bun to latest version * embed structs in mediaAttachment * migrate mediaAttachment to new format * don't default cached to true * select only remote media * update db dependencies * step bun back to last working version * update pruneRemote to use Cached field * fix storage path of test attachments * add recache logic to manager * fix trimmed aspect ratio * test prune and recache * return errwithcode * tidy up different paths for emoji vs attachment * fix incorrect thumbnail type being stored * expose TransportController to media processor * implement tee-ing recached content * add thoughts of dog to test fedi attachments * test get remote files * add comment on PruneRemote * add postData cleanup to recache * test thumbnail fetching * add incredible diagram * go mod tidy * buffer pipes for recache streaming * test for client stops reading after 1kb * add media-remote-cache-days to config * add cron package * wrap logrus so it's available to cron * start and stop cron jobs gracefully
86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
package cron
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// DefaultLogger is used by Cron if none is specified.
|
|
var DefaultLogger Logger = PrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))
|
|
|
|
// DiscardLogger can be used by callers to discard all log messages.
|
|
var DiscardLogger Logger = PrintfLogger(log.New(ioutil.Discard, "", 0))
|
|
|
|
// Logger is the interface used in this package for logging, so that any backend
|
|
// can be plugged in. It is a subset of the github.com/go-logr/logr interface.
|
|
type Logger interface {
|
|
// Info logs routine messages about cron's operation.
|
|
Info(msg string, keysAndValues ...interface{})
|
|
// Error logs an error condition.
|
|
Error(err error, msg string, keysAndValues ...interface{})
|
|
}
|
|
|
|
// PrintfLogger wraps a Printf-based logger (such as the standard library "log")
|
|
// into an implementation of the Logger interface which logs errors only.
|
|
func PrintfLogger(l interface{ Printf(string, ...interface{}) }) Logger {
|
|
return printfLogger{l, false}
|
|
}
|
|
|
|
// VerbosePrintfLogger wraps a Printf-based logger (such as the standard library
|
|
// "log") into an implementation of the Logger interface which logs everything.
|
|
func VerbosePrintfLogger(l interface{ Printf(string, ...interface{}) }) Logger {
|
|
return printfLogger{l, true}
|
|
}
|
|
|
|
type printfLogger struct {
|
|
logger interface{ Printf(string, ...interface{}) }
|
|
logInfo bool
|
|
}
|
|
|
|
func (pl printfLogger) Info(msg string, keysAndValues ...interface{}) {
|
|
if pl.logInfo {
|
|
keysAndValues = formatTimes(keysAndValues)
|
|
pl.logger.Printf(
|
|
formatString(len(keysAndValues)),
|
|
append([]interface{}{msg}, keysAndValues...)...)
|
|
}
|
|
}
|
|
|
|
func (pl printfLogger) Error(err error, msg string, keysAndValues ...interface{}) {
|
|
keysAndValues = formatTimes(keysAndValues)
|
|
pl.logger.Printf(
|
|
formatString(len(keysAndValues)+2),
|
|
append([]interface{}{msg, "error", err}, keysAndValues...)...)
|
|
}
|
|
|
|
// formatString returns a logfmt-like format string for the number of
|
|
// key/values.
|
|
func formatString(numKeysAndValues int) string {
|
|
var sb strings.Builder
|
|
sb.WriteString("%s")
|
|
if numKeysAndValues > 0 {
|
|
sb.WriteString(", ")
|
|
}
|
|
for i := 0; i < numKeysAndValues/2; i++ {
|
|
if i > 0 {
|
|
sb.WriteString(", ")
|
|
}
|
|
sb.WriteString("%v=%v")
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
// formatTimes formats any time.Time values as RFC3339.
|
|
func formatTimes(keysAndValues []interface{}) []interface{} {
|
|
var formattedArgs []interface{}
|
|
for _, arg := range keysAndValues {
|
|
if t, ok := arg.(time.Time); ok {
|
|
arg = t.Format(time.RFC3339)
|
|
}
|
|
formattedArgs = append(formattedArgs, arg)
|
|
}
|
|
return formattedArgs
|
|
}
|