Linux 日志删除

Linux的系统日志一般位于/var/log目录内 以下为常见系统日志:

lastlog :纪录最近几次成功登录的事件和最后一次不成功的登录
utmp :纪录当前登录的每个用户 wtmp: 一个用户每次登录进入和退出时间的永久纪录 messages: 从syslog中记录信息(有的链接到syslog文件)
sudolog:纪录使用sudo发出的命令 sulog:纪录使用su命令的使用 syslog:从syslog中记录信息(通常链接到messages文件) acct 或 pacct:记录每个用户使用的命令记录 history日志:这个文件保存了用户最近输入命令的记录

日志系统使用logrotate来进行自动清除以防止日志文件过大 在/etc/logrotate.conf logrotate.d 中 rotate 为转存次数

直接删除使用rm

删除一定天数前的日志文件。输入命令:

find /var/log -mtime +3 -name “*.log” -exec rm -rf {} ; 该命令将/var/log/目录下所有3天前带“.log”的文件删除。

Tips: find 命令的使用:

-mtime -n +n

按照文件的更改时间来查找文件,-n表示n天以内,+n表示n天以前

" *.log"

匹配希望查找的数据类型

-exec

find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command' { } ;

脚本删除

cat /dev/null > /var/log/lastlog

cat /dev/null 可以看作一个"黑洞". 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.

因此可以使用此命令构建删除脚本: clear_log.sh

#!/bin/sh
cat /dev/null > /var/log/lastlog
...

清除history

history -c

简单清除history 很容易被发现,因此需要按需删除记录在bash_history中的内容

应用日志同上

Linux 日志恢复

原理: 当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

要将日志恢复,首先要确保日志进程未停止运行,利用lsof命令找到该进程,利用进程标识符和文件描述符,使用cat命令将内容重写到日志文件,然后重启日志记录服务。

lsof的使用

List Open Files 一个非常实用的系统级的监控、诊断工具 是有着最多开关的Linux/Unix命令之一

lsof直接输入

列出活跃进程的所有打开文件

COMMAND    PID  TID             USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                  root  cwd       DIR               8,20      4096          2 /
systemd      1                  root  rtd       DIR               8,20      4096          2 /
systemd      1                  root  txt       REG               8,20   1690360     925307 /lib/systemd/systemd
systemd      1                  root  mem       REG               8,20   1354616    1088074 /lib/x86_64-linux-gnu/libm-2.26.so
systemd      1                  root  mem       REG               8,20    121016    1050521 /lib/x86_64-linux-gnu/libudev.so.1.6.8
systemd      1                  root  mem       REG               8,20     84032    1050539 /lib/x86_64-linux-gnu/libgpg-error.so.0.22.0
systemd      1                  root  mem       REG               8,20     18832    1050740 /lib/x86_64-linux-gnu/libattr.so.1.1.0

信息如下 COMMAND | 进程的名称 PID | 进程标识符 USER | 进程所有者 FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE | 文件类型,如DIR、REG等 DEVICE | 指定磁盘的名称 SIZE | 文件的大小 NODE | 索引节点(文件在磁盘上的标识) NAME | 打开文件的确切名称

-i

显示所有网络连接

filename

显示开启filename文件的进程

-c processname

显示该进程打开的文件

-c -p pid

显示该进程号对应的进程打开的文件

-d dir

显示该目录下被打开的文件

-D dir

同上 迭代显示目录下所有文件夹

wc命令的使用

wc的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出

-c

统计字节数

-l

统计行数

-m

统计字符数,不能与 -c 标志一起使用

-w

统计字数,一个字被定义为由空白、跳格或换行字符分隔的字符串

–version

显示版本信息


Tips: 查看文件大小的几种方式

stat filepath

时间、大小均显示,较详细

wc -c filename

只适用于文件,显示结果为字节数,无单位

du -b/-h -filepath

b 表示字节数 无单位 h 表示更友好的形式 有单位

ls -lh filepath

h代表human 对人更友好


Linux 内核中提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

/proc/N/fd

N为进程Pid ,该文件夹中包含进程相关的所有的文件描述符

/proc/N/status

进程的状态

查看日志情况

  • 使用lsof命令查看目前打开丢失日志的进程 如 lsof | grep /var/log/syslog ,便可得到相应信息 COMMAND、PID、FD
  • 使用wc命令查看日志情况 如 wc -l /proc/1/fd/1 可查看在内存中的日志记录

重写日志

cat /proc/1/fd/1 > /var/log/syslog

重启服务

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。