La Marta escriu a les 09:12: «Ahir a la nit, cap a les tres, el web estava donant errors. Què va passar?». Aquesta pregunta té resposta exacta o no en té, i la diferència la marca el que haguessis fet abans que passés. Un servidor no recorda res: l'única cosa que queda de la matinada és el que es va escriure en algun lloc, amb la marca de temps correcta, sense que s'hagi rotat, truncat ni perdut en el reinici. Aquesta lliçó va d'això. I salda de passada el primer deute que vaig anunciar en tancar el Mòdul 4: /var/log/tramontana/acces.log porta 412 línies creixent sense que ningú el roti, i el dia que ompli /var s'endurà per davant l'aplicació sencera.
Contingut
- Les dues capes de registre que conviuen a Ubuntu
- Facilities i severities de syslog
journalctla fons- Persistència del journal
/etc/systemd/journald.confi el control de la mida- Els fitxers clàssics de
/var/log - Escriure al registre des dels teus scripts amb
logger logrotate: per què i com- El problema del fitxer obert després de rotar
- Centralització de registres
- Què NO ha d'acabar MAI en un registre
- Cas Tramontana: rotació i la resposta per a la Marta
- Les dues capes de registre que conviuen a Ubuntu
En una Ubuntu 24.04 acabada d'instal·lar hi ha dos sistemes de registre funcionant alhora, i entendre el repartiment evita molta confusió:
systemd-journald |
rsyslog |
|
|---|---|---|
| Format | Binari, estructurat, amb camps i índex | Text pla, una línia per esdeveniment |
| On escriu | /run/log/journal o /var/log/journal |
/var/log/syslog, auth.log, kern.log… |
| Es consulta amb | journalctl |
grep, less, awk |
| Metadades | Unitat, PID, UID, cgroup, executable, boot ID… | Les que càpiguen a la línia |
| Rotació i enviament remot | Interna, per mida i temps; systemd-journal-remote |
logrotate; enviament remot natiu i madur (TCP/TLS) |
El flux real: tot el que un servei gestionat per systemd escriu a stdout i stderr ho captura journald, juntament amb el que arriba pel sòcol /dev/log i els missatges del nucli. Journald ho guarda amb les seves metadades i, a més, ho reenvia a rsyslog (ForwardToSyslog=yes), que ho escriu als fitxers de text de sempre. Per això el mateix missatge apareix a journalctl i a /var/log/syslog.
Per què conservar les dues? El journal és incomparablement millor per consultar —filtra per unitat, per prioritat, per arrencada, per camp— i els fitxers de text són millors per al que ja saps fer amb grep, awk i sed, per a eines de tercers i per a l'enviament remot. En un servidor real hi convius amb tots dos.
- Facilities i severities de syslog
Aquest vocabulari ve dels anys 80 i continua viu perquè tota la indústria l'entén. Cada missatge porta una facility (d'on ve) i una severity (quant importa).
| Núm. | Severity | Quan |
|---|---|---|
| 0-1 | emerg / alert |
El sistema és inservible / cal actuar immediatament |
| 2 | crit |
Fallada greu: disc, maquinari |
| 3 | err |
El nivell que mires a diari |
| 4-5 | warning / notice |
Alguna cosa estranya que encara no trenca res / esdeveniment significatiu però normal |
| 6-7 | info / debug |
El curs normal de les coses / només mentre diagnostiques |
Facilities habituals: auth i authpriv (autenticació: sudo, sshd), cron, daemon (serveis), kern (nucli), mail, syslog, i local0–local7, reservades per a les teves aplicacions. Aquesta última és la clau pràctica: quan copia_tramontana.sh escrigui al registre, ho farà amb una facility local0 i una severity concordant, i així podràs filtrar els teus missatges sense arrossegar els del sistema.
journalctl a fons
journalctl a fonsÉs l'eina del dia a dia i val la pena aprendre-la bé, perquè substitueix mitja dotzena de grep.
journalctl # tot, paginat, des del missatge més antic
journalctl -e # anar directe al final (el més habitual); -n 50, les 50 últimes
journalctl -f # seguir en directe, el 'tail -F' del journal; -r inverteix l'ordre
journalctl --no-pager # sense paginador: per a scripts i per redirigirFiltrar per unitat, temps i prioritat
journalctl -u tramontana.service -f # seguir una unitat en directe
journalctl -u tramontana.service -u postgresql.service # diverses alhora
journalctl --since "1 hour ago"
journalctl --since yesterday --until "today 06:00"
journalctl --since "2026-08-18 03:00" --until "2026-08-18 03:30"
journalctl -p err # prioritat err o PITJOR (0..3)
journalctl -p warning..err # un rang de prioritatsLes expressions de temps accepten yesterday, today, tomorrow, now, -30min, "2 days ago" i dates absolutes. És una de les raons de pes per fer servir el journal: contestar «què va passar entre les 3:00 i les 3:30» amb fitxers de text exigeix un awk amb rangs; aquí són dues opcions.
Per arrencada i per nucli
journalctl --list-boots # les arrencades que es conserven; -b, només l'actual
journalctl -b -1 # l'arrencada ANTERIOR: què va passar abans del reinici
journalctl -k # només el nucli (com dmesg, però amb història)
journalctl -k -b -1 -p err # errors de nucli de l'arrencada anteriorjournalctl -b -1 respon a «el servidor s'ha reiniciat sol aquesta nit, per què?», i requereix journal persistent: justament el de l'apartat següent.
Camps estructurats
Cada entrada del journal no és una línia: és un conjunt de camps. Descobreix-los amb:
$ journalctl -u tramontana.service -n 1 -o verbose | head -9
Tue 2026-08-18 03:07:41.882145 CEST [s=9f2c...;i=3a1;b=7d4e...]
_UID=997
_COMM=tramontana
_EXE=/opt/tramontana/releases/3.2.1/bin/tramontana
_SYSTEMD_UNIT=tramontana.service
PRIORITY=3
SYSLOG_IDENTIFIER=tramontana
MESSAGE=db_timeout després de 30s (connexions_actives=200)Els camps que comencen per _ els afegeix journald, i per això són de fiar: una aplicació no els pot falsificar. Es fan servir com a filtre:
journalctl _PID=1284 ; journalctl _UID=997
journalctl _COMM=sudo # tot el que ha fet sudo; -t filtra per SYSLOG_IDENTIFIER
journalctl _SYSTEMD_UNIT=tramontana.service _PID=1284 # es combinen amb ANDFormats de sortida i cerca
journalctl -u tramontana.service -o cat # només el missatge, sense data ni amfitrió
journalctl -u tramontana.service -o short-iso # data ISO 8601, ordenable
journalctl -u tramontana.service -o json-pretty # per processar amb jq
journalctl -u tramontana.service --grep 'db_timeout' # regex sobre el MESSAGE
journalctl --disk-usage # quant ocupa el journal$ journalctl -u tramontana.service --since "2026-08-18 03:00" --until "03:30" -p err -o short-iso | head -3
2026-08-18T03:07:41+0200 srv-tramontana tramontana[1284]: db_timeout després de 30s (connexions_actives=200)
2026-08-18T03:11:02+0200 srv-tramontana tramontana[1284]: db_timeout després de 30s (connexions_actives=200)
2026-08-18T03:14:55+0200 srv-tramontana tramontana[1284]: db_timeout després de 30s (connexions_actives=200)Combinar filtres és l'essència de l'eina: unitat + finestra temporal + prioritat + format reproduïble, en una sola línia.
- Persistència del journal
Aquest és el detall que sorprèn tothom la primera vegada: per defecte, en moltes instal·lacions el journal és volàtil. Viu a /run/log/journal, que és un tmpfs a la RAM, i es perd sencer en reiniciar. Si el servidor va caure de matinada i el vas reiniciar, acabes de destruir l'única prova de per què va caure.
Si journalctl --list-boots només mostra una línia, aquell és el senyal d'alarma. Activar la persistència és trivial i és de les primeres coses que cal fer en un servidor nou:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald$ journalctl --list-boots
-1 7d4e1c... Mon 2026-08-17 08:14:02 CEST—Tue 2026-08-18 04:29:57 CEST
0 9a2b3f... Tue 2026-08-18 04:30:11 CEST—Tue 2026-08-18 12:03:44 CESTEls permisos del directori (2755 root:systemd-journal) els posa systemd-tmpfiles; aquell SGID de 05-02 és el que permet al grup systemd-journal —i a adm— llegir els fitxers que es creïn a dins.
/etc/systemd/journald.conf i el control de la mida
/etc/systemd/journald.conf i el control de la midaUn journal persistent sense límits és un /var ple esperant el seu torn. Els límits es fixen aquí:
# /etc/systemd/journald.conf (o millor, un fitxer a /etc/systemd/journald.conf.d/)
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=500M
SystemKeepFree=1G
SystemMaxFileSize=50M
MaxRetentionSec=30day
MaxFileSec=1day
RateLimitIntervalSec=30s
RateLimitBurst=10000
ForwardToSyslog=yes| Directiva | Què controla |
|---|---|
Storage |
persistent, volatile, auto (persistent si existeix /var/log/journal) o none |
SystemMaxUse / SystemKeepFree |
Sostre total del journal (per defecte el 10 % de la partició) / espai que sempre deixa lliure a /var |
SystemMaxFileSize / MaxRetentionSec |
Mida de cada fitxer abans de rotar / antiguitat màxima que es conserva |
RateLimitIntervalSec / RateLimitBurst |
Quants missatges per servei i per interval s'accepten |
Aquest últim parell mereix un avís seriós: amb els valors per defecte, un servei que emeti més de 10.000 missatges en 30 segons veurà com journald en descarta la resta en silenci, deixant només una nota de quants n'ha suprimit. Justament en una tempesta d'errors, que és quan més els necessites. Si la teva aplicació pot ser sorollosa en un incident, apuja RateLimitBurst o desactiva'l (RateLimitIntervalSec=0) assumint-ne el cost en disc.
sudo cp -a /etc/systemd/journald.conf{,.bak-$(date +%F)} # i després editar
sudo systemctl restart systemd-journald && journalctl --disk-usage
sudo journalctl --vacuum-size=300M # retallar ara fins a 300 MiB
sudo journalctl --vacuum-time=15d # o esborrar el que sigui anterior a 15 dies
- Els fitxers clàssics de
/var/log
/var/log| Fitxer | Contingut |
|---|---|
syslog / kern.log |
Calaix general de rsyslog / missatges del nucli |
auth.log |
Autenticació: sudo, sshd, su, canvis de contrasenya. El primer que es mira |
dpkg.log i apt/history.log |
Què es va instal·lar, quan i qui ho va demanar (05-03) |
wtmp / btmp / lastlog |
Sessions obertes / intents fallits / últim accés per compte |
Els tres últims són binaris: un cat sobre ells escup brossa i pot desconfigurar-te el terminal. Es llegeixen amb les seves eines:
$ sudo lastb -n 3 # intents d'accés FALLITS
admin ssh:notty 203.0.113.44 Tue Aug 18 02:14 - 02:14 (00:00)
root ssh:notty 203.0.113.44 Tue Aug 18 02:14 - 02:14 (00:00)
$ last -n 2 # accessos correctes
operador pts/0 10.0.2.1 Tue Aug 18 09:02 still logged inUna tirallonga de lastb contra root des d'una IP estrangera és exactament el tipus de senyal que a 06-03 aprendràs a tallar amb fail2ban.
- Escriure al registre des dels teus scripts amb
logger
loggerEls teus scripts del Mòdul 4 escriuen a /var/log/tramontana/cron-copia.log perquè no sabies fer una altra cosa. logger envia el missatge al mateix lloc que la resta del sistema, amb la seva prioritat i la seva etiqueta:
logger -t backup "còpia completada" # etiqueta i info
logger -t backup -p local0.err "fallada en xifrar" # facility.severity
logger -t backup -s -p local0.warning "espai baix" # -s: també a stderrAra modifiquem log() i error() de lib/comuns.sh perquè, a més del seu fitxer, escriguin al journal:
# lib/comuns.sh — versió connectada al journal
readonly ETIQUETA_LOG="${ETIQUETA_LOG:-$(basename "${0%.sh}")}"
log() {
local missatge="$*"
printf '[%s] %s\n' "$(date --iso-8601=seconds)" "$missatge" >>"$FITXER_LOG"
logger -t "$ETIQUETA_LOG" -p local0.info -- "$missatge"
}
error() {
local missatge="$*"
printf '[%s] ERROR: %s\n' "$(date --iso-8601=seconds)" "$missatge" >&2
logger -t "$ETIQUETA_LOG" -p local0.err -- "$missatge"
}El -- abans del missatge evita que un text que comenci per guionet s'interpreti com a opció, seguint la disciplina de 04-03. I com que l'script ara corre dins de tramontana-copia.service (05-05), tot el que escrigui a stdout també acaba al journal d'aquella unitat, amb les seves metadades:
$ journalctl -u tramontana-copia.service --since today -o short-iso | tail -3
2026-08-18T04:20:07+0200 srv-tramontana backup[8842]: inici de còpia (versio=3.2.1)
2026-08-18T04:23:51+0200 srv-tramontana backup[8842]: sha256 verificat
2026-08-18T04:23:51+0200 srv-tramontana backup[8842]: còpia completada en 224sAmb això, la pregunta «es va fer la còpia ahir a la nit?» és una ordre, no una investigació.
logrotate: per què i com
logrotate: per què i comUn registre sense rotar creix fins a omplir la seva partició. Quan /var s'omple, l'aplicació no pot escriure, la base de dades no pot confirmar transaccions i el sistema mateix deixa de registrar el desastre. La rotació no és neteja: és disponibilitat.
logrotate s'executa a diari mitjançant logrotate.timer (systemd, ja el saps llegir), llegeix /etc/logrotate.conf i tot el d'/etc/logrotate.d/, i per a cada fitxer decideix si toca rotar.
| Directiva | Què fa |
|---|---|
daily / weekly / monthly |
Cada quant es rota; rotate N, quantes còpies es conserven |
size 100M / maxsize 100M |
Rota en superar aquella mida ignorant la periodicitat / rota en l'execució periòdica o abans si la supera |
compress / delaycompress |
Comprimeix amb gzip / a partir de la segona rotació, deixant .1 sense comprimir |
missingok / notifempty |
Si no existeix, no protesta / no rota si està buit |
create MODE USUARI GRUP |
Crea el fitxer nou amb aquells permisos |
su USUARI GRUP |
Amb quina identitat opera logrotate en aquell directori |
sharedscripts |
Executa postrotate una vegada encara que el patró casi amb diversos fitxers |
postrotate … endscript / dateext |
Ordres després de rotar / anomena les còpies amb la data en lloc de .1 |
Provar sempre abans de confiar-hi, seguint la convenció de simular abans d'actuar:
sudo logrotate -d /etc/logrotate.d/tramontana # simulació: no toca res
sudo logrotate -f /etc/logrotate.d/tramontana # forçar la rotació ara
cat /var/lib/logrotate/status | grep tramontana # quan es va rotar per última vegada
- El problema del fitxer obert després de rotar
Aquí connecta amb el que vas veure a 05-04 amb lsof +L1. Quan logrotate fa mv acces.log acces.log.1, el procés que el tenia obert continua escrivint al mateix inode: el fitxer nou es queda a zero per sempre i el vell continua creixent, ara invisible. Hi ha dues solucions i cal triar amb criteri:
| Solució | Com | Avantatge | Inconvenient |
|---|---|---|---|
| Senyal al procés | postrotate amb kill -USR1 o systemctl reload |
Sense pèrdua de dades, sense còpia | L'aplicació ha de saber reobrir el seu registre |
copytruncate |
Copia el fitxer i trunca l'original a zero | No requereix res de l'aplicació | Es perden les línies escrites entre la còpia i el truncament, i duplica el fitxer al disc |
La regla: si l'aplicació sap reobrir el seu registre, fes servir el senyal; copytruncate és l'últim recurs per a programari que no col·labora.
- Centralització de registres
Amb un servidor, journalctl n'hi ha prou. Amb dos ja no: correlacionar un error del balancejador amb un altre de l'aplicació entrant per SSH a cada màquina és inviable, i a més els registres locals desapareixen quan la màquina es compromet o es perd, que és justament quan més falta fan. Panorama d'opcions, sense muntar-les aquí:
- rsyslog remot: la via clàssica i lleugera,
*.* @@servidor:6514sobre TCP amb TLS. Madura i suficient per a molts casos. systemd-journal-remote/-upload: conserva l'estructura del journal entre màquines, ambjournalctl -mper consultar-ne diverses.- Piles d'observabilitat tipus Loki + Promtail + Grafana, o Elasticsearch + Logstash + Kibana: cerca, taulers i alertes, a canvi d'operar una infraestructura que consumeix més recursos que el servei mateix.
Un principi que no canvia: la destinació remota ha de ser append-only per a qui envia. Si un atacant que entra a srv-tramontana pot esborrar els registres del servidor central, la centralització no aporta res forense.
- Què NO ha d'acabar MAI en un registre
Advertiment de compliment (RGPD). Els registres es copien, s'envien fora de la màquina, es conserven mesos i els llegeix molta més gent que les dades de producció. Mai no han de contenir contrasenyes, tokens, claus d'API, galetes de sessió, números de targeta ni dades personals dels hostes de Tramontana (nom complet, correu, telèfon, document d'identitat). Registrar
hoste_id=1017és correcte; registrarhoste=Ana Pérez, [email protected]converteix el teu fitxer de registre en un fitxer amb dades personals, amb totes les obligacions que això arrossega. La política de retenció —quant de temps es guarda cada tipus de registre— és una decisió legal abans que tècnica i l'ha de validar el responsable de protecció de dades o de compliment, tenint en compte que hi ha registres amb mínims legals de conservació i altres amb màxims.
Mesures concretes i barates: revisa què escriu la teva aplicació en nivell debug abans d'activar-lo en producció; comprova que les URL registrades no porten tokens a la query string; limita /var/log/tramontana al grup adm amb l'ACL de 05-02; i fixa la retenció a logrotate i a journald.conf en lloc de deixar-la a l'atzar.
- Cas Tramontana: rotació i la resposta per a la Marta
/etc/logrotate.d/tramontana
# /etc/logrotate.d/tramontana — rotació dels registres de Tramontana Reserves
/var/log/tramontana/*.log {
daily
rotate 14
maxsize 100M
compress
delaycompress
missingok
notifempty
dateext
dateformat -%Y-%m-%d
create 0640 svc-tramontana adm
su root adm
sharedscripts
postrotate
/usr/bin/systemctl reload tramontana.service > /dev/null 2>&1 || true
endscript
}Cada línia té el seu perquè: rotate 14 amb daily dona dues setmanes d'història, que és el que s'ha acordat amb la Marta; maxsize 100M protegeix del pic —un atac o un bucle d'errors poden generar 100 MiB en una tarda i no volem esperar fins demà—; create 0640 svc-tramontana adm reprodueix exactament els permisos que necessita l'aplicació per escriure i el grup adm per llegir; su root adm és obligatori quan el directori no pertany a root, o logrotate es nega a actuar per seguretat; sharedscripts evita recarregar el servei cinc vegades (una per fitxer); i el postrotate fa servir systemctl reload, que l'aplicació tradueix en reobrir els seus fitxers de registre, evitant copytruncate i la pèrdua de línies.
Verificació obligatòria abans de donar-ho per bo:
$ sudo logrotate -d /etc/logrotate.d/tramontana 2>&1 | tail -6
rotating pattern: /var/log/tramontana/*.log after 1 days (14 rotations)
considering log /var/log/tramontana/acces.log
Now: 2026-08-18 12:20
Log needs rotating
rotating log /var/log/tramontana/acces.log, log->rotateCount is 14
renaming /var/log/tramontana/acces.log to /var/log/tramontana/acces.log-2026-08-18$ sudo logrotate -f /etc/logrotate.d/tramontana && ls -l /var/log/tramontana/
-rw-r----- 1 svc-tramontana adm 0 Aug 18 12:21 acces.log
-rw-r----- 1 svc-tramontana adm 41283 Aug 18 12:21 acces.log-2026-08-18
$ sudo lsof +L1 | grep tramontana || echo "sense fitxers esborrats en ús: correcte"
sense fitxers esborrats en ús: correcteAquella última ordre és la prova que el postrotate va funcionar: si l'aplicació no hagués reobert el fitxer, hi apareixeria un (deleted) amb NLINK 0.
La resposta a la Marta
Ara la pregunta de les 03:00 es contesta en tres ordres:
$ journalctl --since "2026-08-18 02:50" --until "2026-08-18 03:30" -p err -o short-iso | head -2
2026-08-18T03:07:41+0200 srv-tramontana tramontana[1284]: db_timeout després de 30s (connexions_actives=200)
2026-08-18T03:09:12+0200 srv-tramontana tramontana[1284]: db_timeout després de 30s (connexions_actives=200)
$ journalctl --since "2026-08-18 02:50" --until "2026-08-18 03:30" -p err --no-pager | wc -l
15
$ awk '$2 >= "03:00" && $2 < "03:30" && $5 ~ /^5/' /var/log/tramontana/acces.log-2026-08-18 | wc -l
9Quinze errors a la franja de matinada, tots el mateix: db_timeout amb connexions_actives=200, que és exactament el valor de max_connexions a /etc/tramontana/app.conf. L'informe per a la Marta, amb l'estructura de sempre —què sabem, què protegeix i què no—: «Entre les 03:00 i les 03:30 hi va haver 15 errors del mateix tipus: l'aplicació va esgotar el seu límit de 200 connexions a la base de dades i les peticions van caducar als 30 s. Nou d'ells van arribar a retornar un 5xx a usuaris. No hi va haver caiguda del servei ni pèrdua de reserves confirmades. Els registres ja roten a diari i es conserven 14 dies, així que la propera vegada tindrem la traça completa. Falta esbrinar per què s'esgoten les connexions a aquella hora, i això ho mesurem a la propera revisió.»
sudo tee -a /opt/tramontana/HISTORIAL >/dev/null <<'FI'
2026-08-18 Registres (operador)
- journal persistent (/var/log/journal), SystemMaxUse=500M, MaxRetentionSec=30day
- /etc/logrotate.d/tramontana: daily, rotate 14, maxsize 100M, reload al postrotate
- lib/comuns.sh escriu també al journal via logger (local0)
- Incident 03:00-03:30: 15 x db_timeout amb connexions_actives=200. Pendent d'anàlisi.
FIErrors Comuns i Consells
- Donar per fet que el journal és persistent. Si
journalctl --list-bootsnomés mostra una arrencada, estàs perdent els registres a cada reinici. Crea/var/log/journalavui. - Rotar sense avisar el procés. El fitxer nou es queda buit i el vell continua creixent invisible.
lsof +L1el delata; fes servirpostrotateambreloado, en últim cas,copytruncate. - Oblidar el
suen unlogrotate.del directori del qual no és de root: logrotate ho rebutja per seguretat i deixa de rotar en silenci. Comprova-ho amblogrotate -d. rotate 0o una retenció mínima «per estalviar disc»: el dia de l'incident no tindràs res a mirar. Acorda la retenció amb qui la necessitarà.- Ignorar la limitació de tasa de journald. En una tempesta d'errors pots perdre justament els missatges que busques. Revisa
RateLimitBurstsi la teva aplicació és sorollosa. catsobrewtmpobtmp. Són binaris: es llegeixen amblastilastb. I no registris dades personals ni secrets: és una fuita amb format de fitxer de text, replicada a cada còpia de seguretat.- Consell: qualsevol script que corri sol ha de poder respondre «s'ha executat i amb quin resultat?» amb una ordre. Si no pot, li falta registre.
Exercicis
- La franja de matinada. Escriu una sola ordre que mostri, de l'arrencada anterior, únicament els missatges de prioritat
erro pitjor detramontana.serviceproduïts entre les 02:00 i les 06:00, en format amb data ISO, i una altra que compti quants n'hi va haver de cada missatge diferent. - Rotació per a un registre de tercers. Una eina escriu a
/var/log/analitica/esdeveniments.logcom l'usuarianalitica, no sap reobrir el seu fitxer i genera uns 30 MiB al dia. Escriu el seu fitxer delogrotate.djustificant cada directiva, i explica què perds amb la solució triada. - Auditoria d'accessos. Amb el que has vist, respon: quants intents fallits d'accés hi va haver ahir, des de quina IP, i quins usuaris s'hi van intentar? Dona les ordres i digues on viu cada dada.
Solucions
1.
journalctl -b -1 -u tramontana.service -p err \
--since "2026-08-18 02:00" --until "2026-08-18 06:00" -o short-iso$ journalctl -b -1 -u tramontana.service -p err --since "2026-08-18 02:00" \
--until "2026-08-18 06:00" -o cat --no-pager | sort | uniq -c | sort -rn
15 db_timeout després de 30s (connexions_actives=200)
3 backend no disponible (503)-o cat deixa només el text del missatge, que és el que permet agrupar amb sort | uniq -c; amb el format normal, la marca de temps faria única cada línia. És el mateix patró de recompte de 03-05, aplicat ara al journal.
2.
# /etc/logrotate.d/analitica
/var/log/analitica/esdeveniments.log {
daily
rotate 7
maxsize 50M
compress
delaycompress
missingok
notifempty
copytruncate
su analitica analitica
}daily amb rotate 7 dona una setmana, suficient per a 30 MiB diaris; maxsize 50M cobreix un pic sense esperar fins demà; compress amb delaycompress estalvia disc sense comprimir el fitxer que potser encara s'està escrivint; su analitica analitica és imprescindible perquè el directori no és de root; i copytruncate és l'única opció viable, ja que l'eina no sap reobrir el seu registre i no hi ha cap senyal que enviar-li.
El que es perd: les línies escrites entre la còpia i el truncament, que és una finestra petita però real, i el doble d'espai al disc durant aquell instant. No es fa servir create perquè amb copytruncate el fitxer original mai no es reanomena ni es recrea.
3.
$ sudo lastb -s yesterday | head -5 # /var/log/btmp: intents FALLITS
admin ssh:notty 203.0.113.44 Mon Aug 17 23:41 - 23:41 (00:00)
root ssh:notty 203.0.113.44 Mon Aug 17 23:41 - 23:41 (00:00)
$ sudo lastb -s yesterday --time-format notime | awk '{print $3}' | sort | uniq -c | sort -rn
47 203.0.113.44
2 10.0.2.1
$ sudo journalctl -u ssh.service --since yesterday --until today --grep 'Failed password' | wc -l
49Els intents fallits viuen en dos llocs complementaris: /var/log/btmp (binari, es llegeix amb lastb, guarda usuari, terminal, IP i hora) i el journal d'ssh.service, que a més dona el missatge exacte i permet filtrar per text. Quaranta-set intents des d'una sola IP en una nit no és un usuari despistat: és un atac de força bruta, i bloquejar-lo automàticament és matèria de 06-03.
Conclusió
srv-tramontana ja té memòria. Saps que a Ubuntu conviuen dues capes de registre —journald binari i estructurat, rsyslog en text pla— i per què el journal reenvia a syslog en lloc de substituir-lo; manegues les vuit severities i les facilities de syslog, incloses les local0–local7 reservades per al que és teu; i exprimeixes journalctl de debò: per unitat, en directe amb -f, per finestra temporal amb --since/--until, per prioritat amb -p, per arrencada amb -b -1, per nucli amb -k, per camps estructurats com _PID i _COMM, amb --grep i amb formats short-iso, cat i json-pretty.
Has fet el journal persistent —sense això, el reinici destrueix la prova— i li has posat sostre a journald.conf amb SystemMaxUse i MaxRetentionSec, sabent que la limitació de tasa pot empassar-se missatges justament en una tempesta d'errors. Reconeixes els fitxers clàssics de /var/log i llegeixes wtmp i btmp amb last i lastb. Els teus scripts escriuen al journal a través de logger des de lib/comuns.sh, i tramontana-copia.service respon per si sol a «es va fer la còpia ahir a la nit?».
I el deute del Mòdul 4 està pagat: /etc/logrotate.d/tramontana existeix, està provat en simulació amb logrotate -d, rota a diari conservant catorze dies, comprimeix, recrea el fitxer amb 0640 svc-tramontana adm i recarrega el servei al postrotate perquè cap procés no continuï escrivint en un inode orfe. Saps què mai no ha d'acabar en un registre i que la retenció és una decisió legal abans que tècnica.
Queda l'altra meitat de la pregunta de la Marta. Saps què va passar a les tres de la matinada —quinze db_timeout amb les 200 connexions esgotades—, però no per què, ni si el servidor anava just de CPU, de memòria o de disc en aquell moment, ni amb què comparar el que veus avui. A Monitoratge del Sistema i Optimització del Rendiment aprendràs el mètode USE aplicat als quatre recursos, interpretaràs de debò la càrrega mitjana, vmstat, free -h, iostat -xz i sar, sabràs quan ha actuat l'OOM killer i per què, establiràs una línia base de srv-tramontana, i aplicaràs un procediment numerat de diagnòstic a la queixa de la Marta que «el web va lent al matí» — on descobriràs que la còpia de seguretat i aquelles 200 connexions tenen més a veure del que sembla.
Curs de Linux: De Principiant a Administrador de Sistemes
Mòdul 1: Introducció a Linux
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
