code.gitea.io/gitea@v1.19.3/modules/log/console.go (about)

     1  // Copyright 2014 The Gogs Authors. All rights reserved.
     2  // Copyright 2019 The Gitea Authors. All rights reserved.
     3  // SPDX-License-Identifier: MIT
     4  
     5  package log
     6  
     7  import (
     8  	"fmt"
     9  	"io"
    10  	"os"
    11  
    12  	"code.gitea.io/gitea/modules/json"
    13  )
    14  
    15  // CanColorStdout reports if we can color the Stdout
    16  // Although we could do terminal sniffing and the like - in reality
    17  // most tools on *nix are happy to display ansi colors.
    18  // We will terminal sniff on Windows in console_windows.go
    19  var CanColorStdout = true
    20  
    21  // CanColorStderr reports if we can color the Stderr
    22  var CanColorStderr = true
    23  
    24  type nopWriteCloser struct {
    25  	w io.WriteCloser
    26  }
    27  
    28  func (n *nopWriteCloser) Write(p []byte) (int, error) {
    29  	return n.w.Write(p)
    30  }
    31  
    32  func (n *nopWriteCloser) Close() error {
    33  	return nil
    34  }
    35  
    36  // ConsoleLogger implements LoggerProvider and writes messages to terminal.
    37  type ConsoleLogger struct {
    38  	WriterLogger
    39  	Stderr bool `json:"stderr"`
    40  }
    41  
    42  // NewConsoleLogger create ConsoleLogger returning as LoggerProvider.
    43  func NewConsoleLogger() LoggerProvider {
    44  	log := &ConsoleLogger{}
    45  	log.NewWriterLogger(&nopWriteCloser{
    46  		w: os.Stdout,
    47  	})
    48  	return log
    49  }
    50  
    51  // Init inits connection writer with json config.
    52  // json config only need key "level".
    53  func (log *ConsoleLogger) Init(config string) error {
    54  	err := json.Unmarshal([]byte(config), log)
    55  	if err != nil {
    56  		return fmt.Errorf("Unable to parse JSON: %w", err)
    57  	}
    58  	if log.Stderr {
    59  		log.NewWriterLogger(&nopWriteCloser{
    60  			w: os.Stderr,
    61  		})
    62  	} else {
    63  		log.NewWriterLogger(log.out)
    64  	}
    65  	return nil
    66  }
    67  
    68  // Content returns the content accumulated in the content provider
    69  func (log *ConsoleLogger) Content() (string, error) {
    70  	return "", fmt.Errorf("not supported")
    71  }
    72  
    73  // Flush when log should be flushed
    74  func (log *ConsoleLogger) Flush() {
    75  }
    76  
    77  // ReleaseReopen causes the console logger to reconnect to os.Stdout
    78  func (log *ConsoleLogger) ReleaseReopen() error {
    79  	if log.Stderr {
    80  		log.NewWriterLogger(&nopWriteCloser{
    81  			w: os.Stderr,
    82  		})
    83  	} else {
    84  		log.NewWriterLogger(&nopWriteCloser{
    85  			w: os.Stdout,
    86  		})
    87  	}
    88  	return nil
    89  }
    90  
    91  // GetName returns the default name for this implementation
    92  func (log *ConsoleLogger) GetName() string {
    93  	return "console"
    94  }
    95  
    96  func init() {
    97  	Register("console", NewConsoleLogger)
    98  }