@@ -334,7 +334,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
334
334
)
335
335
if cfg .AccessURL .String () == "" {
336
336
cliui .Infof (inv .Stderr , "Opening tunnel so workspaces can connect to your deployment. For production scenarios, specify an external access URL" )
337
- tunnel , err = devtunnel .New (ctx , logger .Named ("devtunnel" ), cfg .WgtunnelHost .String ())
337
+ tunnel , err = devtunnel .New (ctx , logger .Named ("net. devtunnel" ), cfg .WgtunnelHost .String ())
338
338
if err != nil {
339
339
return xerrors .Errorf ("create tunnel: %w" , err )
340
340
}
@@ -1751,6 +1751,50 @@ func IsLocalhost(host string) bool {
1751
1751
return host == "localhost" || host == "127.0.0.1" || host == "::1"
1752
1752
}
1753
1753
1754
+ var _ slog.Sink = & filterSink {}
1755
+
1756
+ type filterSink struct {
1757
+ next []slog.Sink
1758
+ re * regexp.Regexp
1759
+ }
1760
+
1761
+ func (f * filterSink ) compile (res []string ) error {
1762
+ if len (res ) == 0 {
1763
+ return nil
1764
+ }
1765
+
1766
+ var reb strings.Builder
1767
+ for i , re := range res {
1768
+ _ , _ = fmt .Fprintf (& reb , "(%s)" , re )
1769
+ if i != len (res )- 1 {
1770
+ _ , _ = reb .WriteRune ('|' )
1771
+ }
1772
+ }
1773
+
1774
+ re , err := regexp .Compile (reb .String ())
1775
+ if err != nil {
1776
+ return xerrors .Errorf ("compile regex: %w" , err )
1777
+ }
1778
+ f .re = re
1779
+ return nil
1780
+ }
1781
+
1782
+ func (f * filterSink ) LogEntry (ctx context.Context , ent slog.SinkEntry ) {
1783
+ logName := strings .Join (ent .LoggerNames , "." )
1784
+ if f .re != nil && ! f .re .MatchString (logName ) {
1785
+ return
1786
+ }
1787
+ for _ , sink := range f .next {
1788
+ sink .LogEntry (ctx , ent )
1789
+ }
1790
+ }
1791
+
1792
+ func (f * filterSink ) Sync () {
1793
+ for _ , sink := range f .next {
1794
+ sink .Sync ()
1795
+ }
1796
+ }
1797
+
1754
1798
func BuildLogger (inv * clibase.Invocation , cfg * codersdk.DeploymentValues ) (slog.Logger , func (), error ) {
1755
1799
var (
1756
1800
sinks = []slog.Sink {}
@@ -1795,16 +1839,25 @@ func BuildLogger(inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (slog.
1795
1839
sinks = append (sinks , tracing.SlogSink {})
1796
1840
}
1797
1841
1798
- level := slog .LevelInfo
1799
- if cfg .Verbose {
1800
- level = slog .LevelDebug
1801
- }
1802
-
1842
+ // User should log to null device if they don't want logs.
1803
1843
if len (sinks ) == 0 {
1804
1844
return slog.Logger {}, nil , xerrors .New ("no loggers provided" )
1805
1845
}
1806
1846
1807
- return slog .Make (sinks ... ).Leveled (level ), func () {
1847
+ filter := & filterSink {next : sinks }
1848
+
1849
+ err = filter .compile (cfg .Logging .Filter .Value ())
1850
+ if err != nil {
1851
+ return slog.Logger {}, nil , xerrors .Errorf ("compile filters: %w" , err )
1852
+ }
1853
+
1854
+ level := slog .LevelInfo
1855
+ // Debug logging is always enabled if a filter is present.
1856
+ if cfg .Verbose || filter .re != nil {
1857
+ level = slog .LevelDebug
1858
+ }
1859
+
1860
+ return slog .Make (filter ).Leveled (level ), func () {
1808
1861
for _ , closer := range closers {
1809
1862
_ = closer ()
1810
1863
}
0 commit comments