commit
e177a9b22a
@ -0,0 +1,137 @@ |
||||
/* |
||||
Package log implements logging with two levels: info and debug. This distillation implements Dave Cheney's |
||||
recommendation in his blog post, "Let's talk about logging" [1]. The methods provided are intended to mimic |
||||
the most useful parts of the fmt and log standard packages. |
||||
|
||||
The easiest way to use this package is to just call the top-level Print-ish and Debug-ish functions. If you |
||||
need to write to another writer than Stdout, replace Default: |
||||
|
||||
log.Default = log.Writer(myWriter, "[DEBUG]", "[INFO]") |
||||
|
||||
If you want to, say, write to two files for the two levels, implement Interface. For an example, see how |
||||
the Writer function is implemented. |
||||
|
||||
[1] http://dave.cheney.net/2015/11/05/lets-talk-about-logging
|
||||
*/ |
||||
package log |
||||
|
||||
import ( |
||||
"fmt" |
||||
"io" |
||||
"os" |
||||
) |
||||
|
||||
var ( |
||||
// Stdout is os.Stdout wrapped as an Interface.
|
||||
Stdout = Writer(os.Stdout, "[debug]", "[info]") |
||||
|
||||
// Default is a Log that writes to Stdout.
|
||||
Default = Log{Stdout} |
||||
) |
||||
|
||||
// Print writes to the default logger. Arguments are handled in the manner of fmt.Sprint.
|
||||
func Print(v ...interface{}) { |
||||
Default.Print(fmt.Sprint(v...)) |
||||
} |
||||
|
||||
// Printf writes to the default logger. Arguments are handled in the manner of fmt.Sprintf.
|
||||
func Printf(format string, v ...interface{}) { |
||||
Default.Print(fmt.Sprintf(format, v...)) |
||||
} |
||||
|
||||
// Println writes to the default logger. Arguments are handled in the manner of fmt.Sprintln.
|
||||
func Println(v ...interface{}) { |
||||
Default.Print(fmt.Sprintln(v...)) |
||||
} |
||||
|
||||
// Debug writes to the default logger. Arguments are handled in the manner of fmt.Sprint.
|
||||
func Debug(v ...interface{}) { |
||||
Default.Debug(fmt.Sprint(v...)) |
||||
} |
||||
|
||||
// Debugf writes to the default logger. Arguments are handled in the manner of fmt.Sprintf.
|
||||
func Debugf(format string, v ...interface{}) { |
||||
Default.Debug(fmt.Sprintf(format, v...)) |
||||
} |
||||
|
||||
// Debugln writes to the default logger. Arguments are handled in the manner of fmt.Sprintln.
|
||||
func Debugln(v ...interface{}) { |
||||
Default.Debug(fmt.Sprintln(v...)) |
||||
} |
||||
|
||||
// Log provides standard logging methods from a custom Interface. The zero value
|
||||
// uses Stdout.
|
||||
type Log struct { |
||||
Interface |
||||
} |
||||
|
||||
// Print writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprint.
|
||||
func (l Log) Print(v ...interface{}) { |
||||
validInterface(l.Interface).Print(fmt.Sprint(v...)) |
||||
} |
||||
|
||||
// Printf writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprintf.
|
||||
func (l Log) Printf(format string, v ...interface{}) { |
||||
validInterface(l.Interface).Print(fmt.Sprintf(format, v...)) |
||||
} |
||||
|
||||
// Println writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprintln.
|
||||
func (l Log) Println(v ...interface{}) { |
||||
validInterface(l.Interface).Print(fmt.Sprintln(v...)) |
||||
} |
||||
|
||||
// Debug writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprint.
|
||||
func (l Log) Debug(v ...interface{}) { |
||||
validInterface(l.Interface).Debug(fmt.Sprint(v...)) |
||||
} |
||||
|
||||
// Debugf writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprintf.
|
||||
func (l Log) Debugf(format string, v ...interface{}) { |
||||
validInterface(l.Interface).Debug(fmt.Sprintf(format, v...)) |
||||
} |
||||
|
||||
// Debugln writes to l.Interface, or Stdout if l.Interface is nil. Arguments are handled in the manner of fmt.Sprintln.
|
||||
func (l Log) Debugln(v ...interface{}) { |
||||
validInterface(l.Interface).Debug(fmt.Sprintln(v...)) |
||||
} |
||||
|
||||
// validInterface checks if i is nil. If it is, this returns
|
||||
// Stdout, otherwise it returns i.
|
||||
func validInterface(i Interface) Interface { |
||||
if i == nil { |
||||
return Stdout |
||||
} |
||||
|
||||
return i |
||||
} |
||||
|
||||
// Interface is the set of methods implemented by custom loggers for outputting data. An implementation
|
||||
// of Interface could, for instance, write Debug messages to a file and send Print statements both to a
|
||||
// file and to an IRC channel.
|
||||
type Interface interface { |
||||
Print(s string) |
||||
Debug(s string) |
||||
} |
||||
|
||||
// Writer returns an Interface with the given debug and info prefixes that
|
||||
// write to w.
|
||||
func Writer(w io.Writer, debug, info string) Interface { |
||||
return writerInterface{ |
||||
debug: debug, |
||||
info: info, |
||||
w: w, |
||||
} |
||||
} |
||||
|
||||
type writerInterface struct { |
||||
debug, info string |
||||
w io.Writer |
||||
} |
||||
|
||||
func (w writerInterface) Print(v string) { |
||||
fmt.Fprint(w.w, w.info, v) |
||||
} |
||||
|
||||
func (w writerInterface) Debug(v string) { |
||||
fmt.Fprint(w.w, w.debug, v) |
||||
} |
@ -0,0 +1,159 @@ |
||||
# log |
||||
-- |
||||
import "git.stephensearles.com/stephen.searles/log" |
||||
|
||||
Package log implements logging with two levels: info and debug. This |
||||
distillation implements Dave Cheney's recommendation in his blog post, "Let's |
||||
talk about logging" [1]. The methods provided are intended to mimic the most |
||||
useful parts of the fmt and log standard packages. |
||||
|
||||
The easiest way to use this package is to just call the top-level Print-ish and |
||||
Debug-ish functions. If you need to write to another writer than Stdout, replace |
||||
Default: |
||||
|
||||
log.Default = log.Writer(myWriter, "[DEBUG]", "[INFO]") |
||||
|
||||
If you want to, say, write to two files for the two levels, implement Interface. |
||||
For an example, see how the Writer function is implemented. |
||||
|
||||
[1] http://dave.cheney.net/2015/11/05/lets-talk-about-logging |
||||
|
||||
## Usage |
||||
|
||||
```go |
||||
var ( |
||||
// Stdout is os.Stdout wrapped as an Interface. |
||||
Stdout = Writer(os.Stdout, "[debug]", "[info]") |
||||
|
||||
// Default is a Log that writes to Stdout. |
||||
Default = Log{Stdout} |
||||
) |
||||
``` |
||||
|
||||
#### func Debug |
||||
|
||||
```go |
||||
func Debug(v ...interface{}) |
||||
``` |
||||
Debug writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprint. |
||||
|
||||
#### func Debugf |
||||
|
||||
```go |
||||
func Debugf(format string, v ...interface{}) |
||||
``` |
||||
Debugf writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprintf. |
||||
|
||||
#### func Debugln |
||||
|
||||
```go |
||||
func Debugln(v ...interface{}) |
||||
``` |
||||
Debugln writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprintln. |
||||
|
||||
#### func Print |
||||
|
||||
```go |
||||
func Print(v ...interface{}) |
||||
``` |
||||
Print writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprint. |
||||
|
||||
#### func Printf |
||||
|
||||
```go |
||||
func Printf(format string, v ...interface{}) |
||||
``` |
||||
Printf writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprintf. |
||||
|
||||
#### func Println |
||||
|
||||
```go |
||||
func Println(v ...interface{}) |
||||
``` |
||||
Println writes to the default logger. Arguments are handled in the manner of |
||||
fmt.Sprintln. |
||||
|
||||
#### type Interface |
||||
|
||||
```go |
||||
type Interface interface { |
||||
Print(s string) |
||||
Debug(s string) |
||||
} |
||||
``` |
||||
|
||||
Interface is the set of methods implemented by custom loggers for outputting |
||||
data. An implementation of Interface could, for instance, write Debug messages |
||||
to a file and send Print statements both to a file and to an IRC channel. |
||||
|
||||
#### func Writer |
||||
|
||||
```go |
||||
func Writer(w io.Writer, debug, info string) Interface |
||||
``` |
||||
Writer returns an Interface with the given debug and info prefixes that write to |
||||
w. |
||||
|
||||
#### type Log |
||||
|
||||
```go |
||||
type Log struct { |
||||
Interface |
||||
} |
||||
``` |
||||
|
||||
Log provides standard logging methods from a custom Interface. The zero value |
||||
uses Stdout. |
||||
|
||||
#### func (Log) Debug |
||||
|
||||
```go |
||||
func (l Log) Debug(v ...interface{}) |
||||
``` |
||||
Debug writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprint. |
||||
|
||||
#### func (Log) Debugf |
||||
|
||||
```go |
||||
func (l Log) Debugf(format string, v ...interface{}) |
||||
``` |
||||
Debugf writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprintf. |
||||
|
||||
#### func (Log) Debugln |
||||
|
||||
```go |
||||
func (l Log) Debugln(v ...interface{}) |
||||
``` |
||||
Debugln writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprintln. |
||||
|
||||
#### func (Log) Print |
||||
|
||||
```go |
||||
func (l Log) Print(v ...interface{}) |
||||
``` |
||||
Print writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprint. |
||||
|
||||
#### func (Log) Printf |
||||
|
||||
```go |
||||
func (l Log) Printf(format string, v ...interface{}) |
||||
``` |
||||
Printf writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprintf. |
||||
|
||||
#### func (Log) Println |
||||
|
||||
```go |
||||
func (l Log) Println(v ...interface{}) |
||||
``` |
||||
Println writes to l.Interface, or Stdout if l.Interface is nil. Arguments are |
||||
handled in the manner of fmt.Sprintln. |
Loading…
Reference in new issue