Skip to content

Latest commit

 

History

History
259 lines (204 loc) · 9.59 KB

File metadata and controls

259 lines (204 loc) · 9.59 KB

13.4 Logs and configurations

Registros y configuraciones

La importancia de los registros y la configuración

Se ha introducido en el registro en el desarrollo de nuestro programa juega un papel muy importante, a través del registro de depuración podemos grabar nuestra información, se había introducido un sistema de registro seelog, dependiendo del nivel de registro de salida diferente de este programa para el desarrollo y despliegue del programa es crucial. Podemos establecer el nivel en el desarrollo de programas de bajo punto, cuando el nivel se ajusta a desplegar alta, por lo que desarrolló la información de depuración se puede enmascarar.

Módulo de configuración para la implementación de aplicaciones implica una serie de información de configuración de servidor diferente es muy útil, por ejemplo, la información de configuración de base de datos, puerto de monitor, escuche dirección, etc todo se puede configurar a través del archivo de configuración, de modo que nuestra aplicación tendrá una gran flexibilidad , el archivo de configuración se puede configurar para ser desplegados en diferentes máquinas, puede conectar diferentes bases de datos y similares.

Beego log design

beego deploymentBeego diseño el registro de la implementación de beego seelog, dependiendo del nivel para el registro, pero beego diseño del sistema de registro relativamente ligero, el uso de las interfaces log.Logger sistema, la salida por defecto para os.Stdout, los usuarios pueden implementar esta interfaz después a través beego. SetLogger establecido salida personalizado, implementación detallado es el siguiente:

// Los niveles de registro para controlar la salida del registro.
const (
	LevelTrace = iota
	LevelDebug
	LevelInfo
	LevelWarning
	LevelError
	LevelCritical
)

// LogLevel controla el nivel de registro global utilizada por el registrador.
var level = LevelTrace

// LogLevel devuelve el nivel de registro global y se puede utilizar en
// Propias implementaciones de la interfaz del registrador.
func Level() int {
	return level
}

// SetLogLevel establece el nivel de registro global utilizada por el simple
// logger.
func SetLevel(l int) {
	level = l
}

En esta sección se implementa el sistema de clasificación de páginas Registro anterior, el nivel predeterminado es el de seguimiento, los usuarios pueden configurar diferentes setLevel clasificación.

// Logger hace referencia al registrador de la aplicación utilizada.
var BeeLogger = log.New(os.Stdout, "", log.Ldate|log.Ltime)

// SetLogger establece un nuevo registrador.
func SetLogger(l *log.Logger) {
	BeeLogger = l
}

// Trace registra un mensaje a nivel de trazas.
func Trace(v ...interface{}) {
	if level <= LevelTrace {
		BeeLogger.Printf("[T] %v\n", v)
	}
}

// Debug registra un mensaje en el nivel de depuración.
func Debug(v ...interface{}) {
	if level <= LevelDebug {
		BeeLogger.Printf("[D] %v\n", v)
	}
}

// Información registra un mensaje en el nivel de información.
func Info(v ...interface{}) {
	if level <= LevelInfo {
		BeeLogger.Printf("[I] %v\n", v)
	}
}

// Advertencia registra un mensaje en el nivel de alerta.
func Warn(v ...interface{}) {
	if level <= LevelWarning {
		BeeLogger.Printf("[W] %v\n", v)
	}
}

//  Error registra un mensaje de error en el nivel.
func Error(v ...interface{}) {
	if level <= LevelError {
		BeeLogger.Printf("[E] %v\n", v)
	}
}

// Errores críticos registra un mensaje en el nivel crítico.
func Critical(v ...interface{}) {
	if level <= LevelCritical {
		BeeLogger.Printf("[C] %v\n", v)
	}
}

Por encima de esta pieza de código inicializa un objeto predeterminado BeeLogger, la salida por defecto para os.Stdout, los usuarios pueden lograr un registrador beego.SetLogger para ajustar la salida de la interfaz. ¿Cuáles son para alcanzar las seis funciones::

  • Seguimiento (información del registro general, por ejemplo de la siguiente :)

    • "Bloque de función de análisis de validación introducido"
    • "Validación: entró segundo 'si'"
    • "Diccionario" Dict "está vacía. Utilizando el valor predeterminado"
  • Depuración (información de depuración, por ejemplo, como sigue :)

    • "La página Web solicitada: http://somesite.com Params = '...' "
    • "Respuesta generada tamaño Respuesta:. 10000 Envío".
    • "Nuevo archivo recibido Type:. Png Tamaño: 20000"
  • Info (información de impresión, por ejemplo, como sigue :)

    • "Servidor web reiniciado"
    • "Estadísticas por Horas: páginas solicitadas: 12345 Errores: 123 ..."
    • "Servicio de pausa. Esperando a 'curriculum vitae' llamar"
  • Advierta (mensajes de advertencia, por ejemplo, como sigue :)

    • "Caché corrompe por archivo = 'test.file'. Leyendo de back-end"
    • "192.168.0.7/DB Database no responde. Uso de la copia de seguridad 192.168.0.8/DB"
    • "No hay respuesta del servidor de estadísticas. Las estadísticas no envió"
  • De error (mensajes de error, por ejemplo, como sigue :)

    • ". Error interno No se puede procesar la solicitud # 12345 Error: ...."
    • "No se puede realizar de inicio de sesión: credenciales no db responder"
  • Crítica (error grave, por ejemplo, como sigue :)

    • "Pánico crítico recibido: .... Apagado"
    • "Fatal error: ... App está cerrando para evitar la corrupción o pérdida de datos"

Cada función se puede ver en el nivel de sentencia firme, con, por lo que si nos fijamos en el nivel de tiempo de despliegue = LevelWarning, a continuación, Trace, Debug Info no tendrá ninguna de estas tres funciones de salida, y así sucesivamente.

Beego diseño de configuración

La información de configuración del análisis, beego implementa una tecla = Archivo de configuración de valor de lectura, el formato de archivo similar configuración ini es un proceso de análisis de archivos, y luego analizar los datos guardados en el mapa, la última vez que la llamada a través de la cadena varias, int tipo de llamada de función devuelve el valor correspondiente, consulte la siguiente aplicación específica:

Primero defina algún archivo de configuración ini algunas constantes globales:

var (
	bComment = []byte{'#'}
	bEmpty   = []byte{}
	bEqual   = []byte{'='}
	bDQuote  = []byte{'"'}
)

Define el formato del archivo de configuración:

//  config representa la configuración..
type Config struct {
	filename string
	comment  map[int][]string  // id: []{comment, key...}; id 1 is for main comment.
	data     map[string]string // key: value
	offset   map[string]int64  // key: offset; for editing.
	sync.RWMutex
}

Define una función analiza el archivo, analiza el archivo del proceso es abrir el archivo y, a continuación, leer línea por línea, analizar los comentarios, líneas en blanco y tecla = Valor de datos:

// ParseFile crea una nueva configuración y analiza la configuración del archivo de la
// nombre del archivo.
func LoadConfig(name string) (*Config, error) {
	file, err := os.Open(name)
	if err != nil {
		return nil, err
	}

	cfg := &Config{
		file.Name(),
		make(map[int][]string),
		make(map[string]string),
		make(map[string]int64),
		sync.RWMutex{},
	}
	cfg.Lock()
	defer cfg.Unlock()
	defer file.Close()

	var comment bytes.Buffer
	buf := bufio.NewReader(file)

	for nComment, off := 0, int64(1); ; {
		line, _, err := buf.ReadLine()
		if err == io.EOF {
			break
		}
		if bytes.Equal(line, bEmpty) {
			continue
		}

		off += int64(len(line))

		if bytes.HasPrefix(line, bComment) {
			line = bytes.TrimLeft(line, "#")
			line = bytes.TrimLeftFunc(line, unicode.IsSpace)
			comment.Write(line)
			comment.WriteByte('\n')
			continue
		}
		if comment.Len() != 0 {
			cfg.comment[nComment] = []string{comment.String()}
			comment.Reset()
			nComment++
		}

		val := bytes.SplitN(line, bEqual, 2)
		if bytes.HasPrefix(val[1], bDQuote) {
			val[1] = bytes.Trim(val[1], `"`)
		}

		key := strings.TrimSpace(string(val[0]))
		cfg.comment[nComment-1] = append(cfg.comment[nComment-1], key)
		cfg.data[key] = strings.TrimSpace(string(val[1]))
		cfg.offset[key] = off
	}
	return cfg, nil
}

Debajo lee el archivo de configuración para lograr una serie de funciones, el valor de retorno se determina como bool, int, float64 o cadena:

// Bool returns the boolean value for a given key.
func (c *Config) Bool(key string) (bool, error) {
	return strconv.ParseBool(c.data[key])
}

// Int returns the integer value for a given key.
func (c *Config) Int(key string) (int, error) {
	return strconv.Atoi(c.data[key])
}

// Float returns the float value for a given key.
func (c *Config) Float(key string) (float64, error) {
	return strconv.ParseFloat(c.data[key], 64)
}

// String returns the string value for a given key.
func (c *Config) String(key string) string {
	return c.data[key]
}

Guía de aplicación

La función siguiente es un ejemplo de la aplicación, para acceder a URL remota datos de dirección JSON para lograr lo siguiente:

func GetJson() {
	resp, err := http.Get(beego.AppConfig.String("url"))
	if err != nil {
		beego.Critical("http get info error")
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	err = json.Unmarshal(body, &AllInfo)
	if err != nil {
		beego.Critical("error:", err)
	}
}

Función llama el marco de la función de registrobeego.Critical función se utiliza para empezar, llamado beego.AppConfig.String(" url ") se utiliza para obtener la información de configuración en el archivo, los archivos de configuración son los siguientes (app.conf ):

appname = hs
url ="http://www.api.com/api.html"

Links