| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |