| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2015-03-21 09:20:47 +00:00
										 |  |  | 	LogPrint(LogMsg) | 
					
						
							| 
									
										
										
										
											2015-01-21 10:26:54 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) *StdLogSystem { | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | 	logger := log.New(writer, "", flags) | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | 	return &StdLogSystem{logger, uint32(level)} | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | type StdLogSystem struct { | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | 	logger *log.Logger | 
					
						
							|  |  |  | 	level  uint32 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | func (t *StdLogSystem) LogPrint(msg LogMsg) { | 
					
						
							| 
									
										
										
										
											2015-03-21 09:20:47 +00:00
										 |  |  | 	stdmsg, ok := msg.(stdMsg) | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		if t.GetLogLevel() >= stdmsg.Level() { | 
					
						
							|  |  |  | 			t.logger.Print(stdmsg.String()) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | func (t *StdLogSystem) SetLogLevel(i LogLevel) { | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | 	atomic.StoreUint32(&t.level, uint32(i)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 17:08:49 +00:00
										 |  |  | func (t *StdLogSystem) GetLogLevel() LogLevel { | 
					
						
							| 
									
										
										
										
											2015-01-21 10:04:11 -06:00
										 |  |  | 	return LogLevel(atomic.LoadUint32(&t.level)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-21 10:16:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 09:20:47 +00:00
										 |  |  | // NewJSONLogSystem creates a LogSystem that prints to the given writer without | 
					
						
							|  |  |  | // adding extra information irrespective of loglevel only if message is JSON type | 
					
						
							|  |  |  | func NewJsonLogSystem(writer io.Writer) LogSystem { | 
					
						
							| 
									
										
										
										
											2015-01-21 10:16:15 -06:00
										 |  |  | 	logger := log.New(writer, "", 0) | 
					
						
							| 
									
										
										
										
											2015-03-21 09:20:47 +00:00
										 |  |  | 	return &jsonLogSystem{logger} | 
					
						
							| 
									
										
										
										
											2015-03-21 07:26:44 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type jsonLogSystem struct { | 
					
						
							|  |  |  | 	logger *log.Logger | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 09:20:47 +00:00
										 |  |  | func (t *jsonLogSystem) LogPrint(msg LogMsg) { | 
					
						
							|  |  |  | 	jsonmsg, ok := msg.(jsonMsg) | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		t.logger.Print(jsonmsg.String()) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-21 07:26:44 +01:00
										 |  |  | } |