logs, malditos logs
Tags: log, linux, shell, commands
Published: 2021-03-03 20:35:04

Qualquer um que mantenha aplicações rodando em servidores se depara com logs. Os logs podem, ao longo do tempo e devido à configurações inadequadas, tomar uma quantidade considerável de espaço no disco. E, em muitos casos, você precisa caçar os malditos logs. Então, vamos lá!

Breve contexto:

*Temos uma [VPS](https://pt.wikipedia.org/wiki/Servidor_virtual_privado) com aplicações web configuradas de forma desconhecida, com banco de dados, com alguns frameworks, container docker e várias outras coisas que você não faz ideia de como foram configuradas.*

O primeiro comando inútil que podemos usar é o **dh -kh**. Esse comando pode exibir a quantidade de espaço livre em disco em cada sistema de arquivos montado no servidor.


```bash
:~# dh -kh
Filesystem                    Size  Used Avail Use% Mounted on
udev                          3.7G     0  3.7G   0% /dev
tmpfs                         748M   75M  673M  10% /run
/dev/xvda1                     12G   11G  837M  93% /
tmpfs                         3.7G  4.0K  3.7G   1% /dev/shm
tmpfs                         5.0M     0  5.0M   0% /run/lock
tmpfs                         3.7G     0  3.7G   0% /sys/fs/cgroup
/dev/xvdc                      30G   45M   28G   1% /mnt
/dev/mapper/vg_data-data_vol   50G   12G   35G  25% /data
```
Diretório raiz / com menos de 1g disponível. Provavelmente o `/var/log` está ficando cheio. Vamos ver com calma. O próximo comando inútil é **ls | xargs du -hs**.

```bash
:~# cd /
:/# ls | xargs du -hs
0	proc
33M	root
75M	run
16M	sbin
8.0K	snap
8.0K	srv
0	sys
18M	tmp
2.4G	usr
8.3G	var
0	vmlinuz
0	vmlinuz.old
```
Muito bem, `/var` com 8.3G e o `/usr` com 2.4G. Maravilha!
Vamos ver o `/var`.

```bash
:/# cd var/
:/var# ls | xargs du -hs
4.0K	agentx
3.3M	backups
244M	cache
8.4M	chef
4.0K	crash
6.1G	lib
4.0K	local
0	lock
1.1G	log
23M	mail
912M	opt
0	run
4.0K	snap
1.8M	spool
88K	tmp
8.0K	www
```
OK! Mas, vamos adicionar um `| grep G` e filtrar um pouco isso.

```bash
:/var# ls | xargs du -hs | grep G
6.1G	lib
1.1G	log
```
Vamos para o `/log`

```bash
:/var# cd log/
:/var/log# ls | xargs du -hs | grep G
:/var/log#
```
Hummmm... sem arquivos com G (gigas). E com M (mega)?

```bash
:/var/log# ls | xargs du -hs | grep M
26M	apache2
169M	auth.log
9.9M	auth.log_13052020.tar.gz
74M	commvault
5.3M	dist-upgrade
2.8M	dpkg.log
14M	dynatrace
293M	kern.log
3.7M	kern.log_13052020.tar.gz
16M	mail.log
360M	syslog
54M	vsftpd.log
1.1M	wtmp
```
Aí sim hein! Acho que aqui já dá pra "esvaziar" alguns logs. E, pra isso, vamos usar **truncate -s 0** `<arquivo de log>`. Onde a flag -s é usada para definir o tamanho do arquivo em bytes.

```bash
:/var/log# truncate -s 0 mail.log
:/var/log# ls | xargs du -hs | grep M
27M	apache2
169M	auth.log
9.9M	auth.log_13052020.tar.gz
74M	commvault
5.3M	dist-upgrade
2.8M	dpkg.log
14M	dynatrace
293M	kern.log
3.7M	kern.log_13052020.tar.gz
360M	syslog
54M	vsftpd.log
1.1M	wtmp
```
Como "zeramos" o `mail.log` o arquivo não está mais com megas de tamanho. Vamos fazer o mesmo para o arquivo `dkpg.log`.

```bash 
:/var/log# truncate -s 0 dpkg.log
:/var/log# ls | xargs du -hs | grep M
27M	apache2
169M	auth.log
9.9M	auth.log_13052020.tar.gz
74M	commvault
5.3M	dist-upgrade
14M	dynatrace
293M	kern.log
3.7M	kern.log_13052020.tar.gz
360M	syslog
54M	vsftpd.log
1.1M	wtmp
```
Vamos ver mais dois comandos inúteis o **tail** e **head**. Vamos usar para listar as três últimas e as três primeiras linhas do arquivo `syslog`.

**tail -3 syslog**
```bash
:/var/log# tail -3 syslog
Mar  3 16:39:01 ip-000-00-00-00 CRON[32375]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime))
Mar  3 16:39:26 ip-000-00-00-00 systemd[1]: Starting Clean php session files...
Mar  3 16:39:27 ip-00-00-00-00 systemd[1]: Started Clean php session files.
```

**head -3 syslog**
```bash
:/var/log# head -3 syslog
Jan 30 11:51:40 ip-000-00-00-000 dhclient[871]: DHCPREQUEST of 000.00.00.000 on eth0 to 111.11.11.1 port 67 (xid=0x5d7713fa)
Jan 30 11:51:40 ip-000-00-00-000 dhclient[871]: DHCPACK of 000.00.00.000 from 111.11.11.1
Jan 30 11:51:40 ip-000-00-00-000 systemd[1]: Stopping Network Name Resolution...
```
E vamos "limpar" o arquivo `syslog`.

```bash
:/var/log# truncate -s 0 syslog
:/var/log# ls | xargs du -hs | grep M
27M	apache2
169M	auth.log
9.9M	auth.log_13052020.tar.gz
74M	commvault
5.3M	dist-upgrade
14M	dynatrace
293M	kern.log
3.7M	kern.log_13052020.tar.gz
54M	vsftpd.log
1.1M	wtmp
```
Quanto ganhamos de espaço?
Vamos executar novamente o comando inútil **df -kh**
```bash
:/var/log# df -kh
Filesystem                    Size  Used Avail Use% Mounted on
udev                          3.7G     0  3.7G   0% /dev
tmpfs                         748M   75M  673M  10% /run
/dev/xvda1                     12G   10G  1.2G  90% /
tmpfs                         3.7G  4.0K  3.7G   1% /dev/shm
tmpfs                         5.0M     0  5.0M   0% /run/lock
```
Opa! 1.2G! 
Aproveitar e "limpar" o arquivo `kern.log` também.

Agora vamos voltar. Tinha algum maldito com mais de 6G. Eu lembro!

```bash
:/var/log# cd ..
:/var# ls | xargs du -hs | grep G
6.1G	lib
```
Certo...
```bash
:/var# cd lib/
:/var/lib# ls | xargs du -hs | grep G
4.5G	docker
1.3G	mysql
```
Bem, aqui a gente já vai lidar com algumas aplicações específicas. Melhor fazer outro post inútil.

Até!

Outras variações de comandos:
```bash
:# du -h --max-depth=1

:# du -ahx /var/log | sort -rh | head -n 30

:# du -ahx /var/lib | sort -rh | head -n 30

:# ls -lhS
```

Referências inúteis:

- [Linux Log Files Location And How Do I View Logs Files on Linux?](https://www.cyberciti.biz/faq/linux-log-files-location-and-how-do-i-view-logs-files/)
- [Shell Scripting: Expert Recipes for Linux, Bash, and More by ](https://www.oreilly.com/library/view/shell-scripting-expert/9781118166321/c12-anchor-6.xhtml)
- [How to empty (truncate) Log files in Linux](https://computingforgeeks.com/how-to-empty-truncate-log-files-in-linux/)
- [dh(1) — Linux manual page](https://man7.org/linux/man-pages/man1/dh.1.html)
- [du(1) — Linux manual page](https://man7.org/linux/man-pages/man1/du.1.html)
- [tail(1) — Linux manual page](https://man7.org/linux/man-pages/man1/tail.1.html)
- [head(1) — Linux manual page](https://man7.org/linux/man-pages/man1/head.1.html)
- [truncate(2) — Linux manual page](https://man7.org/linux/man-pages/man2/truncate.2.html)