LOGGER in GOlang | LOGGER in GOlang with Docker | Using LOG in GOlang with Docker | Uso de LOG en GOlang con Docker | LOGGER en GOlang
LOGGER in GOlang | LOGGER in GOlang with Docker | Using LOG in GOlang with Docker | Uso de LOG en GOlang con Docker | LOGGER en GOlang
El registro (LOG) de peticiones, errores, o eventos es muy importante en cualquier sistema. Con un registro (LOG) de errores, eventos , es muy importante a la hora de validar un fallo computacional del sistema.
Objetivo
Mejorar el sistema de LOGs de GOlang.
Requisitos:
go (versión go1.14.4 o superior)
Docker (versión 19.03.12)
Docker-compose (versión 1.25.0)
En Acción:
Estructura del proyecto:
Código del ejemplo con su respectivo Dockerfile.
logger.go
package main
import (
"flag"
"log"
"os"
)
//Se declara la variable Log. Esta será usada para registrar los eventos.
var (
Log *log.Logger = Loggerx()
)
func Loggerx() *log.Logger {
LOG_FILE_LOCATION := os.Getenv("LOG_FILE_LOCATION")
//En el caso que la variable de entorno exista, el sistema usa la configuración del docker.
if LOG_FILE_LOCATION == "" {
LOG_FILE_LOCATION = "../logs/" + APP_NAME + ".log"
} else {
LOG_FILE_LOCATION = LOG_FILE_LOCATION + APP_NAME + ".log"
}
flag.Parse()
//Si el archivo existe se rehusa, es decir, no elimina el archivo log y crea uno nuevo.
if _, err := os.Stat(LOG_FILE_LOCATION); os.IsNotExist(err) {
file, err1 := os.Create(LOG_FILE_LOCATION)
if err1 != nil {
panic(err1)
}
//si no existe,se crea uno nuevo.
return log.New(file, "", log.Ldate|log.Ltime|log.Lshortfile)
} else {
//si existe se rehusa.
file, err := os.OpenFile(LOG_FILE_LOCATION, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
return log.New(file, "", log.Ldate|log.Ltime|log.Lshortfile)
}
}
Dockerfile:
FROM golang:alpine
# Add Maintainer Info
LABEL maintainer="Jose Mejia"
# Instalar GIT en el contenedor/Install git.
RUN apk add git
# /Crea el folder app/Create folder app
RUN mkdir /app
# Se crean los argumentos/Build Args
ARG LOG_DIR=/logs
# Se crea el folder para almacenar los logs/Create Log Directory
RUN mkdir -p ${LOG_DIR}
# Definicion de variables de entorno/Environment Variables
ENV LOG_FILE_LOCATION=${LOG_DIR}/
ENV ENVIRONMENT=dev
# Copiar todo de nuestro repositorio al contenedor/Copy sources
COPY . /app
# Se establece /app como directorio actual/Set the Current Working Directory inside the container
WORKDIR /app
# Se descargan todas las dependencias/get dependencies
RUN go get -d -v
# Construir la aplicación GO/Build the Go app
RUN go build -o main .
# Se declaran los volumnes del contenedor/Declare volumes to mount
VOLUME [${LOG_DIR}]
# Puerto en el cual se expone la aplicacion/This container exposes port
EXPOSE 4443
# Lanza la aplicacion/Run
CMD ["./main"]
El archivo Dockerfile debe estar al mismo nivel del código fuente ,
docker-compose.yml
version: '3.4'# Se definen los servicios que va a administrar el docker-composeservices:proxy:container_name: proxy #nombre del contenedor/container namebuild:context: proxy #nombre del folder donde existe el dockerfiledockerfile: Dockerfile #Nombre del docker fileenvironment: #Declaración de variables de entorno- ENVIRONMENT=devports: #Puertos que se van a abrir del contenedor- "4443:4443"networks: #Declaración de la red- fullstackvolumes: #Definicón y declaración de los volumenes- ./logs/:/logs:rwrestart: always # Modalidad de reinicionetworks:fullstack:driver: bridge
Resultados
* El iniciar el Docker y realizar peticiones:
2020/07/20 13:13:28 main.go:40: INICIA HTTPS SERVER :8181 :8182
2020/07/20 13:13:36 handlers.go:16: Redirect to: https://localhost:8182/
2020/07/20 13:13:44 handlers.go:45: localhost:8181 / Target not exist /
2020/07/20 13:17:38 main.go:40: INICIA HTTPS SERVER :8181 :8182
2020/07/20 13:17:48 handlers.go:19: Redirect to: https://localhost:8181/
2020/07/20 13:17:48 handlers.go:48: localhost:8181 / Target not exist /
Si se Reinicia el Docker por algún motivo, el sistema rehusa el archivo log, manteniendo los registros anteriores.
Código fuentes:
Notas finales:
Con Docker y Docker-Compose es mucho más fácil la administración y despliegues de aplicaciones en cualquier ambiente. Adicionalmente Docker se encarga de administrar el contenedor.
No olvides compartir y dar +1
-
Próximos eventos:
* Habilitar https en GOlang
* Ejecutar código HTML estático en DOCKER
* Microservicios en Python
* Python+MongoDB: CRUD
* Python+MongoDB+GridFS: Almacenamiento de archivos
* Colas - Queue Python: Envío de mensajes
* Python+AWS+SNS: Envío de mensajes de textos.
* Python3: Creación de un Chatbot básico
* NodeJS+MongoDB: CRUD
El orden de los eventos puede cambiar
Comentarios
Publicar un comentario