20251009 Logs_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Venga, niños
00:00:00
Vamos
00:00:05
Vale, a ver
00:00:06
¿Cómo le decimos a Maven
00:00:09
Que necesitamos una dependencia?
00:00:12
Pues tenemos que
00:00:14
Decirle cuál es
00:00:16
¿Y cómo podemos averiguar cuál es?
00:00:17
Menos mal
00:00:19
Que tenemos una cosa
00:00:21
Si yo encuentro el ratón
00:00:24
No
00:00:25
Eso también
00:00:27
Que se llama
00:00:28
el repositorio de Maven
00:00:30
entonces, en cuanto busquéis
00:00:33
Maven repositorio, la primera que os va a salir
00:00:38
es esto
00:00:40
y aquí te sale
00:00:40
todas las tropecientas
00:00:43
mil millones de cosas
00:00:46
que tú puedes descargar y usar
00:00:47
muchas
00:00:50
muchísimas
00:00:51
entonces aquí, lo complicado
00:00:52
es encontrarlo
00:00:55
y luego una vez que lo has encontrado
00:00:57
que te case con tu versión y te funcione
00:00:59
normalmente esto es un camino
00:01:02
interminable hasta que consigues
00:01:03
todas las dependencias que casan
00:01:06
exactamente con lo que quieres hacer y te funciona
00:01:08
y cuando ya lo tienes
00:01:09
no lo toques nunca
00:01:11
nunca jamás, porque en cuanto
00:01:13
toques algo, pum, lo que pasa es que hay veces
00:01:15
no lo tocas tú, pero te han tocado la
00:01:18
versión del servidor, entonces ya
00:01:19
otra vez tienes que empezar
00:01:22
a tocarlo todo
00:01:23
en nuestro caso afortunadamente
00:01:25
Solo es los 4J
00:01:27
Pues vamos a hacer una búsqueda
00:01:29
Una búsqueda, los 4J
00:01:31
Dos, que me sacas por ahí
00:01:33
Venga, busca
00:01:35
Busca
00:01:37
Esto no suena
00:01:39
Esto no nos suena
00:01:41
Esto no nos suena
00:01:44
A ver, es que a mi no me gusta ninguna de estas
00:01:47
Porque
00:01:51
Vamos a hacer una cosa
00:01:51
Voy a ponerle
00:01:58
bueno, no hemos dicho que es de Apache
00:01:59
que Apache, ya sabéis que tiene un montón
00:02:03
de cosas de las que se ha apropiado
00:02:06
bueno, más que se ha apropiado, que las ha desarrollado
00:02:08
de Java, vale, entonces
00:02:10
bien, Apache
00:02:12
los 4J, vale
00:02:18
entonces
00:02:20
esto ya me dice, uno
00:02:22
lo buscaría en principio por los 4J
00:02:28
Apache, porque Apache
00:02:31
es él. Y le sale esto
00:02:33
y
00:02:35
los cuatro
00:02:36
los cuatro jotados.
00:02:37
Yo quiero...
00:02:42
No, no me...
00:02:43
Que no me funciona.
00:02:45
No, no, no.
00:02:49
No, porque está conectado al ordenador.
00:02:49
Pero da igual.
00:02:53
En otro aula
00:02:55
yo estoy proyectando.
00:02:56
Claro, me debería funcionar.
00:02:58
Pero es que
00:02:59
estábamos usando el de clases.
00:03:01
Ah, es porque
00:03:05
Me avisa, esa es la clave
00:03:07
Por eso no funciona en grado medio
00:03:09
Porque en grado medio no uso portátil, uso el de clase
00:03:11
Entonces tendría que poner
00:03:13
Los USBs también
00:03:15
Ah, vale, ya decía
00:03:16
¿Y por qué no me funciona el resto de...? Vale, vale
00:03:19
Porque no tengo los USBs
00:03:21
Sois estupendos, bueno, es la clave
00:03:22
¿Eh?
00:03:24
¿Está conectado igual por HDMI?
00:03:27
Claro, mi portátil está solo por HDMI
00:03:30
Pero...
00:03:32
Y el otro está por USB y HDMI.
00:03:33
Entonces, claro, tendría que ir por los USBs.
00:03:35
Por eso tampoco puedo coger la cámara.
00:03:38
Desde mi portátil, porque va por USB, etc.
00:03:39
Vale, entonces.
00:03:42
Lo que pasa es que yo quería la 2.
00:03:45
A ver, y si pongo API.
00:04:03
Es que, a veros, la...
00:04:04
Esto no lo quiero.
00:04:10
Ven, aquí que pone
00:04:19
septiembre del 2018.
00:04:20
Esta.
00:04:25
Vale.
00:04:30
Vale, pues entonces,
00:04:39
el core y el API.
00:04:40
Sí.
00:04:45
En realidad, a ver, yo las tengo ya en mi proyecto.
00:04:48
Podríamos copiar y pegar,
00:04:51
pero vamos a hacer
00:04:52
vamos a meternos en la basura directamente
00:04:54
a ver si nos funciona
00:04:56
entonces en general cuando uno ofrece
00:04:58
un paquete de clases
00:05:00
recordad la arquitectura, un segundito
00:05:02
de que normalmente tú
00:05:04
haces interfaces con los métodos
00:05:06
y luego implementaciones
00:05:08
pues en la mayoría de los casos
00:05:10
cuando uno busca dependencias
00:05:13
por ahí tiene la misma estructura
00:05:14
está el API, que son las interfaces sin más
00:05:15
luego está el Core, que son las
00:05:18
implementaciones, que es justo las dos cosas que me está
00:05:20
ofreciendo, el API y el
00:05:22
core, ¿vale? Entonces, yo
00:05:25
cogería las dos,
00:05:26
¿vale? Entonces, uno pincha
00:05:28
aquí,
00:05:30
core, y ya te dice, ¿qué versión
00:05:32
quieres? Vámonos
00:05:35
a esta de aquí, la de septiembre
00:05:37
18.
00:05:38
Pinchamos aquí,
00:05:42
sí, pincha el core,
00:05:44
y ya sale esto,
00:05:45
que esto es lo que hay que
00:05:47
copiar en dependencias
00:05:48
entonces todo en cuanto pinchas aquí ya se copia
00:05:50
cuando pinchas aquí
00:05:52
ya se copia
00:05:56
si en cuanto pinches ya se selecciona
00:05:57
y se copia
00:06:00
si estuviéramos trabajando con Gradle
00:06:01
pues esto es lo que habría que poner
00:06:03
en el fichero de configuración de Gradle
00:06:06
pero como estamos trabajando con Maven
00:06:08
esto
00:06:10
una vez que ya está copiado
00:06:11
nos vamos al Pong y a la
00:06:13
ahí está
00:06:15
Este, o sea, yo me he ido
00:06:18
Vamos a ver
00:06:23
A la última versión, vamos a ver
00:06:24
¿De dónde he salido yo?
00:06:26
Yo he buscado los 4J2 a API
00:06:30
He llegado a
00:06:32
Arriba
00:06:36
¿Cómo arriba?
00:06:39
En el séptimo
00:06:41
A este
00:06:42
He pinchado aquí
00:06:43
Y aquí me ofrece el core y el API
00:06:46
Pues vamos a los dos
00:06:48
El core ya lo he copiado
00:06:49
Voy a este
00:06:52
Selecciono la misma versión
00:06:53
La del 18 de septiembre
00:06:55
Pincho para que copie
00:06:57
Y pego aquí
00:07:00
¿Vale?
00:07:03
Entonces con suerte
00:07:07
Con estas dos puedo ya trabajar
00:07:08
Si no puedo trabajar ya me dirá
00:07:10
Class not found
00:07:13
Exception, class no se que, ya me dirá cosas
00:07:14
Entonces tendré que seguir buscando
00:07:16
Pero con suerte con estas dos
00:07:17
¿Y el API?
00:07:19
El API es el conjunto de interfaces
00:07:22
Y el core es la implementación
00:07:24
Suele ser una estructura típica de dependencias
00:07:25
El API y el core
00:07:28
Ambos dentro de dependencias
00:07:29
Dentro de las dependencias
00:07:31
Que habéis escrito a mano
00:07:34
Entonces en cuanto tengáis las dos
00:07:35
Dependencias estas
00:07:40
Y ahora luego aquí ya viene
00:07:41
Y guardéis
00:07:42
Al POM
00:07:44
te tendrás que crear tú
00:07:47
este nodo de dependencias
00:07:49
a mano
00:07:52
este nodo de dependencias
00:07:53
con su principio y su fin
00:07:55
te lo tendrás que crear a mano
00:07:57
y ahora ya dentro toda la lista de nodos
00:07:59
dependencias, dependencias, dependencias y otras
00:08:02
y en cuanto guardéis
00:08:03
le deis archivar
00:08:08
pues se hace la magia
00:08:09
en cuanto le damos a este botón
00:08:11
¡pum! ya pasan cosas
00:08:13
¿qué está pasando?
00:08:15
que el Eclipse, el plugin
00:08:18
de Maven de Eclipse, claro, se está conectando
00:08:20
al repositorio, está descargando
00:08:22
todos los hard
00:08:25
relacionados con esta dependencia
00:08:26
los está poniendo en un repositorio local
00:08:28
que ahora miramos a ver
00:08:31
dónde está, porque siempre van a saber
00:08:32
dónde está el repositorio local, porque a veces
00:08:34
cuando Maven casca, lo mejor
00:08:36
es borrar el repositorio local y empezar
00:08:38
de nuevo, y una vez
00:08:40
que lo ha descargado al repositorio local
00:08:42
ya lo mete al classpad del sistema
00:08:44
Todo eso ha hecho solo por darle yo a guardar
00:08:46
De hecho
00:08:50
Si nos vamos aquí de nuevo
00:08:52
A nuestro proyecto Maven
00:08:53
Nos vamos aquí, nos ha aparecido
00:08:55
Esta etiquetita de aquí
00:08:57
Con
00:08:59
Todas las dependencias
00:09:01
Que ha metido
00:09:03
Log4j
00:09:04
Fijaos que listo
00:09:08
Esto, la versión de antes de septiembre
00:09:11
No lo hacía
00:09:13
Fijaos que listo
00:09:14
la última versión que yo probé
00:09:16
de esto, te metía
00:09:19
el API y el core, punto pelota
00:09:21
esta versión
00:09:22
te metes dos hard
00:09:25
¿qué son los Jackson?
00:09:26
¿algunos no os lo han metido?
00:09:28
a ver, yo os avisé ya
00:09:30
o si no os lo avisé, os lo avisé ahora
00:09:32
y por eso cuando me decíais, graba las clases
00:09:34
no, os dije
00:09:36
veréis que esto es muy complicado, porque esto ya va a ser
00:09:38
un caos, a cada uno os va a salir
00:09:41
una cosa, a uno le funciona, a otro no
00:09:43
aquí hay mil variables de las que dependemos
00:09:45
cuando uno consigue que todo el puzzle
00:09:47
le encaje, a otro se le cae una pieza
00:09:49
entonces esto ya empieza a ser un caos
00:09:51
porque ya dependemos
00:09:53
entonces este es un ejemplo
00:09:54
a mí que me ha pasado, yo solamente
00:09:56
poniendo estas dos dependencias
00:09:59
no, no, no, perdón, perdón, perdón
00:10:00
perdón, perdón, hazme, todo lo que he dicho
00:10:03
es mentira, perdón
00:10:05
es que ha abierto el proyecto que no era
00:10:07
claro, es que he dicho, no me lo puedo creer
00:10:09
Qué listo que me ha metido el Jackson solo
00:10:13
Podría ser
00:10:15
Vale, perdón, perdón, perdón
00:10:16
Eso me pasa por, claro, es que tengo
00:10:19
Todos los proyectos juntos
00:10:21
Vale, perdón, perdónenme
00:10:23
Lo siento, ya
00:10:25
Pero, perdonad, ha metido los dos
00:10:29
Lo del Jackson
00:10:31
Vendrá después
00:10:33
Lo del Jackson, vale, pues estamos
00:10:34
Todos igualitos, dime
00:10:37
El POM
00:10:38
Sí
00:10:41
Tiene solo estas dos
00:10:41
Las que he copiado del repositorio de Maven
00:10:44
Tiene el nodo que he creado
00:10:47
Este
00:10:58
Hace dos años
00:10:59
Tenía un alumno con tendencia
00:11:10
A echar cabezadas en clase
00:11:12
Bueno, a ver, todos los años
00:11:14
Hay alumnos que hacen echar cabezadas
00:11:15
Y ese alumno
00:11:17
Primero echaba cabezadas
00:11:19
y en segundo dijo, he comprobado
00:11:20
que si me duermo un minuto
00:11:23
ya me he perdido
00:11:24
¿qué has escrito ahí?
00:11:26
con lo cual, los que tengáis
00:11:29
esa cabeza no la sentéis, porque es que
00:11:30
si es que alguien la tuviera
00:11:33
vale, pues entonces
00:11:36
pues que ha hecho Maben
00:11:38
lo que he dicho, ha descargado los hard
00:11:43
lo ha guardado en un repositorio local
00:11:44
lo ha añadido al pad del sistema
00:11:46
¿dónde está ese repositorio local?
00:11:48
es decir, los JAR los ha
00:11:50
bajado físicamente
00:11:52
pero ojo, no los ha
00:11:54
metido dentro del proyecto
00:11:56
los JAR no están aquí dentro
00:11:58
porque si estuvieran aquí dentro el proyecto
00:12:00
pesaría un huevo, ¿vale?
00:12:02
no los ha metido aquí dentro
00:12:04
los ha puesto un reportero local, con lo cual
00:12:05
no os peguéis
00:12:08
con lo cual, me diríais
00:12:09
¿qué pasa si ahora yo este proyecto
00:12:12
lo despliego en otro sitio?
00:12:14
si los JAR no están localmente
00:12:16
claro
00:12:17
pero es que cuando uno lo despliegue
00:12:20
en otro sitio
00:12:23
va a ver la dependencia en Maver
00:12:23
¿qué va a hacer ese otro equipo?
00:12:26
va a mirar su repositorio local
00:12:28
a ver si hubiera la casualidad que estuviera en estos hard
00:12:30
y si no lo está, los descargaría para él
00:12:32
entonces
00:12:35
está automatizando
00:12:36
la descarga de los hard cuando le haga falta
00:12:38
nosotros nos limitamos
00:12:41
a poner los dependencia aquí dentro
00:12:42
y da igual donde despleguemos esto
00:12:44
si él ve que no los tiene
00:12:47
en el local y hacen falta los despliega.
00:12:48
Ya nos olvidamos de eso, los descarga, perdón.
00:12:50
Pues, ¿dónde está ese repositorio local?
00:12:52
Pues, a ver, sí me acuerdo.
00:12:55
Creo que no me acuerdo.
00:12:57
Con lo cual, hasta que...
00:12:58
No pasa nada.
00:12:59
Vale, pues, entonces hemos quedado que estaba,
00:13:00
acordaos en el usuario, carpeta M2, repositorio.
00:13:04
Bueno, pues, ahora ya, ya sí que podemos hacer nuestra
00:13:10
pequeña aplicación que envía logs.
00:13:15
Vale.
00:13:20
Entonces, primero no vamos a meterle ningún archivo de configuración.
00:13:20
Vamos a hacer un primer paquete.
00:13:26
Como mi grupo era condam2, pues la idea es que los paquetes tengan ese condam2.
00:13:32
Pues yo qué sé.
00:13:39
Main.
00:13:43
Condam2.
00:13:46
Bueno, porque yo a mi proyecto
00:13:46
Mi proyecto Maven
00:13:49
Le he dicho que su identificador de grupo
00:13:51
Es com.dam2
00:13:53
Que es mi nombre de dominio
00:13:54
Era dam2.com
00:13:56
Era dam2.com
00:13:57
Bueno, ya, sí, pero porque se hace en orden distinto
00:13:59
A ver, dam2.com
00:14:02
Pero aquí en el nombre de paquete
00:14:04
Esto es un tema de cómo se empaqueta en general
00:14:05
¿Vale? Los nombres de dominio
00:14:08
Todos sabemos cómo son
00:14:09
Pepito.com, Juanito.org
00:14:11
Eso lo tenemos claro, ¿vale?
00:14:14
Entonces, ¿cómo se suele empaquetar en las empresas? Pues, como la idea es que nuestros paquetes tengan nombres únicos dentro de todas las aplicaciones, que nuestras aplicaciones tengan nombres únicos, ¿vale? Pues, se suele empaquetar aprovechando la unicidad del nombre de dominio.
00:14:15
pero se pone al revés
00:14:34
com.dam2.main
00:14:35
porque así tenemos la jerarquía mejor
00:14:37
com es la carpeta
00:14:39
com luego tendría tantas subcarpetas
00:14:41
como subdominios
00:14:43
tenga tu empresa, cada subdominio
00:14:45
a su vez tendrá tantas carpetas como subdominios
00:14:48
entonces tiene sentido que el nombre del paquete
00:14:50
sea al revés, porque esta es
00:14:52
la carpeta grandota, esta es la
00:14:53
subcarpeta dam2
00:14:55
y esta ya es la subcarpeta main
00:14:57
y esto se correspondería
00:14:59
con una empresa cuyo nombre de dominio es
00:15:01
dam2.com, dime
00:15:03
el proyecto
00:15:04
no te habrá pasado lo de
00:15:11
venga pues
00:15:13
vamos a hacernos nuestra
00:15:15
una clase normalicha y corrienticha
00:15:19
vale, pues aquí en esta clase
00:15:22
lo primero que queremos avisar cuando la aplicación
00:15:36
arranca es, entrando en la aplicación
00:15:38
para que uno, entonces eso ya
00:15:40
podría ser un posible mensaje de log
00:15:42
para saber en que momento ha arrancado la aplicación
00:15:44
a qué hora, etc.
00:15:46
Entonces, ¿quiénes
00:15:48
mandan? Esto por supuesto
00:15:50
lo podríamos hacer con un file
00:15:52
reader y se acabó, pero
00:15:54
qué complicado, ¿no?
00:15:55
Entonces,
00:15:58
como lo vamos a hacer con el 4J,
00:15:59
¿qué objeto es el que es capaz
00:16:02
de escribir en un archivo?
00:16:04
Pues un objeto que se llama
00:16:06
logger.
00:16:07
Entonces, de clase logger.
00:16:10
Entonces, si queremos escribir logs,
00:16:12
necesitamos
00:16:15
Un objeto logger
00:16:16
Que es el que es capaz de escribirlo
00:16:17
Este objeto logger
00:16:20
¿Cómo se crea?
00:16:21
De nuevo
00:16:24
Constructores caca
00:16:24
No los queremos
00:16:27
Entonces este se crea
00:16:29
Así
00:16:32
Y aquí ¿Qué ponemos?
00:16:35
Aquí
00:16:39
Lo que
00:16:40
Cuidado porque me ha importado el por defecto
00:16:41
El logger
00:16:44
De la herramienta java útil
00:16:46
Ahora vamos a tener que quitarlo
00:16:48
no queremos esto, queremos el de los 4.2.j
00:16:49
recordad que al principio os he dicho
00:16:51
la distribución estándar
00:16:53
te trae una herramienta para hacer logs
00:16:55
en java útil, pero bueno
00:16:57
es más limitada que los 4.j
00:16:59
la que mayoritariamente son los 4.j, ahora quitamos ese input
00:17:01
entonces
00:17:03
¿qué ponemos aquí en getLogger?
00:17:05
bueno, voy a quitarlo desde ya, no vaya
00:17:07
para esto, no lo quiero
00:17:08
¿cuál quiero importar?
00:17:11
quiero importar
00:17:14
el de or apache login
00:17:15
¿Pero cuál de todos?
00:17:17
Pues, a ver, es que
00:17:21
como ha cambiado la versión
00:17:22
no sé, yo creo que será el core
00:17:25
Será el core
00:17:26
Esto es como la vida misma, vamos a probar
00:17:28
Vale, entonces
00:17:30
Perdón
00:17:32
Entonces
00:17:36
¿Qué se pone aquí?
00:17:37
Se pone aquí la clase
00:17:40
a la cual este logger está asociado
00:17:42
en nuestro caso es
00:17:47
main.class
00:17:49
vale
00:17:51
si, espera, es que a ver si
00:17:52
este
00:17:57
a ver si lo he escrito yo mal
00:17:58
o es porque esta versión
00:18:00
a ver
00:18:02
no, voy a abrir la
00:18:07
chuleta, a ver que he escrito mal
00:18:09
por ejemplo
00:18:12
aquí tendré
00:18:14
ah, perdón
00:18:15
que es que no es
00:18:20
del logger, es logmanager, perdónenme
00:18:22
ustedes, no es
00:18:24
logmanager, si es que
00:18:26
no me tengo que aprender las cosas
00:18:28
que luego se me
00:18:30
olvidan, este ya
00:18:32
sí que es, getlogger
00:18:36
vale
00:18:38
vale
00:18:39
sigue dando error porque tienes que importar, hijo mío
00:18:43
de verdad, es que os gusta a vosotros
00:18:48
mucho ahí meter
00:18:50
cizaña, eh
00:18:52
sigue dando error
00:18:54
Además no se dice, sigue dando error
00:18:56
Se calla uno y lo arregla como loco
00:18:58
A mí me dice que hay que hacer un casting
00:19:00
Pues a mí me importa
00:19:03
A mí no me importa
00:19:04
Hay que quitar el código
00:19:04
A ver
00:19:06
A ver
00:19:11
Relájese, vale
00:19:14
Vale, pues el logger
00:19:16
Que es este
00:19:18
El logger que es este
00:19:19
Es el objeto que es capaz de mandar logs
00:19:22
Cuando uno quiera
00:19:24
entonces, ¿por qué he puesto aquí yo el nombre
00:19:25
de esta clase?
00:19:28
porque este objeto logger
00:19:30
puede haber uno por clase, mi aplicación
00:19:32
tendrá muchas clases, puede haber uno
00:19:34
por clase o uno
00:19:36
para todos
00:19:39
¿vale? podría haber uno para todos
00:19:40
entonces
00:19:43
si hay uno para
00:19:44
todos, yo no puedo configurar
00:19:46
las clases por separado
00:19:48
pero si hago uno por clase
00:19:50
puedo configurar cada clase por
00:19:53
separado. Ahora veremos qué significa esto de
00:19:54
configurar la jaula separado.
00:19:56
Vale, pues yo quiero mandar mi primer
00:19:58
log, que es este.
00:20:00
Que es, ahora,
00:20:04
¿qué métodos tiene
00:20:07
el logger? Pues tiene
00:20:08
un montón, pero
00:20:10
tiene unos
00:20:12
interesantes que son,
00:20:14
vamos a poner primero
00:20:17
un debug normal.
00:20:18
Espera, a ver.
00:20:20
No, espera, voy a ver un tracé.
00:20:22
Espera, vamos a ponerle un tracé
00:20:24
Un mensajito, un tracestream
00:20:26
Ahora, vale
00:20:28
Arrancando aplicación
00:20:33
Vale
00:20:41
Y podría hacer también
00:20:42
Ahora explicamos lo que es esto
00:20:44
Ahora, ahora lo, sí
00:20:47
Ahora lo
00:20:49
Arrancando aplicación
00:20:50
Ahora voy a cambiar esto, debug, después del debug tenemos info, después de info creo que viene one, después de one pondríamos error, vale, pues ¿qué es esto que he hecho yo aquí?
00:21:08
no exactamente
00:21:46
no exactamente
00:21:47
a ver
00:21:50
con esto
00:21:51
lo que le digo es
00:21:52
al logger
00:21:53
que me envíe un log
00:21:54
¿a dónde?
00:21:56
a un fichero de la consola
00:21:58
todavía no sabemos
00:21:59
por qué es que no hemos hecho
00:22:00
el fichero de configuración
00:22:01
el xml famoso
00:22:02
o el json
00:22:03
no lo hemos hecho
00:22:04
todavía no sabemos
00:22:05
dónde lo mandará
00:22:06
pero él manda un mensaje
00:22:06
¿por qué hay diferentes métodos
00:22:08
para enviar un mensaje?
00:22:10
porque el mensaje es el mismo
00:22:12
pero tu aplicación
00:22:14
puede decidir en qué nivel
00:22:15
de tu fase
00:22:18
de desarrollo estás
00:22:20
entonces, hay seis niveles
00:22:21
el de
00:22:24
traza, que es cuando lo quieres
00:22:25
estás en un nivel en el cual te interesa
00:22:27
todo, el de
00:22:29
dibujo, estás en nivel de depuración
00:22:31
te interesa todo, pero no tanto
00:22:33
el de info, cuando ya estás
00:22:34
el nivel de info
00:22:37
es cuando ya la aplicación está en explotación
00:22:39
ahora vemos qué significa
00:22:41
el nivel de aviso, el de error
00:22:42
y el de fatal, que es la cagado.
00:22:44
Entonces, tú puedes
00:22:46
configurar tu herramienta log
00:22:48
a través del fichero de configuración
00:22:50
xml, como lo configuraremos,
00:22:52
la puedes configurar a través de ese
00:22:54
fichero xml para que
00:22:56
esté en alguno de estos niveles
00:22:58
en el que tú quieras.
00:23:00
Entonces, yo aquí dejo estos
00:23:02
seis mensajes.
00:23:04
Y yo pongo, a través de mi fichero xml,
00:23:06
lo pongo, voy a configurarme
00:23:08
ahora mismo en nivel trazo.
00:23:10
¿Eso qué significa?
00:23:12
que el logger va a enviar
00:23:13
los de traza y todos
00:23:15
los superiores. Este es el más bajo,
00:23:18
este viene después, este es
00:23:20
un nivel superior, este y este.
00:23:22
Sin embargo, yo ahora ya no estoy en fase
00:23:23
de desarrollo de mi aplicación
00:23:25
y no quiero enviarlos de traza.
00:23:27
Esos no quiero. ¿Vengo
00:23:30
a la aplicación a borrarlos? No.
00:23:31
Venir al código a cambiar cosas, eso es justo lo que no
00:23:33
queremos. Me voy a mi aplicación
00:23:35
de configuración, perdón,
00:23:37
me voy al XML y le digo, ya no
00:23:39
estoy en nivel de traza. Súbeme a nivel
00:23:41
de debug. Le pongo a debug. Con lo cual
00:23:44
este sigue estando
00:23:46
en esta línea de código. Pero ya
00:23:47
el logger, como ve en la configuración
00:23:49
que tú estás en nivel de debug,
00:23:51
este no lo envía. Solo envía
00:23:53
los de debug y superiores.
00:23:56
Que ya estás
00:23:58
en un nivel que ya los detalles te dan igual.
00:23:59
Y oye, yo no quiero ni avisos.
00:24:02
Pones en el XML
00:24:04
tu nivel de log a error.
00:24:05
Entonces, aunque estos
00:24:08
sigan estando en la aplicación,
00:24:09
solamente los va a enviar
00:24:11
los que sean de error y de fatal
00:24:14
solo, entonces estos nunca
00:24:17
los quitamos, porque en la fase
00:24:19
de explotación de la aplicación
00:24:21
si hay errores, queremos que se
00:24:22
registren, pero no vamos
00:24:25
a querer que se registren todos los avisos
00:24:27
las depuraciones, porque nos
00:24:29
quedarían los archivos de logs enormes
00:24:31
y el pobre técnico se volvería loco
00:24:32
pero cuando estamos todavía
00:24:35
depurando la aplicación, si queremos
00:24:37
que llegue todo, para tenerlo todo
00:24:39
muy detallado. Entonces, ahí pondríamos en el
00:24:41
XML que el nivel de
00:24:43
log quiero que sea este, por ejemplo.
00:24:45
O este. ¿Vale?
00:24:47
Pero en el código no lo cambiamos. En el código
00:24:49
todos los mensajes que
00:24:51
uno ponga, mejor. Estos serían como los
00:24:53
system out. Todos los que pongas
00:24:55
en cualquier sitio, fenomenal.
00:24:57
Esos nunca los vas a quitar.
00:24:59
Luego tú ya lo que haces en el XML
00:25:01
es bajar el nivel y decidir cuáles
00:25:02
se van a ejecutar realmente
00:25:05
y cuáles no. ¿Vale?
00:25:06
Y al final los metes en los
00:25:08
Claro, claro
00:25:10
Efectivamente, en cualquier punto que quieras dejar registro
00:25:13
De aquí ha pasado esto, aquí no sé qué, en cualquier lado
00:25:15
Entonces, nosotros ahora no tenemos fichero de configuración
00:25:17
Pero una
00:25:20
Si log4j
00:25:21
Cuando arranca
00:25:23
Ve que no tiene fichero de configuración
00:25:24
Se configura por defecto
00:25:28
O debería
00:25:30
No sé esta nueva versión
00:25:31
Se configura por defecto
00:25:34
Para que
00:25:36
El error, el nivel se ponga en error
00:25:37
y la salida
00:25:40
de los logs sea solo por consola.
00:25:43
Como no le hemos dado ningún fichero,
00:25:45
entonces vamos a ejecutarlo y tenemos suerte
00:25:47
y con las dependencias que hemos
00:25:48
puesto, esto nos funciona.
00:25:51
Magnífico.
00:25:59
Ha pasado lo que yo preveía
00:25:59
que pasara, menos mal, porque si no...
00:26:00
Claro, ha enviado solo
00:26:03
estos dos, porque por
00:26:04
defecto él se configura a nivel error.
00:26:06
Como no he encontrado ningún fichero de configuración,
00:26:09
estos los ha ignorado
00:26:10
y como no le he configurado
00:26:12
ningún fichero ni nada, me lo ha sacado por
00:26:15
console y me lo ha sacado
00:26:17
en un formato por defecto
00:26:19
este formato lo podemos cambiar
00:26:21
¿vale? si queremos tener el fichero
00:26:23
de configuración
00:26:25
vale
00:26:26
de nuevo
00:26:27
la ventaja que tiene esto
00:26:33
es que no tenemos
00:26:36
que entrar al código a cambiar nada
00:26:38
si nosotros depuráramos con los ISO
00:26:40
menudo desastre, cuando yo ya llevo la aplicación
00:26:42
a producción, tendría que entrar
00:26:44
en el código, quitar los ISO
00:26:46
para que no me salgan en la consola
00:26:48
cuando ya la aplicación está ejecutando
00:26:51
claro, sin embargo aquí
00:26:52
yo el código no lo voy a tocar
00:26:54
claro
00:26:56
en el archivo de configuración
00:26:58
lo cambiamos para que ya no salga por consola
00:27:00
todo se hace por configuración
00:27:02
entonces en el log4j original
00:27:03
si tú ibas al fichero de configuración
00:27:06
al que todavía no tenemos
00:27:10
y le cambiabas algo
00:27:11
pues tenías que desplegar
00:27:13
la aplicación otra vez
00:27:17
no tocar el código, eso no
00:27:18
pero tenías que rearrancar la aplicación
00:27:20
para que se configurara con los nuevos cambios
00:27:23
eso es un rollo
00:27:25
cada vez que cambias un fichero de configuración
00:27:26
sea XML, Properties
00:27:29
tener que reiniciar la aplicación
00:27:30
para que se cojan los nuevos cambios
00:27:32
pues es un rollo
00:27:33
Entonces, las versiones actuales de los frameworks lo que permiten es que ese propio framework, cada ciertos segundos que tú lo configuras, va mirando a ver si tiene que recargar algo.
00:27:35
Pues, esa es una ventaja que tienen los 4J2, que tú cambias algo en el fichero XML y no tienes que preocuparte de reiniciar la aplicación.
00:27:50
el propio log4jl
00:27:57
tiene ahí su hilo paralelo
00:28:00
que cada cierto tiempo que tú configuras
00:28:01
también el fecho de configuración, cada 10 segundos
00:28:03
cada 20, cada 15, cada 3 minutos
00:28:06
está ahí, has cambiado
00:28:08
has cambiado, te actualiza
00:28:10
¿vale?
00:28:11
así que nos despreocupamos
00:28:13
que queremos cambiar el log
00:28:15
te vas al xml, lo cambias
00:28:17
y ya está, no tienes que hacer nada
00:28:19
en la aplicación, ¿vale?
00:28:21
bueno, entonces en un caso real
00:28:23
no queremos mandarlo a consola
00:28:25
queremos mandarle un fichero, pues entonces
00:28:27
ahora ya sí que tenemos que
00:28:29
ponerle un fichero de configuración
00:28:30
uno se aprende cómo se hace ese fichero
00:28:32
imposible, coges uno
00:28:35
que ya está por ahí y lo cascas y lo adaptas
00:28:36
¿vale?
00:28:40
claro
00:28:41
entonces
00:28:42
podríais coger el mío
00:28:44
que lo subo en un pispas
00:28:47
al aula virtual o podríamos
00:28:48
pedirle uno a ChaGPT
00:28:51
os gusta más ChaGPT
00:28:52
que yo, ¿verdad?
00:28:55
No, pero es por probar.
00:28:56
Ya, venga, vamos a decirle, venga, yo también prefiero pedir su HGPT porque es lo que vais a hacer siempre, ¿no?
00:28:57
Entonces, y así me ahorro subirlo a la ola virtual.
00:29:12
Bueno, lo voy a subir igualmente, pero puede ser.
00:29:17
Venga, ¿qué queréis? ¿Lista de recetas?
00:29:22
O datos jurídicos sobre la historia de España.
00:29:26
¿Me das un ejemplo de los4j2.xml?
00:29:29
Eso sí, se tiene que llamar así,
00:29:37
nada de cambiarlo de nombre.
00:29:40
Para que los4j2 lo encuentre,
00:29:42
él lo va a buscar por este nombre.
00:29:45
Si es Jason, los4j2.jason.
00:29:47
Si es yaml, los4j2.xml.
00:29:50
Vale.
00:29:52
¿Me das un ejemplo?
00:29:53
que configure tanto appenders fichero como fichero secuencial como consola y configure
00:29:56
Por separado el logger de una clase.
00:30:22
Venga, ¿me lo das?
00:30:29
Por favor.
00:30:31
Claro que sí, hombre.
00:30:35
Sin rotación.
00:30:39
Uy, yo lo quería con rotación.
00:30:40
Qué fallo.
00:30:41
Lo vemos con rotación.
00:30:42
Pídeselo con rotación, hombre.
00:30:43
Vale.
00:30:46
De la rotación.
00:30:47
Venga.
00:30:48
¿Para qué?
00:30:48
Vamos a copiarlo y lo cascamos en nuestro...
00:30:49
Ahora, ahora lo vemos.
00:30:51
a ver si yo sé interpretar
00:30:52
lo que nos ha generado
00:30:56
pero bueno
00:30:57
sí
00:30:57
aquí puedes ver el misterio secuencial
00:31:02
rotativo, así te saca
00:31:10
algo más guay
00:31:13
y se vuelve loco
00:31:13
como el cubo
00:31:18
en videojuego
00:31:20
vale, pues entonces
00:31:21
vamos a copiarlo
00:31:29
venga, pues ya está
00:31:31
este mismo que nos ha generado
00:31:41
¿dónde lo metemos?
00:31:42
en recursos, para que
00:31:45
la herramienta los4j lo encuentre
00:31:47
va a arrancar, tiene que estar
00:31:49
en una ruta del classpath
00:31:51
donde están todas las clases accesibles
00:31:52
para la máquina virtual
00:31:55
resources es una ruta
00:31:57
del classpad, pues ese es el sitio
00:31:59
maravilloso para poner los ficheros de configuración
00:32:01
¿que era con rotación secuencia o algo así?
00:32:03
nada, con cualquier cosa, da igual
00:32:06
entonces vamos a crear
00:32:07
aquí un nuevo fichero
00:32:09
que va a ser
00:32:10
log4j2.xml
00:32:14
y vamos a
00:32:19
pegar lo que nos ha dado
00:32:25
Que no sale nada rojo
00:32:27
Qué suerte hemos tenido
00:32:30
Dentro de la carpeta resources
00:32:31
Te creas un archivo
00:32:38
De nombre los4j2xml
00:32:40
Y pegas el código
00:32:42
Que te ha dado ChagPT
00:32:44
Podemos cambiar de guía en algún momento
00:32:45
Hay que usar ChagPT
00:32:51
Yo qué sé, si yo solo uso esa
00:32:52
No lo sé, pero hay algunas chinas
00:32:55
Por ahí muy chulas, ¿no?
00:32:57
Dicen
00:32:58
¿Cuál?
00:32:59
¿Cuál recomendáis vosotros?
00:33:04
¿Ya GPT?
00:33:07
Vale
00:33:09
Bueno, para cosas de desarrollo
00:33:10
No sé cuál será mejor, yo solo he usado esta
00:33:18
Bueno, Gemini alguna vez
00:33:20
Vale, pues a ver
00:33:21
Vamos a ver
00:33:23
aquí hay
00:33:27
dos cosas básicas
00:33:29
los appenders
00:33:31
y los loggers
00:33:33
y luego habría una cosa
00:33:36
que son los layouts, pero creo que no nos han metido
00:33:37
layouts ahí, es igual
00:33:39
new file, botón derecho, new file
00:33:41
vale, ¿qué son los appenders?
00:33:45
los appenders son
00:33:50
los sitios
00:33:52
por donde los loggers
00:33:54
Pueden enviar mensajes
00:33:55
Por defecto el appender
00:33:57
Si estaba sin configurar
00:34:00
Hemos visto que es la consola
00:34:02
Por defecto
00:34:03
Pero aquí en el blog 4j2xml
00:34:04
Ponemos todos los appenders que queramos
00:34:06
Aquí hemos
00:34:09
Aquí él me ha hecho
00:34:11
Tres appenders
00:34:12
Un appender consola
00:34:14
Para sacar por consola
00:34:17
Al que le da el nombre consola
00:34:18
Y le da este aspecto
00:34:21
le podéis cambiar el aspecto
00:34:23
y en lugar de que me salga el año
00:34:26
con cuatro cifras que es
00:34:28
que es muy largo, los segundos
00:34:30
tampoco me interesan tanto,
00:34:32
aunque yo no sé si este lo entiende, horas, minutos,
00:34:34
yo que sé, uno cambia
00:34:37
y hace aquí lo que le dé la gana.
00:34:38
Vale.
00:34:41
El nivel, el mensajito,
00:34:42
esta es la variable mensajito
00:34:44
del parámetro, del método log.
00:34:46
Bueno.
00:34:48
Normalmente uno aquí no cambia nada y ya está.
00:34:50
¿Qué otros posibles
00:34:52
Appenders me ha configurado?
00:34:54
El Appender
00:34:57
Ah, pues sí que me lo ha puesto rotativo
00:34:58
Espera, vamos a pasar
00:35:00
Primero del rolling file, vamos a este
00:35:02
El fichero
00:35:03
Un fichero normal
00:35:06
Lo ha llamado fichero secuencial
00:35:07
Fichero normal
00:35:09
¿Dónde se va a encontrar?
00:35:10
Él me ha dicho en la carpeta logs
00:35:14
Tendrá, log4j
00:35:15
La creará, la primera vez que lo usamos la creará
00:35:18
pues en la carpeta logs
00:35:20
secuencial.log
00:35:22
se va a llamar
00:35:24
luego en el archivo secuencial.log
00:35:25
es donde va a meter esos logs
00:35:27
¿vale? dentro de
00:35:29
la carpeta logs
00:35:31
lo va a meter y ahí hay detallitos de aspecto
00:35:33
append
00:35:36
vale
00:35:37
append true está claro
00:35:39
te los voy añadiendo
00:35:41
te voy sobre escribiendo
00:35:43
no menos añadelos
00:35:45
¿vale? bueno
00:35:46
y el otro posible
00:35:48
appender, el otro tipo posible
00:35:51
de appender, es este
00:35:53
rotativo
00:35:54
porque claro, si ponemos como appender
00:35:55
un fichero normal, es que
00:35:59
ese fichero llegará a un momento dentro de dos
00:36:01
meses que sea gigante
00:36:03
¿no?
00:36:05
porque todos los días, enviando todos los días
00:36:06
enviando, al cabo de dos meses
00:36:08
ese fichero es gigantesco
00:36:11
entonces podemos hacer un appender que sea
00:36:12
fichero rotativo
00:36:15
que
00:36:16
se va a llamar así el primero
00:36:18
pero luego
00:36:21
cada vez que te saltes de 10 megas
00:36:22
o la cantidad que uno le quiera poner aquí
00:36:24
2 gigas
00:36:27
o cada vez que te saltes de día
00:36:28
aunque eso no viene por defecto
00:36:30
¡Uy, qué listo! Me lo pone en comentarios
00:36:32
La verdad es que es súper útil este
00:36:35
Nos lo ha dicho
00:36:37
Cada vez que te saltes de día
00:36:38
o cada vez que te saltes de este tamaño
00:36:41
él te crea un fichero
00:36:43
nuevo
00:36:45
Con el nombre
00:36:45
Aplicación.log
00:36:48
Pero al que le añade
00:36:50
Lo que hayamos puesto aquí
00:36:51
El año
00:36:53
El nombre de los ficheros que te va
00:36:54
Creando
00:36:58
Tendrán este formato
00:36:59
Si nos parece muy feo
00:37:01
Se lo cambiamos
00:37:03
Entonces el rolling file mejor
00:37:04
Porque así no tenemos
00:37:06
Un fichero enorme
00:37:08
Vale, estos son los posibles
00:37:11
Los posibles a perder
00:37:13
ahora otra cosa son
00:37:15
los logger
00:37:17
a que aprender van a ir
00:37:19
bueno pues
00:37:21
logger, hay logger
00:37:23
por clase
00:37:25
veis, este logger
00:37:26
voy a borrar esto, este es el logger
00:37:28
de la clase main
00:37:31
este es el logger de mi clase main
00:37:33
si yo tengo más clases
00:37:35
habrá logger de sus propias clases
00:37:38
¿vale? pero luego está
00:37:40
un logger general
00:37:42
un superlogger, logger máximo,
00:37:43
que es el que manda
00:37:46
en todas. Pues ese
00:37:47
logger máximo se
00:37:49
configura aquí abajo
00:37:51
o debería
00:37:53
configurarse aquí
00:37:55
abajo, aquí.
00:37:57
Donde pone
00:38:00
logger raíz. Entonces,
00:38:01
este es el superlogger.
00:38:04
Aquí ponemos
00:38:06
el nivel que queremos.
00:38:07
Como hemos puesto
00:38:10
info, pues
00:38:11
solo se van a salir de info adelante.
00:38:13
El trace y el debug no van a salir, pero esto lo
00:38:15
cambiamos cuando nos dé la gana.
00:38:17
Y aquí ponemos a dónde
00:38:19
queremos que salgan esos logos.
00:38:21
¿Hay algún método desde dentro
00:38:24
que te cambie el fichero de configuración?
00:38:25
Es que
00:38:30
justo sería lo contrario.
00:38:31
Entonces, cambiar un fichero de configuración
00:38:33
desde el código es justo lo
00:38:35
contrario a lo que perseguimos.
00:38:37
Vale.
00:38:40
A lo mejor en una parte del programa te interesa que tenga más
00:38:40
Bueno, pero es que tú entonces haces
00:38:42
No lo sé
00:38:47
O sea, que una parte del programa
00:38:51
Use un log4 y otra parte use otro
00:38:55
Si se puede, no lo he visto nunca
00:38:57
Vale, entonces
00:39:01
Aquí uno pone tantos
00:39:03
Appenders como quiera
00:39:04
O sea, los superloggers de todos
00:39:06
Van a ir tanto a consola como a este
00:39:08
como no nos vamos a pasar de 10 megas nunca
00:39:11
ni de día
00:39:13
no vamos a estar aquí mandando logs hasta mañana
00:39:15
para verlo, pues no vamos a ver
00:39:17
el cambio, pero da igual, se va a ver el primer fichero
00:39:19
y ya está. Ahora, este es el
00:39:21
superlogger, pero uno podría
00:39:23
hacer eso ya así
00:39:25
configurar un logger
00:39:27
específico para cada clase
00:39:29
que eso ya sí que tiene relación con lo que tú me
00:39:30
estás diciendo, pero de otra manera, que es
00:39:33
oye, espérate, que yo quiero que mi clase
00:39:34
que en este caso mi clase
00:39:37
con dam2.main
00:39:39
quiero que mi clase funcione
00:39:41
de otra manera, esta clase, solo esta
00:39:43
esta me interesa que vaya
00:39:45
como debug, vale
00:39:47
pues entonces yo a esta clase
00:39:49
si quiero, la configuro
00:39:50
especialmente a ella
00:39:53
¿vale?
00:39:54
claro, entonces
00:39:57
todos los logger
00:39:59
de esta, todos los mensajes
00:40:01
de esta clase, les aplica a este nivel
00:40:03
mientras que al resto
00:40:05
les aplicará esto
00:40:07
y ahí puedes crear varios
00:40:09
para distintas clases
00:40:13
puedes crear varios
00:40:13
de tantos logger
00:40:14
claro
00:40:15
como tú puedes hacer
00:40:15
un logger por clase
00:40:17
pues puedes hacer
00:40:18
tantos logger por clase
00:40:20
y también podríamos hacer
00:40:21
poner aquí un paquete
00:40:22
en lugar de una clase
00:40:23
por ejemplo
00:40:25
pongo yo aquí
00:40:26
condandos
00:40:26
y esto aplica
00:40:27
a todas las clases
00:40:28
de ese paquete
00:40:29
vale, bueno
00:40:29
esperamos que
00:40:31
o sea, nos vamos
00:40:32
que os veo
00:40:32
con mucha prisa
00:40:33
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 21
- Fecha:
- 10 de octubre de 2025 - 12:30
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 40′ 37″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 183.20 MBytes