转载于https://zhuanlan.zhihu.com/p/298335887 ,侵权删!
linux系统日志文件的详细介绍
日志文件的作用
日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。. 日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。
日志文件的分类
1.内核及系统日志: 内核及系统日志:这种日志数据由系统服务rsyslog同-管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。系统中大部分的程序会把自己的日志文件交由rsyslog管理,因而这些应用程序使用的日志记录格式都很相似。
/etc/rsyslog.conf 常见配置格式为: . 比后面等级高的(包含自己) *.info .= 只记录该等级 .=debug ! 除了该等级都记录 ! info
- 有记录需要记录时,先缓存到一定大小,一次性写入
2.用户日志: 用于记录Linux系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。 3.程序旧志 :有些应用程序会选择独立管理一份日志文件 ,而不是交给rsyslog服务管理,用于记录本程序运行过程中的各种事件信息。于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式也会存在较大的差异。
日志文件的位置
Linux系统本身和大部分服务器程序的日志文件默认放在/var/log/下。 部分程序共用一个日志文件,一部分程序使用单个日志文件。 而有些大型服务器程序日志由于日志文件不止一个,所以会在/var/log/目录中建立相应的子绿来存放日志文件,这样既保证了日志文件目录的结构清晰,又可以快速定位日志文件。有一部分日志文件只有root用户才有权限读取,这保证了相关日志信息的安全性。
常见的日志文件及查看方式
日志文件 存放内容
/var/log/message 内核消息及各种应用程序的公共日志信息,包括启动、I/O错误、 网络错误、
/var/log/cron Crond周期性计划任务产生的时间信息
/var/log/dmesg 弓|导过程中的各种时间信息
/var/log/ maillog 进入或发出系统的电子邮件活动
/var/log/lastlog 每个用户最近的登录事件
/var/log/secure 用户认证相关的安全事件信息
/var/log/wtmp 每个用户登录注销及系统启动和停机事件
/var/log/btmp 失败的、错误的登录尝试及验证事件
做一个表格,便于查看:
日志消息的级别
根据日志信息的重要程度不同,分为不同的级别 数字级别越小,优先级越高,消息越重要 级别 英文表示 意义
0 EMERG(紧急) 导致主机系统不可用的情况
1 ALERT(警告) 必须马上采取解决措施
2 CRIT 严重 比较严重的情况
3 ERR 错误 运行出现错误
4 WARNING 提醒 提醒用户的重要事件
5 NOTICE 注意 不会儿影响系统,提醒用户
6 INFO 信息 一般信息
7 DEBUG 调式 程序调式
8 None 没有 不做记录
[root@localhost ~]#grep -E -iw “emerg|alert|critical|error” /var/log/messages 查看出现的重大的错误
日志文件分析
内核及大多数系统消息 内核及系统日志主要由默认安装的rsyslog软件包提供, rsyslog服务所使用的配置文件为/etc/rsyslog.conf ,通过查看配置文件内容可以了解到系统默认的日志位置。
[root@localhost ~]# grep -Ev “$|#” /etc/rsyslog.conf
可以看出大部分存放到公共日志文件/var/log/message中,其他的日志文件直接发送给用户或者放到自己独立的日志文件中
[root@localhost ~]# tail -f /var/log/messages
时间标签:消息发出的日期时间 主机名 生产消息的计算机的名称 子系统名称:发出消息的应用程序的名称 消息 消息级别的具体内容
rsyslog日志服务是一个常会被攻击的目标,破坏了它将使运维员很难发现入侵及入侵的痕,因此要特别注意监控其守护进程及配置文件。
用户日志:
存放位置: /var/og/wtmp. /var/log/btmp、 /var/log/lastlog 查询命令: users、who、w、last、 lastlog、 lastb等 users命令:只是简单的输出当前登录的用户名, 每个显示的用户名对应一个会话。
who命令:报告当前登录到系统的每个用户的信息,包括用户名,终端,登录日期,远程主机
w 显示当前操作系统的每个用户及其远程所运行的进程信息
last命令:用于查询成功登录到系统的用户记录,最近的登录情况在最前面。 通过last命令可以及时掌握Linux主机的登录情况,若发现未经授权的用户登陆过,则表示当前主机可能已被入侵。 -a :把从何处登录系统的主机名称或IP地址,显示在最后一 行 -d :将IP地址转换成主机名称 -f 记录文件] :指定记录文件 -R :不显示登入系统的主机名称或IP地址 -x :显示系统关闭,重新开机,以及执行等级的改变等 -n : n代表数字,表示最近n次登录的记录
lastlog命令:用于显示系统中所有用户最近一次登录信息
lastb命令:用于显显用户错误的登录列表,此指令可以发现系统的登录异常。如登录的用户名错误,密码不正确等情况都会记录在案,登录失败的情况属于安全事件,因此消失可能有人在尝试破解密码。除了使用lastb命令以外,可以直接从安全日志文件/var/log/secure中获得相关信息。
分析日志的注意事项
总的来说,作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑的状况定期并随机的检查各种系统日志文件,包括-般信息日志、 网络连接日志、文件传输日志及用户登录日志记录等。在检查这些日志时,要注 意是否有不合常理的时间或操作记录。 例如出现以下一些现象就应该多加注意:
1用户在非常规的时间登绿,或者用户登录系统的IP地址和以往不一样的
2登录失败的日志记录,尤其是那些一再连续尝试进入 失败的日志记录
3非法使用或不正当使用超级用户权限
4无故或者非法重新启动各项网络服务的记录
5不正常的日志记录,如日志残缺不全,或者是诸如wtmp这样的日志文件无故缺少了中间的记录文件
注意:需要提醒运维人员的是,日志并不是完全可靠的,高明的黑客在入侵系统后经常会打扫现场,所以管理人员需要运用综上的所有知识,全面、综合的进行审查和检测。
日志管理:
针对日志定期备份、异地备份(保留1~3个月的日志记录)
针对日志定期切割
针对日志的权限要严格(为了防止敏感信息泄露)
针对日志做集中管理
对于日志文件的保护
chattr +a日志文件, a选项为append (追加) only ,即给日志文件加上a权限后,将只可以追加,不可以删除和修改之前的内容。
[root@localhost ~]# cp /ar/log/secure ./seccure.txt
[root@localhost ~]# chattr +a /var/log/secure
[root@localhost ~]# Isattr /var/og/secure
[root@localhost ~]# rm -rf /var/log/secure rm:无法删除’
/var/log/secure":不允许的操作 root用户在v编辑器的命令模式按dd删除了两行内容后进行wq !强制保存退出,也会报错
补充: chattr +a -R递归式增加a权限
[root@localhost ~]# Isattr /var/log/
日志分类介绍:
1. 连接时间的日志
连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,不过这**
两个文件无法直接cat查看,并且该文件由系统自动更新,可以通过如下:
w/who/finger/id/last/lastlog/ac 进行查看
[root@helle ~]# who
root tty1 2010-10-06 22:56
root pts/0 2010-10-06 22:26 (218.192.87.4)
root pts/1 2010-10-06 23:41 (218.192.87.4)
root pts/3 2010-10-06 23:18 (218.192.87.4)
[root@helle ~]# w
01:01:02 up 2:36, 4 users, load average: 0.15, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 22:56 1:20m 0.16s 0.16s -bash
root pts/0 218.192.87.4 22:26 2:05m 0.18s 0.18s -bash
root pts/1 218.192.87.4 23:41 0.00s 0.41s 0.00s w
root pts/3 218.192.87.4 23:18 1:38m 0.03s 0.03s -bash
[root@helle ~]# ac -p //查看每个用户的连接时间
u51 1.23
u55 0.04
root 95.21 //可以看到root连接时间最长吧
helle 0.06
user1 3.93
total 100.48
[root@helle ~]# ac -a //查看所有用户的连接时间
total 100.49
[root@helle ~]# ac -d //查看用户每天的连接时间
Sep 24 total 0.14
Sep 25 total 14.60
Sep 26 total 13.71
Sep 27 total 21.47
Sep 28 total 11.74
Sep 29 total 6.60
Sep 30 total 8.81
Oct 1 total 9.04
Oct 2 total 0.47
Oct 6 total 8.62
Today total 5.29
其他几个命令不做具体介绍了
2. 进程监控日志
进程统计监控日志在监控用户的操作指令是非常有效的。当服务器最近发现经常
无故关机或者无故被人删除文件等现象时,可以通过使用进程统计日志查看:
[root@helle ~]# accton /var/account/pacct //开启进程统计日志监控
[root@helle ~]# lastcomm //查看进程统计日志情况
accton S root pts/1 0.00 secs Thu Oct 7 01:20
accton root pts/1 0.00 secs Thu Oct 7 01:20
ac root pts/1 0.00 secs Thu Oct 7 01:14
ac root pts/1 0.00 secs Thu Oct 7 01:14
free root pts/1 0.00 secs Thu Oct 7 01:10
lastcomm root pts/1 0.00 secs Thu Oct 7 01:09
bash F root pts/1 0.00 secs Thu Oct 7 01:09
lastcomm root pts/1 0.00 secs Thu Oct 7 01:09
ifconfig root pts/1 0.00 secs Thu Oct 7 01:09
lastcomm root pts/1 0.00 secs Thu Oct 7 01:09
lastcomm root pts/1 0.00 secs Thu Oct 7 01:09
lastcomm root pts/1 0.00 secs Thu Oct 7 01:09
accton S root pts/1 0.00 secs Thu Oct 7 01:09
[root@helle ~]# accton //关闭进程统计日志监控
3. 系统和服务日志
系统日志服务是由一个名为syslog的服务管理的,如一下日志文件都是由syslog日志服务驱动的:
/var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息
/var/log/messages :记录Linux操作系统常见的系统和服务错误信息
/var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况
/var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址
/var/log/cron :记录crond计划任务服务执行情况
…...
[root@helle ~]# cat /var/log/lastlog
Lpts/0218.192.87.4
Lpts/1218.192.87.4
Lpts/1218.192.87.4
Lpts/0218.192.87.46
Lpts/0218.192.87.4
…...
*Linux日志服务介绍*
1. 在Linux系统,大部分日志都是由syslog日志服务驱动和管理的 syslog服务由两个重要的配置文件控制管理,分别是/etc/syslog.conf主配置文件和/etc/sysconfig/syslog辅助
配置文件, /etc/init.d/syslog是启动脚本,这里主讲主配置文件/etc/syslog.conf:
/etc/syslog.conf 语句结构:
[root@helle ~]# grep -v "#" /etc/syslog.conf //列出非#打头的每一行
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
选择域(消息类型.错误级别) 动作域
2. 消息类型:auth,authpriv,security;cron,daemon,kern,lpr,mail, mark,news,syslog,user,uucp,local0~local7.
错误级别:(8级)debug,info,notice,warning|warn;err|error;crit,alert,emerg|panic
动作域:file,user,console,@remote_ip
举如上的/etc/syslog.conf文件三个例子:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
表示info级别的任何消息都发送到/var/log/messages日志文件,但邮件系统、验证系统
和计划任务的错误级别信息就除外,不发送(none表示禁止)
cron.* /var/log/cron 表示所有级别的cron信息发到/var/log/cron文件
*.emerg * 表示emerg错误级别(危险状态)的所有消息类型发给所有用户
*Linux日志服务器配置*
此服务器的配置非常简单,只是修改一个文件的一个地方,然后重启服务即可:
[root@helle ~]# grep -v "#" /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r" //只要在这里添加“-r”就行咯
KLOGD_OPTIONS="-x"
SYSLOG_UMASK=077
[root@helle ~]# service syslog restart
关闭内核日志记录器: [确定]
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
启动内核日志记录器: [确定]
对于发送消息到服务器的OS,只要在写/etc/syslog.conf主配置文件的时候,作用域
为@server-ip就行了,比如针对218.192.87.24这台日志服务器,把一台ubuntu系统的所有
info级别的auth信息发给日志服务器,那么对于ubuntu系统的/etc/syslog.conf文件最后一
行添加 http://auth.info @218.192.87.24 就OK了
日志转储服务
系统工作到了一定时间后,日志文件的内容随着时间和访问量的增加而越来越多,
日志文件也越来越大。而且当日志文件超过系统控制范围时候,还会对系统性能
造成影响。转储方式可以设为每年转储、每月转储、每周转储、达到一定大小转储。
在Linux系统,经常使用“logrotate”工具进行日志转储,结合cron计划任务,可以轻松
实现日志文件的转储。转储方式的设置由“/etc/logrotate.conf”配置文件控制:
[root@helle ~]# cat /etc/logrotate.conf
# see "man logrotate" for details //可以查看帮助文档
# rotate log files weekly
weekly //设置每周转储
# keep 4 weeks worth of backlogs
rotate 4 //最多转储4次
# create new (empty) log files after rotating old ones
create //当转储后文件不存储时创建它
# uncomment this if you want your log files compressed
#compress //以压缩方式转储
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d //其他日志文件的转储方式,包含在该目录下
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp { //设置/var/log/wtmp日志文件的转储参数
monthly //每月转储
create 0664 root utmp //转储后文件不存在时创建它,文件所有者为root,
所属组为utmp,对应的权限为0664
rotate 1 //转储一次
}
# system-specific logs may be also be configured here.
举两个例子: 为/var/log/news/目录下的所有文件设置转储参数,每周转储,转储2次,转储
时将老的日志文件放到/var/log/news/old目录下,若日志文件不存在,则跳过。完成后重启
news新闻组服务,转储时不压缩。那么可以在/etc/logrotate.conf文件的最后添加如下:
/var/log/news/*{
monthly
rotate 2
olddir /var/log/news/old
missingok
postrotate
kill -HUP cat /var/run/inn.pid
endscript
nocompress
}
另一个例子:*为/var/log/httpd/access.log和/var/log/httpd/error.log日志设置转储参数。转储*
5次,转储时发送邮件给root@localhost用户,当日志文件达到100KB时才转储,转储后重启
httpd服务,那么可以直接在/etc/logrotate.conf文件的最后添加如下:
/var/log/httpd/access.log /var/log/http/error.log{
rotate 5
mail root@localhost
size=100k
sharedscripts
/sbin/killall -HUP httpd
endscript
}
自定义日志转储(/etc/logrotate.d/*)
通过下面一个例子*将所有类型错误级别为info的日志转储到/var/log/test.log日志文件中,并设置*
/var/log/test.log达到50KB后进行转储,转储10次,转储时压缩,转储后重启syslog服务:
1、修改/etc/syslog.conf文件使得如下:
[root@helle ~]# tail -1 /etc/syslog.conf //查看该文件的最后一行
*.info /var/log/test.log
2、重启syslog服务: [root@helle ~]# /sbin/service syslog restart
关闭内核日志记录器: [确定]
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
启动内核日志记录器: [确定]
3、创建/etc/logrotate.d/test.log日志转储参数配置文件,添加如下: [root@helle ~]# vim /etc/logrotate.d/test.log
[root@helle ~]# cat /etc/logrotate.d/test.log
/var/log/test.log{
rotate 10
size = 50k
compress
postrotate
killall -HUP syslog
endscript
}
4、查看文件/etc/cron.daily/logrotate确保如下:
[root@helle ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
5、查看转储后的文件
[root@helle log]# pwd
/var/log
[root@helle log]# ls test.log*
…… //结果等要转储的时候会发现压缩文件和原本的test.log文件
syslog是一个被UNIX和Linux广泛使用的日志系统,Linux系统中大部分的日志文件都是通过它进行管理的。本节将对syslog的功能及配置、日志文件的查看和管理,以及syslog中默认配置的日志文件进行介绍。
12.2.1 syslog简介
syslog是一个历史悠久的日志系统,几乎所有的UNIX和Linux操作系统都是采用syslog进行系统日志的管理和配置。Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息。这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。而执行这个过程的程序就是syslog。
syslog可以根据信息的来源以及信息的重要程度将信息保存到不同的日志文件中,例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。在默认的syslog配置下,日志文件通常都保存在“/var/log”目录下。syslog的守护进程为syslogd,系统启动时,默认会自动运行syslogd守护进程。
如果要手工启动,可以使用如下命令:
/sbin/syslogd
在修改syslog配置后,需要重新启动syslogd守护进程才能使新的配置生效。其命令如下所示。
# killall -HUP syslogd
Red Hat Enterprise Linux 5.2安装后默认就已经在syslog中定义了一些日志文件,这些日志的位置以及它们的说明如表12.2所示。
表12.2 默认配置syslog日志
| 日 志 文 件 | 说 明
| /var/log/message | 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 | /var/log/secure | 与安全相关的日志信息
| /var/log/maillog | 与邮件相关的日志信息
| /var/log/cron | 与定时任务相关的日志信息
| /var/log/spooler | 与UUCP和news设备相关的日志信息 |/var/log/boot.log | 守护进程启动和停止相关的日志消息
查看日志常用命令
tail:
-n 是显示行号;相当于nl命令;例子如下:
tail -100f test.log 实时监控100行日志
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
head:
跟tail是相反的,tail是看后多少行日志,而head是查看日志文件的头多少行,例子如下:
head -n 10 test.log 查询日志文件中的头10行日志;
head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;
cat:
tac是倒序查看,是cat单词反写;例子如下:
cat -n test.log |grep "debug" 查询关键字的日志(常用!~)
vim:
1、进入vim编辑模式:vim filename
2、输入“/关键字”,按enter键查找
3、查找下一个,按“n”即可 退出:按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令 wq! 保存退出 q! 不保存退出
Linux 查看大日志文件
1.如果文件比较小的话,使用 vim 直接查看,如果文件比较大的话,使用 Vim 会直接卡主。
2.如果想要查看正在滚动的日志文件。这个命令可以查看大文件。
tail -f file
Ctrl + c 终止 tail 命令
Ctrl + s 暂停 tail 命令
Ctrl + q 继续 tail 命令
3.如果文件比较大的话,也可以使用 less 命令
less file
但是使用上述命令的坏处是,默认打开的位置在第一行,并且当切换到实时滚动模式(按 F ,实现效果类似 tail -f 效果 )或者想要滚动到最底部的时候(按 G ),会卡在计算行数一段时间。如果卡的时间比较长的话,可以直接按 Ctrl + c ,取消计算行数。 我更推荐打开文件的时候使用 -n :不计算行号(打开大文件的时候很有用)。
less -n file
less +G -n file // 打开文件的时候,直接定位到文件的最底部,默认情况下是在首行。
less +F -n file // 打开文件的时候,使用实时滚动模式,Ctrl + c 退出实时滚动模式,按 F 切回实时滚动模式
less +1000g -n file // 直接定位到第 1000 行,一般你提前通过 grep 命令,定位到行数后,再使用这个命令
less +50p -n file // 直接定位到 50% 的位置
less +50P -n file // 直接定位到第 100 字节的位置。这个命令感觉不怎么使用。
不使用 -n 的坏处是:当你使用 = 的时候,会计算出当前光标所在的位置,但是务必记得,大文件计算行数会阻塞一段时间。例如执行下列命令:
less copy.log
然后按下 = ,显示结果如下图:
less 命令打开文件后,按下 = ,因为文件比较大,卡了我 20 几秒。
显示内容为: 文件名 copy.log , 当前屏幕显示1-24行/该文件一共有430000070行 , 从第一行到当前位置一共有 144 byte/该文件一共有2580000418 byte , 当前位置在文件的 0% 处。
如果使用 -n,输入以下命令 :
less -n copy.log
然后按下 = ,执行就非常快了
上述图片中没有 lines 数据,所以执行很快。 因此我建议大家使用 less 命令显示大文件的的时候,加上 -n 。
当然如果文件比较小,你想在使用 less 打开文件,并显示文件行数的话,可以使用 :
less -N file
4.如果你已经知道日志输出的关键字的话,使用 grep , 通常需要打印关键字前后的日志。
grep 'key word' log.txt -A 20 // 列出包括匹配行之后 20 的行。
grep 'key word' log.txt -B 20 // 列出包括匹配行之前 20 的行。
grep 'key word' log.txt -C 20 // 列出包括匹配行前后各 20 行。
大文件的话,grep 出来的数据比较多的话,你可以和 less 一起使用
grep `world` copy.log | less
5.有时候需要将 tail 和 less 命令结合起来使用
tail -n +10000 | less // 从第 10000 开始,使用 less 查看。
tail -n 10000 | less // 查看倒数第 1000 行到文件最后的数据。
6.切割文件 有时候想把一个大文件进行分割成多个小文件.(我个人是不建议这么做的,因为我发现 split 的时候,也是蛮耗时的,但是这里仍然提供一种解决方法吧) 按文件大小分割:
split -b 600m copy.log
分割后的文件默认是以 x 开头,例如我上述命令分割后文件为:
$ ls -lht x* // 这里 * 是通配符,即列出以 x 开头的文件。
-rw-rw-r-- 1 apple apple 61M 6月 22 15:02 xae
-rw-rw-r-- 1 apple apple 600M 6月 22 15:02 xad
-rw-rw-r-- 1 apple apple 600M 6月 22 15:02 xac
-rw-rw-r-- 1 apple apple 600M 6月 22 15:02 xab
-rw-rw-r-- 1 apple apple 600M 6月 22 15:02 xaa
当然你可以按行数分割,具体的命令格式如下 :
split [选项]... [要切割的文件] [输出文件前缀] // 输出文件前缀为可选项
| 命令参数 | 说明 |
| -a, --suffix-length=N | 使用长度为 N 的后缀 (默认 2)
| -b, --bytes=SIZE | 设置输出文件的大小。支持单位:m,k
| -C, --line-bytes=SIZE | 设置输出文件的最大行数。与 -b 类似,但会尽量维持每行的完整性 |
| -d, --numeric-suffixes | 使用数字后缀代替字母
| -l, --lines=NUMBER | 设备输出文件的行数
| –help | 显示版本信息
| –version | 输出版本信息
7.如果你已经知道需要的内容在第几行,但是想要显示指定行数之前或者之后的行。例如你想显示 499999900 到 500000000 这100 行的内容。 推荐使用这个方法
head -500000000 file | tail -100
其中 head -500000000 : 显示文件的前 500000000 行。
tail -100 :显示最后 100行。 两者结合起来就是在前 500000000 行中显示后 100 行,即显示 499999900 到 500000000 这100 行的内容。
或者使用 sed 命令:
sed -n '500000000q;499999900,500000000p' file
其中 -n 与 p : 表示只打印符合条件的行。 500000000q; : 表示当执行到第 500000000 行的时候停止执行。 如果不使用 500000000q; sed 默认会浏览整个文件。 499999900,500000000 : 表示499999900 到 500000000 行。其中 , 逗号表示范围。 整体结合起来就是打印 499999900 到 500000000 行,但是执行到第 500000000 行就不要再执行了。
或者使用 awk 命令
awk 'NR>=49999991 && NR<=50000000{print} NR==50000001{exit}' file
最后我发现三者的执行效率(copy.log 是一个大小为 2.5 G 的测试文件):
time (head -500000000 copy.log | tail -100) > /dev/null
real 0m9.456s
user 0m8.854s
sys 0m3.501stime (sed -n '500000000q;499999900,500000000p' copy.log) > /dev/null
real 0m25.968s
user 0m25.111s
sys 0m0.833stime (awk 'NR>=499999900&& NR<=500000000{print} NR==500000001{exit}' copy.log) > /dev/null
real 1m4.743s
user 1m3.824s
sys 0m0.906s
总结
与其说是查看大日志文件的方法,不如说是将 grep/awk/sed/head/less/tail 多个命令结合起来的方法。
其实最重要的不是怎么看大文件,还是在程序运行时候,就要对日志文件进行归档整理,例如,每天一次归档,或者每满 500M 就归档。 当然大公司会用例如 ELK 之类的日志处理系统。
提示
如果你在浏览这篇文章的时候,苦于没有大的日志文件练习, 可以执行如下命令:
seq 1 1000000000 > file