- Cree un solo registro. ¿Logger y distribuirlo?
Eso es posible. Un log.Logger se puede utilizar simultáneamente desde múltiples goroutines.
- Pase un puntero a ese registro.
log.New devuelve un *Logger
que suele ser una indicación de que debe pasar el objeto como puntero. Pasarlo como valor crearía una copia de la estructura (es decir, una copia del Logger) y luego múltiples goroutines podrían escribir en el mismo io.Writer simultáneamente. Eso podría ser un problema serio, dependiendo de la implementación del escritor.
- ¿Cada gorutina o función debe crear un registrador?
No crearía un registrador separado para cada función o goroutine. Goroutines (y funciones) se utilizan para tareas muy ligeras que no justificarán el mantenimiento de un registrador separado. Probablemente sea una buena idea crear un registrador para cada componente más grande de su proyecto. Por ejemplo, si su proyecto utiliza un servicio SMTP para enviar correos, la creación de un registrador separado para el servicio de correo parece una buena idea para que pueda filtrar y apagar la salida por separado.
- ¿Debo crear el registrador como una variable global?
Eso depende de tu paquete. En el ejemplo de servicio de correo anterior, probablemente sería una buena idea tener un registrador para cada instancia de su servicio, de modo que los usuarios puedan registrar fallas mientras usan el servicio de correo de Gmail de manera diferente a las fallas que ocurrieron al usar el MTA local (por ejemplo, sendmail ).
io.Writer
interfaz y cambia la salida del registrador predeterminado a través deSetOutput()
.Este es un registrador simple
Puedes usarlo de esta manera
fuente
Sé que esta pregunta es un poco antigua, pero si, como yo, sus proyectos están formados por varios archivos más pequeños, voto por su cuarta opción: he creado un
logger.go
que es parte del paquete principal. Este archivo go crea el registrador, lo asigna a un archivo y lo proporciona al resto de main. Tenga en cuenta que no he encontrado una forma elegante de cerrar el registro de errores ...fuente
defer errorlog.Close()
al final de la ejecución, o para asegurarse mejor de que esté cerrado, configurar manejadores de señales usando el paquete de señales de Go golang.org/pkg/os/signalEsta es una pregunta anterior, pero me gustaría sugerir el uso de http://github.com/romana/rlog (que desarrollamos). Se configura a través de variables de entorno, el objeto del registrador se crea e inicializa cuando se importa rlog. Por lo tanto, no es necesario pasar un registrador.
rlog tiene bastantes características:
Es muy pequeño, no tiene dependencias externas, excepto la biblioteca estándar de Golang y se está desarrollando activamente. Se proporcionan ejemplos en el repositorio.
fuente
Encontré el paquete de registro predeterminado ( https://golang.org/pkg/log/ ) algo limitante. Por ejemplo, no se admite la información frente a los registros de depuración.
Después de hurgar un poco, decidió usar https://github.com/golang/glog . Este parece ser un puerto de https://github.com/google/glog y brinda una flexibilidad decente en el registro. Por ejemplo, al ejecutar una aplicación localmente, es posible que desee un registro de nivel DEBUG, pero es posible que desee ejecutar solo en el nivel INFO / ERROR en producción. La lista de funciones / guía completas está aquí https://google-glog.googlecode.com/svn/trunk/doc/glog.html (es para el módulo c ++, pero en su mayor parte se traduce al puerto golang)
fuente
Uno de los módulos de registro que puede considerar es klog . Admite el registro en 'V', que brinda la flexibilidad de registrar en cierto nivel
klog es una bifurcación de glog y supera los siguientes inconvenientes
Implementación de muestra
fuente