309 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			309 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Linux查看日志
 | 
						||
 | 
						||
在Linux下用VIM打开大小几个G、甚至几十个G的文件时,是非常慢的。
 | 
						||
 | 
						||
这时,我们可以利用下面的方法分割文件,然后再打开。
 | 
						||
 | 
						||
 | 
						||
 | 
						||
## 查看日志文件
 | 
						||
 | 
						||
**查看文件的前多少行**
 | 
						||
 | 
						||
```sh
 | 
						||
head -10000 /var/lib/mysql/slowquery.log > temp.log
 | 
						||
```
 | 
						||
 | 
						||
上面命令的意思是:把slowquery.log文件前10000行的数据写入到temp.log文件中。
 | 
						||
 | 
						||
**查看文件的后多少行**
 | 
						||
 | 
						||
```sh
 | 
						||
tail -10000 /var/lib/mysql/slowquery.log > temp.log
 | 
						||
```
 | 
						||
 | 
						||
上面命令的意思是:把slowquery.log文件后10000行的数据写入到temp.log文件中。
 | 
						||
 | 
						||
**查看文件的几行到几行**
 | 
						||
 | 
						||
```sh
 | 
						||
sed -n '10,10000p' /var/lib/mysql/slowquery.log > temp.log
 | 
						||
```
 | 
						||
 | 
						||
上面命令的意思是:把slowquery.log文件第10到10000行的数据写入到temp.log文件中。
 | 
						||
 | 
						||
**根据查询条件导出**
 | 
						||
 | 
						||
```sh
 | 
						||
cat catalina.log | grep  '2017-09-06 15:15:42' > test.log
 | 
						||
```
 | 
						||
 | 
						||
**根据查询条件导出(上下文)**
 | 
						||
 | 
						||
显示file文件中匹配keyword字串那行以及上下10行
 | 
						||
 | 
						||
```sh
 | 
						||
cat catalina.log |  grep -C 10 keyword 
 | 
						||
#or
 | 
						||
grep -C 10 keyword catalina.out
 | 
						||
```
 | 
						||
 | 
						||
**显示keyword及前10行**
 | 
						||
 | 
						||
```sh
 | 
						||
  cat catalina.log | grep -B 10 keyword
 | 
						||
  #or
 | 
						||
  grep -B 10 keyword catalina.out
 | 
						||
```
 | 
						||
 | 
						||
**显示keyword及后10行**
 | 
						||
 | 
						||
```sh
 | 
						||
  cat catalina.log | grep -A 10 keyword
 | 
						||
  #or
 | 
						||
  grep -A 10 keyword catalina.out 
 | 
						||
```
 | 
						||
 | 
						||
**实时监控文件输出**
 | 
						||
 | 
						||
```
 | 
						||
tail -f catalina.out
 | 
						||
```
 | 
						||
 | 
						||
 | 
						||
 | 
						||
## 查看日志文件
 | 
						||
 | 
						||
查看linux 标准输出
 | 
						||
 | 
						||
- stdin:`0`   输入
 | 
						||
- stdout:`1` 标准输出
 | 
						||
- stderr:`2` 错误输出
 | 
						||
 | 
						||
```sh
 | 
						||
ps -aux | grep "service_name" 
 | 
						||
 | 
						||
cd /proc/${pid}/fd/
 | 
						||
 | 
						||
tail -f 1  #查看标准输出
 | 
						||
tail -f 1  #查看错误输出
 | 
						||
```
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
## 查看服务输出
 | 
						||
 | 
						||
通过**journalctl**  查看  service 服务的日志
 | 
						||
 | 
						||
 | 
						||
 | 
						||
**journalctl**   常用参数
 | 
						||
 | 
						||
```sh
 | 
						||
-k	查看内核日志
 | 
						||
-b	查看系统本次启动的日志 0本次 -1上次
 | 
						||
-u	查看指定服务的日志
 | 
						||
-n	指定日志条数
 | 
						||
-f	追踪日志
 | 
						||
--disk-usage	查看当前日志占用磁盘的空间的总大小
 | 
						||
--since 
 | 
						||
--until
 | 
						||
-n 指定行数
 | 
						||
```
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
### 案例:
 | 
						||
 | 
						||
 | 
						||
 | 
						||
```sh
 | 
						||
#追踪 service_name 日志
 | 
						||
journalctl -f -u service_name
 | 
						||
 | 
						||
#查看service_name 历史日志
 | 
						||
journalctl -r -u service_name
 | 
						||
 | 
						||
```
 | 
						||
 | 
						||
**.查看内核日志(不显示应用日志)**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -k
 | 
						||
```
 | 
						||
 | 
						||
 | 
						||
默认情况下 systemd-journald 服务只保存本次启动后的日志(重新启动后丢掉以前的日志)。此时 -b 选项是没啥用的。当我们把 systemd-journald 服务收集到的日志保存到文件中之后,就可以通过下面的命令查看系统的重启记录:
 | 
						||
 | 
						||
**查看系统启动列表**
 | 
						||
```sh
 | 
						||
journalctl --list-boots 
 | 
						||
```
 | 
						||
**.查看系统本次启动的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -b
 | 
						||
journalctl -b -0
 | 
						||
```
 | 
						||
 | 
						||
**.查看上一次启动的日志**
 | 
						||
 | 
						||
需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志。
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -b -1
 | 
						||
```
 | 
						||
 | 
						||
**.查看指定时间的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl --since="2012-10-30 18:17:16"
 | 
						||
 | 
						||
journalctl --since "20 minago"
 | 
						||
 | 
						||
journalctl --since yesterday
 | 
						||
 | 
						||
journalctl --since"2015-01-10" --until "2015-01-11 03:00"
 | 
						||
 | 
						||
journalctl --since 09:00 --until"1 hour ago"
 | 
						||
 | 
						||
journalctl --since"15:15" --until now
 | 
						||
```
 | 
						||
 | 
						||
**.显示尾部的最新10行日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -n
 | 
						||
```
 | 
						||
 | 
						||
**.显示尾部指定行数的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -n 20
 | 
						||
```
 | 
						||
 | 
						||
**.实时滚动显示最新日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  -f
 | 
						||
```
 | 
						||
 | 
						||
**.查看指定服务的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  /usr/lib/systemd/systemd
 | 
						||
```
 | 
						||
 | 
						||
**.查看指定进程的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  _PID=1
 | 
						||
```
 | 
						||
 | 
						||
**.查看某个路径的脚本的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  /usr/bin/bash
 | 
						||
```
 | 
						||
 | 
						||
**.查看指定用户的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl _UID=33 --since today
 | 
						||
```
 | 
						||
 | 
						||
**.查看某个Unit的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -u nginx.service
 | 
						||
journalctl -u nginx.service --since today
 | 
						||
```
 | 
						||
 | 
						||
**.实时滚动显示某个Unit的最新日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  -f -u nginx.service 
 | 
						||
```
 | 
						||
 | 
						||
**.合并显示多个Unit的日志**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -u nginx.service -u php-fpm.service --since today
 | 
						||
```
 | 
						||
 | 
						||
**查看指定优先级(及其以上级别)的日志**
 | 
						||
 | 
						||
日志优先级共有8级
 | 
						||
 | 
						||
```
 | 
						||
0: emerg
 | 
						||
1: alert
 | 
						||
2: crit
 | 
						||
3: err
 | 
						||
4: warning
 | 
						||
5: notice
 | 
						||
6: info
 | 
						||
7: debug
 | 
						||
```
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -p err -b
 | 
						||
```
 | 
						||
 | 
						||
**.不分页标准输出**
 | 
						||
 | 
						||
日志默认分页输出--no-pager改为正常的标准输出
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl --no-pager
 | 
						||
```
 | 
						||
 | 
						||
**.以JSON格式(单行)输出**
 | 
						||
 | 
						||
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgramming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java,JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
 | 
						||
 | 
						||
JSON建构于两种结构:
 | 
						||
 | 
						||
“名称/值”对的集合(A collection ofname/value pairs):不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associativearray)。
 | 
						||
 | 
						||
值的有序列表(An ordered list of values):在大部分语言中,它被理解为数组(array)。
 | 
						||
 | 
						||
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
 | 
						||
 | 
						||
例子
 | 
						||
 | 
						||
以JSON格式(单行)输出
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -b -u httpd.service -o json
 | 
						||
```
 | 
						||
 | 
						||
.以JSON格式(多行)输出,可读性更好,建议选择多行输出
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl -b -u httpd.service -o json-pretty
 | 
						||
```
 | 
						||
 | 
						||
**.显示日志占据的硬盘空间**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl --disk-usage
 | 
						||
```
 | 
						||
 | 
						||
**.指定日志文件占据的最大空间**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  --vacuum-size=1G
 | 
						||
```
 | 
						||
 | 
						||
**.指定日志文件保存多久**
 | 
						||
 | 
						||
```sh
 | 
						||
journalctl  --vacuum-time=1years
 | 
						||
```
 | 
						||
 |