martes, 7 de febrero de 2012

Configurar logging en python y django con yaml

Os paso el esquema de logging que utilizo en mis aplicaciones por si os puede servir de ayuda. Lo he ido montando a partir de diversas fuentes y experiencias.

Un punto importante es dejar el fichero de configuración del logging fuera del programa para independizar mejor el sistema de logging de la aplicación.

Este puede ser un ejemplo del fichero de configuración en yaml (logger.conf):


version: 1
formatters:
  brief:
    format: '%(name)s - %(levelname)s - %(message)s'
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  detailed:
    format: '%(asctime)s %(module)-17s line:%(lineno)-4d %(levelname)-8s %(message)s'
  email:
    format: 'Timestamp: %(asctime)s\nModule: %(module)s\n Line: %(lineno)d\nMessage: %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: brief
    stream: ext://sys.stdout
  file:
    class: logging.handlers.RotatingFileHandler
    level: INFO
    formatter: detailed
    filename: app.log
    mode: a
    maxBytes: 10485760
    backupCount: 5
  smtp:
    class: logging.handlers.SMTPHandler
    level: ERROR
    formatter: email
    mailhost: smtp.xxxxx.es
    fromaddr: yyy@xxxx.es
    toaddrs:  yyyy@xxxx.es
    subject:  Error en aplicacion XX
root:
  level: DEBUG
  handlers: [console]

Se observan los formateadores de los mensajes y los handlers para la cónsola, fichero y correo. Por defecto el logging sale por cónsola, si queremos que los errores salgan por email handlers de root sería [console, smtp], para fichero que rotara cada maxBytes [file], etc... Realmente cómodo.

Para cargar la configuración, primero parseamos el yaml (PyYAML) y luego lo enviamos a dictConfig, que realiza la configuración así:


import yaml
import logging


#nos aseguramos de que dictConfig esté presente (python 2.7), sino, lo cargamos de la libreria de django 



try: 
    from logging.config import dictConfig 
except ImportError: 
    from django.utils.dictconfig import dictConfig

# Cargamos la configuracion del fichero, la parseamos y la enviamos a dictConf
try:
    logging.config.dictConfig(yaml.load(file('logger.conf','r')))
except Exception, e:
    print "Error configurating logger ", str(e)

Ahora ya podemos el usar el sistema. En general, es conveniente nombrar cada logger con el nombre de su módulo para que cuando haya muchos mensajes sepamos cuál los está enviando, para ello podemos usar el valor de __name__, así:

logger=logging.getLogger(__name__) # __name__ contiene el nombre del modulo
logger.debug("blah blah")

Si queremos que cada clase tenga su logger privado, tenemos que tomar una pequeña precaución para evitar un error si otros usan una librería nuestra con otro sistema de handles,

Declaramos una clase "nula":

class Nullhandler(logging.Handler):
   def emit(self, record):
      pass

y ahora, en la clase hacemos

class Clase():
   def __init__(self):
      self.__logger=logging.getLogger(__name__)
      self.__logger.addHandler(NullHandler())
      self.__logger.debug("clase iniciada")

Como veis es un tema un poco denso pero que una vez bien configurado nos será imprescindible para trazar correctamente las aplicaciones. Espero que os haya ayudado.

lunes, 30 de enero de 2012

Obtener valor de radiobutton con JQuery

Si tenemos un grupo de radiobutton,s podemos conocer cuál ha sido seleccionado con

  $("input[name='nombre de grupo']:checked").val(); 

Fuente: Blog de Victor Puertas

martes, 27 de diciembre de 2011

¿Un paseito por la Luna?

Para celebrar fin de año, os propongo este bonito vídeo que he subido a youtube. En él podremos disfrutar un paseo por la superficie lunar con el Lunar Roving Vehicle. A partir del minuto 0:52 la cámara está filmando encima del rover.

El Apolo 16 fué el penúltimo en alunizar y el primero en hacerlo en una zona montañosa. Se lanzo desde Cabo Cañaveral el 16 de Abril de 1972. En total, la misión duró once días de los cuales tres pasaron sobre la superficie de la Luna. El Comandante John Young y el Piloto Charles Duke son los protagonistas del vídeo.

Molts d'anys i bons! Bon 2012!

miércoles, 21 de diciembre de 2011

lunes, 5 de diciembre de 2011

Shell en django

Ocurre muchas veces que necesitamos una shell en django para realizar pruebas o tareas de mantenimiento. Conseguirla es muy sencillo ya que settings.py se cargará desde el primer momento en que importemos un modelo o cualquier módulo de django.  Lo único que tenemos que hacer es exportar la variable DJANGO_SETTINGS_MODULE con el valor del fichero de settings que queremos utilizar. Yo uso este script (suponiendo que nuestros settings están en settings.py):

shell.sh
export DJANGO_SETTINGS_MODULE="settings"
python


desde aquí ya podemos operar con los modelos:

from gesion.models import Cliente
c=Cliente(clave='444', descripcion='Pepe Perez')
c.save()


Si queremos acceder desde un script independiente en python podemos usar setup_environ de esta forma:

mantenimiento.py
from django.core.management import setup_environ

try:
  import settings
except ImportError:
  import sys
  sys.stderr.write("No encuentro el fichero de settings")
  sys.exit(1)

setup_environ(settings)

....


Espero que os sirva.

jueves, 24 de noviembre de 2011

Copiar pdf a iPhone iPad fácil ubuntu

1) Instalar el lector Stanza en el dispositivo.
2) Conectar el dispositivo al PC. Saldrá un directorio llamado "Documentación sobre iPad->Stanza".

Todo lo que copiemos en este directorio nos saldrá luego en el apartado "downloads" del stanza.

Probado con Ubuntu 11. Happy reading!!

miércoles, 23 de noviembre de 2011

Tiempo EST, CET, CEST, PST

Un twitt refiriéndose al lanzamiento del Curiosity dice:


"Liftoff scheduled for 10:02 a.m. EST. http://www.nasa.gov/msl #MSL".


Vale. ¿Y eso qué hora es en España?. El tiempo EST se refiere al tiempo oficial de la costa este de los EEUU. En España peninsular e Illes Balears estamos en el tiempo CET (Central European Time) o CEST en verano (Central European Sumer Time), es decir en GMT+1 o GMT+2 en verano, GMT corresponde a la hora en el meridiano 0 o meridiano de Greenwich .


Si miramos este mapa de husos horarios de wikipedia vemos que Cabo Cañaveral está en la costa este, en el uso GMT-5 (en amarillo). En invierno, como España está en el huso GMT+1 (en verde) tenemos que sumar 6 horas al tiempo EST para que nos dé en tiempo CET. O sea, el Curiosity será lanzado a las 16:02 h, tiempo de España y les Illes Balears, una hora menos en las Islas Canarias.

El tiempo EST es importante por ser el usado por los grandes núcleos de población de los EEUU (Boston, Whashington, Nueva York y Miami). Otra zona horaria importante es la usada en la costa oeste, el llamado PST (Pacific Standard Time) por ser el usado en Seattle, Portland, San Francisco y Los Ángeles. En este caso el huso está en GMT-08 y por lo tanto hay que sumar 8 horas para transformarlo en GMT y de ahí una hora más para pasarlo a EST. En total hay una diferencia horaria de nueve horas.

Observamos que para calcular la hora equivalente en otro huso que está más al Oeste (ir hacia la izquierda) tenemos que restar los husos que vamos pasando. Para calcular la hora equivalente a otro huso que está más al Este (ir hacia la derecha) tenemos que sumar los husos que vamos pasando. De todas formas, hay que consultar el mapa porque como veis, la hora oficial depende de consideraciones políticas p.e. Groenlandia cae en cinco zonas horarias pero sólo usa tres.

La mayoría de países europeos usan CET (en verde) menos Portugal, Irlanda y Reino Unido a la izquierda en los que hay que restar una hora.