safing-portmaster/base/log/formatting.go
Daniel Hååvi 80664d1a27
Restructure modules (#1572)
* Move portbase into monorepo

* Add new simple module mgr

* [WIP] Switch to new simple module mgr

* Add StateMgr and more worker variants

* [WIP] Switch more modules

* [WIP] Switch more modules

* [WIP] swtich more modules

* [WIP] switch all SPN modules

* [WIP] switch all service modules

* [WIP] Convert all workers to the new module system

* [WIP] add new task system to module manager

* [WIP] Add second take for scheduling workers

* [WIP] Add FIXME for bugs in new scheduler

* [WIP] Add minor improvements to scheduler

* [WIP] Add new worker scheduler

* [WIP] Fix more bug related to new module system

* [WIP] Fix start handing of the new module system

* [WIP] Improve startup process

* [WIP] Fix minor issues

* [WIP] Fix missing subsystem in settings

* [WIP] Initialize managers in constructor

* [WIP] Move module event initialization to constrictors

* [WIP] Fix setting for enabling and disabling the SPN module

* [WIP] Move API registeration into module construction

* [WIP] Update states mgr for all modules

* [WIP] Add CmdLine operation support

* Add state helper methods to module group and instance

* Add notification and module status handling to status package

* Fix starting issues

* Remove pilot widget and update security lock to new status data

* Remove debug logs

* Improve http server shutdown

* Add workaround for cleanly shutting down firewall+netquery

* Improve logging

* Add syncing states with notifications for new module system

* Improve starting, stopping, shutdown; resolve FIXMEs/TODOs

* [WIP] Fix most unit tests

* Review new module system and fix minor issues

* Push shutdown and restart events again via API

* Set sleep mode via interface

* Update example/template module

* [WIP] Fix spn/cabin unit test

* Remove deprecated UI elements

* Make log output more similar for the logging transition phase

* Switch spn hub and observer cmds to new module system

* Fix log sources

* Make worker mgr less error prone

* Fix tests and minor issues

* Fix observation hub

* Improve shutdown and restart handling

* Split up big connection.go source file

* Move varint and dsd packages to structures repo

* Improve expansion test

* Fix linter warnings

* Fix interception module on windows

* Fix linter errors

---------

Co-authored-by: Vladimir Stoilov <vladimir@safing.io>
2024-08-09 18:15:48 +03:00

158 lines
2.6 KiB
Go

package log
import (
"fmt"
"time"
)
var counter uint16
const (
maxCount uint16 = 999
timeFormat string = "2006-01-02 15:04:05.000"
)
func (s Severity) String() string {
switch s {
case TraceLevel:
return "TRC"
case DebugLevel:
return "DBG"
case InfoLevel:
return "INF"
case WarningLevel:
return "WRN"
case ErrorLevel:
return "ERR"
case CriticalLevel:
return "CRT"
default:
return "NON"
}
}
func formatLine(line *logLine, duplicates uint64, useColor bool) string {
var colorStart, colorEnd, colorDim, colorEndDim string
if useColor {
colorStart = line.level.color()
colorEnd = endColor()
colorDim = dimColor()
colorEndDim = endDimColor()
}
counter++
var fLine string
if line.line == 0 {
fLine = fmt.Sprintf(
"%s%s%s %s%s%s %s? %s %03d%s%s %s",
colorDim,
line.timestamp.Format(timeFormat),
colorEndDim,
colorStart,
line.level.String(),
colorEnd,
colorDim,
rightArrow,
counter,
formatDuplicates(duplicates),
colorEndDim,
line.msg,
)
} else {
fLen := len(line.file)
fPartStart := fLen - 10
if fPartStart < 0 {
fPartStart = 0
}
fLine = fmt.Sprintf(
"%s%s%s %s%s%s %s%s:%03d %s %03d%s%s %s",
colorDim,
line.timestamp.Format(timeFormat),
colorEndDim,
colorStart,
line.level.String(),
colorEnd,
colorDim,
line.file[fPartStart:],
line.line,
rightArrow,
counter,
formatDuplicates(duplicates),
colorEndDim,
line.msg,
)
}
if line.tracer != nil {
// append full trace time
if len(line.tracer.logs) > 0 {
fLine += fmt.Sprintf(" Σ=%s", line.timestamp.Sub(line.tracer.logs[0].timestamp))
}
// append all trace actions
var d time.Duration
for i, action := range line.tracer.logs {
// set color
if useColor {
colorStart = action.level.color()
}
// set filename length
fLen := len(action.file)
fPartStart := fLen - 10
if fPartStart < 0 {
fPartStart = 0
}
// format
if i == len(line.tracer.logs)-1 { // last
d = line.timestamp.Sub(action.timestamp)
} else {
d = line.tracer.logs[i+1].timestamp.Sub(action.timestamp)
}
fLine += fmt.Sprintf(
"\n%s%23s%s %s%s%s %s%s:%03d %s%s %s",
colorDim,
d,
colorEndDim,
colorStart,
action.level.String(),
colorEnd,
colorDim,
action.file[fPartStart:],
action.line,
rightArrow,
colorEndDim,
action.msg,
)
}
}
if counter >= maxCount {
counter = 0
}
return fLine
}
func formatDuplicates(duplicates uint64) string {
if duplicates == 0 {
return ""
}
return fmt.Sprintf(" [%dx]", duplicates+1)
}