| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | package logger | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"sync/atomic" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 10:26:54 -06:00
										 |  |  | // LogSystem is implemented by log output devices. | 
					
						
							|  |  |  | // All methods can be called concurrently from multiple goroutines. | 
					
						
							|  |  |  | type LogSystem interface { | 
					
						
							|  |  |  | 	GetLogLevel() LogLevel | 
					
						
							|  |  |  | 	SetLogLevel(i LogLevel) | 
					
						
							|  |  |  | 	LogPrint(LogLevel, string) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | // NewStdLogSystem creates a LogSystem that prints to the given writer. | 
					
						
							|  |  |  | // The flag values are defined package log. | 
					
						
							|  |  |  | func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem { | 
					
						
							|  |  |  | 	logger := log.New(writer, "", flags) | 
					
						
							|  |  |  | 	return &stdLogSystem{logger, uint32(level)} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type stdLogSystem struct { | 
					
						
							|  |  |  | 	logger *log.Logger | 
					
						
							|  |  |  | 	level  uint32 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *stdLogSystem) LogPrint(level LogLevel, msg string) { | 
					
						
							|  |  |  | 	t.logger.Print(msg) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *stdLogSystem) SetLogLevel(i LogLevel) { | 
					
						
							|  |  |  | 	atomic.StoreUint32(&t.level, uint32(i)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *stdLogSystem) GetLogLevel() LogLevel { | 
					
						
							|  |  |  | 	return LogLevel(atomic.LoadUint32(&t.level)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-21 10:16:15 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | // NewRawLogSystem creates a LogSystem that prints to the given writer without | 
					
						
							|  |  |  | // adding extra information. Suitable for preformatted output | 
					
						
							|  |  |  | func NewRawLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem { | 
					
						
							|  |  |  | 	logger := log.New(writer, "", 0) | 
					
						
							|  |  |  | 	return &rawLogSystem{logger, uint32(level)} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type rawLogSystem struct { | 
					
						
							|  |  |  | 	logger *log.Logger | 
					
						
							|  |  |  | 	level  uint32 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *rawLogSystem) LogPrint(level LogLevel, msg string) { | 
					
						
							|  |  |  | 	t.logger.Print(msg) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *rawLogSystem) SetLogLevel(i LogLevel) { | 
					
						
							|  |  |  | 	atomic.StoreUint32(&t.level, uint32(i)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t *rawLogSystem) GetLogLevel() LogLevel { | 
					
						
							|  |  |  | 	return LogLevel(atomic.LoadUint32(&t.level)) | 
					
						
							|  |  |  | } |