@@ -46,6 +46,8 @@ import (
4646
4747 "cdr.dev/slog"
4848 "cdr.dev/slog/sloggers/sloghuman"
49+ "cdr.dev/slog/sloggers/slogjson"
50+ "cdr.dev/slog/sloggers/slogstackdriver"
4951 "github.com/coder/coder/buildinfo"
5052 "github.com/coder/coder/cli/cliui"
5153 "github.com/coder/coder/cli/config"
@@ -122,13 +124,11 @@ func Server(vip *viper.Viper, newAPI func(context.Context, *coderd.Options) (*co
122124 }
123125
124126 printLogo (cmd )
125- logger := slog .Make (sloghuman .Sink (cmd .ErrOrStderr ()))
126- if ok , _ := cmd .Flags ().GetBool (varVerbose ); ok {
127- logger = logger .Leveled (slog .LevelDebug )
128- }
129- if cfg .Trace .CaptureLogs .Value {
130- logger = logger .AppendSinks (tracing.SlogSink {})
127+ logger , logCloser , err := makeLogger (cmd , cfg )
128+ if err != nil {
129+ return xerrors .Errorf ("make logger: %w" , err )
131130 }
131+ defer logCloser ()
132132
133133 // Register signals early on so that graceful shutdown can't
134134 // be interrupted by additional signals. Note that we avoid
@@ -1145,6 +1145,11 @@ func newProvisionerDaemon(
11451145
11461146// nolint: revive
11471147func printLogo (cmd * cobra.Command ) {
1148+ // Only print the logo in TTYs.
1149+ if ! isTTYOut (cmd ) {
1150+ return
1151+ }
1152+
11481153 _ , _ = fmt .Fprintf (cmd .OutOrStdout (), "%s - Software development on your infrastucture\n " , cliui .Styles .Bold .Render ("Coder " + buildinfo .Version ()))
11491154}
11501155
@@ -1512,3 +1517,64 @@ func redirectHTTPToAccessURL(handler http.Handler, accessURL *url.URL) http.Hand
15121517func isLocalhost (host string ) bool {
15131518 return host == "localhost" || host == "127.0.0.1" || host == "::1"
15141519}
1520+
1521+ func makeLogger (cmd * cobra.Command , cfg * codersdk.DeploymentConfig ) (slog.Logger , func (), error ) {
1522+ var (
1523+ sinks = []slog.Sink {}
1524+ closers = []func () error {}
1525+ )
1526+
1527+ if cfg .Logging .Human .Value != "" {
1528+ if cfg .Logging .Human .Value == "/dev/stderr" {
1529+ sinks = append (sinks , sloghuman .Sink (cmd .ErrOrStderr ()))
1530+ } else {
1531+ fi , err := os .OpenFile (cfg .Logging .Human .Value , os .O_WRONLY | os .O_CREATE | os .O_APPEND , 0644 )
1532+ if err != nil {
1533+ return slog.Logger {}, nil , xerrors .Errorf ("open human log %q: %w" , cfg .Logging .Human .Value , err )
1534+ }
1535+ closers = append (closers , fi .Close )
1536+ sinks = append (sinks , sloghuman .Sink (fi ))
1537+ }
1538+ }
1539+
1540+ if cfg .Logging .JSON .Value != "" {
1541+ if cfg .Logging .JSON .Value == "/dev/stderr" {
1542+ sinks = append (sinks , slogjson .Sink (cmd .ErrOrStderr ()))
1543+ } else {
1544+ fi , err := os .OpenFile (cfg .Logging .JSON .Value , os .O_WRONLY | os .O_CREATE | os .O_APPEND , 0644 )
1545+ if err != nil {
1546+ return slog.Logger {}, nil , xerrors .Errorf ("open json log %q: %w" , cfg .Logging .JSON .Value , err )
1547+ }
1548+ closers = append (closers , fi .Close )
1549+ sinks = append (sinks , slogjson .Sink (fi ))
1550+ }
1551+ }
1552+
1553+ if cfg .Logging .Stackdriver .Value != "" {
1554+ if cfg .Logging .JSON .Value == "/dev/stderr" {
1555+ sinks = append (sinks , slogstackdriver .Sink (cmd .ErrOrStderr ()))
1556+ } else {
1557+ fi , err := os .OpenFile (cfg .Logging .Stackdriver .Value , os .O_WRONLY | os .O_CREATE | os .O_APPEND , 0644 )
1558+ if err != nil {
1559+ return slog.Logger {}, nil , xerrors .Errorf ("open stackdriver log %q: %w" , cfg .Logging .Stackdriver .Value , err )
1560+ }
1561+ closers = append (closers , fi .Close )
1562+ sinks = append (sinks , slogstackdriver .Sink (fi ))
1563+ }
1564+ }
1565+
1566+ if cfg .Trace .CaptureLogs .Value {
1567+ sinks = append (sinks , tracing.SlogSink {})
1568+ }
1569+
1570+ level := slog .LevelInfo
1571+ if ok , _ := cmd .Flags ().GetBool (varVerbose ); ok {
1572+ level = slog .LevelDebug
1573+ }
1574+
1575+ return slog .Make (sinks ... ).Leveled (level ), func () {
1576+ for _ , closer := range closers {
1577+ _ = closer ()
1578+ }
1579+ }, nil
1580+ }
0 commit comments