Está en la página 1de 37

Sobre los Logs

En el SCADA Miranda R2
Autor: Ing. Vctor Pea
Empresa: GALBA

Notas al Lector.

Recuerda que al menos que trabajes en


labores de desarrollo y mantenimiento de
software, o como auditor de software, lo
ms probable es que no necesites saber
como generar un log ni como interpretarlo,
entonces si no trabajas en dichas reas
este documento no es para ti.

Notas al Lector.

La
funcin
principal
de
agregar
logs(registros) en un proyecto de software
es servir de apoyo en labores de
depuracin y correccin de cdigo.
Otro uso que se le puede dar a los logs
tiene que ver con su utilidad en procesos
de auditoras.

Logs en el SCADA.

Los archivos de configuracin de los logs


generados por el SCADA Miranda R2, se
encuentran en el directorio /etc/scadanac/
Dentro de este directorio se encuentran
varios subdirectorios (uno por mdulo del
SCADA).

Logs en el SCADA.

Ejemplo: Dentro de la ruta siguiente:


/etc/scadanac/acquisition.d/
Se encuentra el archivo de configuracin
de logs para el mdulo de adquisicin:
- logger.conf

Asi
mismo
para
el
directorio
/etc/scadanac/communications.d/ tambien
tiene su propio archivo logger.conf .

Logs en el SCADA.

En estos archivos se controla que


solicitudes de logs son habilitadas, donde
se muestran y con que formato.
Para entender como esto es realizado, y
como puede ser modificado, hay que
entender como funciona el sistema de logs
del SCADA.

Logs en el SCADA.

Para generar los Logs en el SCADA se


hace un uso extenso del framework de
registros para C++ conocido como Apache
log4cxx.
Log4cxx es rpido y flexible.
Con log4cxx es posible habilitar(o
deshabilitar) el registro(log) en tiempo de
ejecucin sin modificar el binario de la
aplicacin.

Logs en el SCADA.

El paquete log4cxx est diseado para


que
estas
declaraciones
pueden
permanecer en el cdigo enviado sin
incurrir en un costo de rendimiento pesado.
El comportamiento del registro puede ser
controlado editando un archivo de
configuracin sin tocar el binario de la
aplicacin.

Log4cxx.

Log4cxx tiene tres componentes


principales:
- Loggers (registradores).
- Appenders (aadidores).
- Layouts (diseos).

Log4cxx.

Estos tipos de componentes trabajan


juntos para permitir a los desarrolladores
generar mensajes de registro de acuerdo a
su tipo y nivel, y controlar en tiempo de
ejecucin como estos mensajes son
formateados y donde son reportados.

Loggers.

Como su nombre en ingls lo indica, los


Loggers son usados para realizar los
registros de un programa.
Los Loggers son entidades cuyo nombre
es sensitivo a casos y siguen una jerarqua
de reglas de nombrado.

Jerarqua de Nombrado.

Un Logger se dice que es ancestro de otro


si su nombre seguido por un punto es
prefijo del nombre de otro Logger
descendiente.
Un Logger se dice que es padre de un
Logger hijo si no hay ancestros entre l y
el Logger descendiente.

Jerarqua de Nombrado.

Ejemplos:
El logger llamado com.foo es padre del
logger llamado com.foo.bar.
El logger llamado java es padre del
logger llamado java.util y ancestro de
java.util.Vector.

Jerarqua de Nombrado.

El logger root esta ubicado en el tope de


la jerarqua y es especial de dos maneras:
- El siempre existe.
- No puede ser recuperado por su nombre.

Para recuperarlo se debe invocar el


siguiente mtodo esttico:
log4cxx::Logger::getRootLogger.

Niveles de Loggers.

A los loggers se les asigna niveles. Los


niveles predefinidos son:
TRACE, DEBUG, INFO, WARN, ERROR y
FATAL.

Si a un logger dado no se le asigna un


nivel, este lo hereda de su ancestro ms
cercano que si posea un nivel asignado.

Niveles de Loggers.
Ejemplo:
Nombre del
logger

Nivel Asignado

Nivel Heredado

root

Proot

Proot

ninguno

Proot

X.Y

PXY

PXY

X.Y.Z

ninguno

PXY

Peticin de Registro.

Para generar una peticin de registro se


debe realizar invocando un mtodo de una
instancia de logger, preferiblemente
mediante el uso de LOG4CXX_INFO o
macros similares.

Peticin de Registro.

Ejemplo del SCADA:


if ( init == false ){

log4cxx::LoggerPtr logApp( log4cxx::Logger::getLogger("logApp"));


LOG4CXX_ERROR( logApp , "Existen problemas en los
parametros de conexin con el mdulo de Seguridad");
...
}

Peticin de Registro.

En el ejemplo anterior podemos ver como


mediante la macro LOG4CXX_ERROR
pasandole como parmetros el Logger en
el cual queremos registrar y el mensaje
que queremos mostrar, se genera una
peticin de log (registro).
Una peticin es habilitada si su nivel es
mayor o igual al nivel del logger asociado a
ella.

Peticin de Registro.

Para los niveles estndar se tiene:


TRACE < DEBUG < INFO < WARN <
ERROR < FATAL.

Por lo tanto para que la peticin del


ejemplo anterior sea habilitada, el registro
asociado logApp tiene que tener un nivel
menor o igual a ERROR.

Aadidores y Diseo.

La capacidad para selectivamente habilitar


o deshabilitar una peticin de registro (log)
es solo una parte de log4cxx.
Log4cxx permite almacenar las peticiones
de registro en multiples destinos. Un
destion de salida normalmente es conocido
como Appender (Aadidor).

Aadidores y Diseo.

Actualmente existen aadidores para la


consola, archivos, componentes graficos,
servidores remotos, y otros.
Ms de un aadidor puede ser relacionado
con un registrador.

Aadidores y Diseo.

La salida de una sentencia de registro de


un logger C se enviar a todos los
aadidores de C y de sus ancestros. Sin
embargo si un ancestro de C digamos P,
tiene cargada la bandera de aditividad en
false (falso) entonces la salida de C ir a
todos sus ancestros hasta P incluido, pero
no a los ancestros de este ultimo.

Aadidores y Diseo.

A menudo no solo se desea personalizar


los destinos de salida de los logs sino
tambien su formato.
Esto se logra asociando un layout (diseo)
a un appender, el layout es entonces el
responsable de formatear las peticiones
de registro de acuerdo a los deseos del
usuario.

Aadidores y Diseo.

En log4cxx mediante PatternLayout,


podemos especificar el formato de salida
deseado de acuerdo a un patrn de
conversin similar al usado en la funcin
printf del lenguaje C.

Aadidores y Diseo.

Por ejemplo con el patrn de conversin:


%-5p %d{ISO8601} [%c] %l%n

%m%n

obtendremos salidas como la siguiente:


INFO 2015-08-26 03:19:55,503 [commLogAppenderLogger]
common/Logger.cpp(50)
file: managerConections.cpp (line 89) waiting for clients...

Donde el primer campo se refiere al nivel


(info).

Aadidores y Diseo.

El segundo campo da la fecha y hora del


registro con un nivel de detalle de hasta
milesimas de segundo (2015-08-26 03:19:55,503).
El tercer campo es el nombre del logger al
cual se le hizo la peticin de registro
(commLogAppenderLogger).

Aadidores y Diseo.

El cuarto campo se refiere al archivo


donde se genera la peticin de registro
como tal y la linea en la cual esto es
realizado (common/Logger.cpp(50)).

Aadidores y Diseo.

El quinto campo se refiere al archivo desde


el cual se envia el mensaje que llevar el
registro y desde el cual se hace el llamado
a una funcin del arhivo mencionado en el
cuarto campo que es como ya se
menciono, la que genera la peticin ( file:
managerConections.cpp (line 89)).

El sexto campo se refiere al mensaje que


es emitido en el registro (waiting for clients... ).

Configuracin.

Realizar insercin de peticiones de registro


en el cdigo de una aplicacin es una
tarea que requiere una gran cantidad de
esfuerzo y planificacin.
El ambiente de log4cxx es altamente
configurable
programaticamente,
sin
embargo es mucho ms flexible configurar
log4cxx usando archivos de configuracin.

Configuracin.

Veamos un ejemplo de como esto es


realizado en el SCADA, observando un
poco el archivo de configuracin :
/etc/scadanac/communications.d/logger.conf

En las primeras lineas de este archivo


podemos ver lo siguiente:
# Se crea el Logger para el administrador de Comunicaciones

log4j.logger.commLogAppenderLogger=DEBUG, commLogAppender

Configuracin.

La primera linea mostrada sirve solo para


propositos de documentacin, ya que es
un comentario (comienza con #).
La segunda linea crea un logger llamado
commLogAppenderLogger y le asigna el
nivel Debug y le agrega un appender
llamado commLogAppender.

Configuracin.

Luego ms adelante podemos ver las


siguientes lineas:
log4j.appender.commLogAppender=org.apache.log4j.RollingFileApp
ender
log4j.appender.commLogAppender.File=/var/log/scadanac/communic
ations.d/communications-admin.log

Con la primera linea se establece que el


appender llamado commLogAppender se
comience a sobreescribir una vez
alcanzada su capacidad maxima.

Configuracin.

En la segunda linea se establece que el


appender mencionado almacenar las
peticiones de registro habilitadas en el
archivo establecido.

Configuracin.

Luego podemos ver lo siguiente:


log4j.appender.commLogAppender.MaxFileSize=10MB
log4j.appender.commLogAppender.MaxBackupIndex=10
log4j.appender.commLogAppender.ownerFile=galba-adm

Con la primera linea se establece la


capacidad mxima del archivo relacionado
con el appender commLogAppender en
10MB.

Configuracin.

Al alcanzar el appender la capacidad


mxima
del
archivo
(10
MB)
automaticamente
comenzar
a
sobreescribirse y los datos anteriores son
respaldados en un arhivo llamado
/var/log/scadanac/communications.d/communications-admin.log.1

Con la segunda linea se establece que


pueden haber 10 arhivos de respaldo, y
con la siguiente el dueo de esos archivos.

Configuracin.

Las cuestiones que tienen que ver con el


formato de este aadidor y el horario son
establecidas en las siguientes lineas:
log4j.appender.commLogAppender.layout=org.apache.log4j.PatternL
ayout
# Para ajustar la zona de tiempo a la de Venezuela (GMT-04:30)
log4j.appender.commLogAppender.layout.TimeZone=UTC4:30
log4j.appender.commLogAppender.layout.ConversionPattern=%-5p
%d{ISO8601} [%c] %l%n
%m%n