1. 简述Linux 有哪些系统日志文件?
1:/var/log/messages 是 Linux 系统中的一个日志文件,它记录了系统的各种事件和错误信息,包括系统启动、登录、网络连接、内核错误等等。
你可以通过以下命令查看 /var/log/messages 文件的内容:
cat /var/log/messages
如果你只想查看最近的日志信息,可以使用 tail 命令:
tail /var/log/messages
另外,这个日志文件可能会变得非常大,你可以使用 logrotate 工具来定期压缩和归档旧的日志文件。
2:认证日志:记录了用户的登录、认证和授权信息。例如/var/log/secure文件。
/var/log/secure是Linux系统中的一个认证日志文件,用于记录系统认证和授权相关的信息,包括以下内容:
用户登录和注销的信息,包括登录的时间、IP地址、终端类型等。
用户或进程执行的sudo或su命令的信息,包括执行的时间、命令等。
系统启动和关闭的信息。
认证和授权失败的信息,包括密码错误、无效的用户名等。
PAM(Pluggable Authentication Modules)认证模块的信息。
/var/log/secure文件通常只有root用户和系统管理员才有权限查看,可以使用以下命令查看该文件的内容:
tail -f /var/log/secure
该命令可以实时显示/var/log/secure文件的最新内容,方便系统管理员及时发现认证和授权相关的问题。
应用程序日志:记录了应用程序的运行状态、错误信息等。例如/var/log/httpd/access_log文件、/var/log/httpd/error_log文件。
Linux 应用程序日志通常存储在 /var/log 目录下。不同的应用程序会将日志写入不同的文件
以下是一些常见应用程序的日志文件:
1:Apache:/var/log/httpd/
2:Nginx:/var/log/nginx/
3:MySQL:/var/log/mysql/ 或 /var/log/mariadb/
4:PostgreSQL:/var/log/postgresql/
5:PHP:/var/log/php/
6:SSH:/var/log/secure 或 /var/log/auth.log
这里一般管理员是可以在应用程序配置中,自定义修改掉日志路径。
安全日志:记录了安全事件、安全漏洞、攻击尝试等信息。
例如/var/log/audit/audit.log文件。
1:内核日志:记录了内核的错误信息、警告信息等。例如/var/log/dmesg文件。
2:引导日志:记录了系统引导的信息。例如/var/log/boot.log文件。
3:用户日志:记录了用户级别的操作和信息。例如~/.bash_history文件。
2. 如何动态监听Linux日志 ?
在Linux系统中,如果你想实时观察一个日志文件的内容,可以使用tail命令。
tail命令可以从指定的文件末尾开始输出文件的内容,并且可以不断地监视文件内容的变化。可以使用-f选项来启用实时监视模式,当文件内容发生变化时,tail会自动输出变化后的内容。
例如,如果你想实时查看一个名为myapp.log的日志文件,可以使用以下命令:
tail -f myapp.log
运行该命令后,tail命令会从文件末尾开始输出文件内容,并且会继续监视文件内容的变化,直到你手动中断命令。
另外,如果你想同时查看多个日志文件的内容,可以将多个文件名用空格分隔,例如:
tail -f myapp.log catalina.out
该命令会同时实时输出myapp.log和catalina.out两个日志文件的内容
3. 如何带关键词查询Linux日志文件 ?
如果你想在Linux系统中实时监控某个日志文件中带有关键字"tabelAss"的内容,可以使用grep命令结合tail命令来实现。
grep命令可以在文件中查找指定关键字,并将包含关键字的行输出到控制台。可以使用-i选项来忽略关键字的大小写,使用-n选项来显示关键字所在的行号。
结合tail命令和grep命令,可以实现实时监控日志文件并筛选出包含指定关键字的行。例如,如果你想实时监控名为myapp.log的日志文件,并筛选出包含关键字"tabelAss"的行,可以使用以下命令:
tail -f myapp.log | grep -i -n “tabelAss”
该命令会从文件末尾开始输出文件内容,并且会不断地监视文件内容的变化。同时,grep命令会筛选出包含关键字"tabelAss"的行,并将这些行输出到控制台,并在每一行前显示行号。
4. 如何格式化输出显示Linux日志文件 ?
awk命令可以对文本文件进行格式化输出,可以使用如下命令实现:
awk ‘{print $1, $2, $5}’ /var/log/syslog
5. 简述如何将命令组合成管道,实现实时监控带有关键字的日志?
将tail、grep和awk命令组合成管道,可以实现实时监控带有关键字的日志,例如:
tail -f /var/log/syslog | grep “error” | awk ‘{print $1, $2, $5}’
6. 解释如何实现日志动态截取 ?
tail -f 日志文件名 > 自定义文件,使用此命令会可将监听到的日志动态的写入到自定义的文件中,使用Ctrl + c 结束写入。
举例:遇到同上2.1的问题,规范的管理流程,生产环境是由运维人员进行管理的,开发人员是无权访问的。如果生产环境出现问题,那么报错日志就需要运维人员截取给开发人员!
#将日志动态写入自定义文件 user.log
#如果没有user.log则会自动创建,如果存在内容则会被覆盖
$ tail -f run_UserData_172.17.0.1_10007.log > user.log
#追加写入:会从user.log的内容尾部开始写入,不会覆盖掉原有内容
$ tail -f run_UserData_172.17.0.1_10007.log >> user.log
7. 简述如何实现Linux日志区间截取 ?
关键字查询显示行号,在代码层关键位置会有日志标记,将其关键字检索出行号,进行行号区间日志截取、时间区间日志截取!
#截取19646~19846区间的200行数据
$ sed -n ‘19646, 19846p’ run_UserData_172.17.0.1_10007.log
#写入自定义文件查看
$ sed -n ‘19646, 19846p’ run_UserData_172.17.0.1_10007.log > user.log
#截取自定义时间段
$ sed -n ‘/2022-07-21 03:30:01/, /2022-07-21 03:32/p’ run_UserData_172.17.0.1_10007.log > user.log
8. 如何Linux下日志文件过大,如何实现分割,转储 ?
Logrotate:
logrotate是Linux系统自带的日志切割工具,可以按月、周、天来切割日志文件并压缩,解决了日志备份以及备份日志的可读性。其基于crontab运行,系统自动触发。
logrotate 一般系统会自带,不需要自己安装
logrotate 处理日志,依靠 cron 每天在执行时间自动执行
下面一段就描述了对 bootlog 的转储方式
#cat /etc/logrotate.d/bootlog
/var/log/boot.log {
missingok #没有日志时跳过
daily #每天转储一次
copytruncate #日志备份并截断
rotate 90 #转储次数
notifempty #日志为空时不处理
dateext #用当前日期命名
}
配置文件
主配置是 /etc/logrotate.conf,自动执行的日志转储都通过主配置文件引入。
默认引入的是 /etc/logrotate.d/ 目录,通常都放在这里。
状态记录文件,/var/lib/logrotate/logrotate.status
自动执行 logrotate,依赖 /etc/cron.daily/logrotate
主配置中定义了公用的配置,根据需求进行配置
轮询日志文件,每周一次。 weekly
转储保存日志数量。rotate 4
转储旧日志后,创建一个新日志文件。create
转储日志用当前日期命名。dateext
压缩转储后的日志。compress
自定义配置项后,会覆盖主配置的默认值
配置参数说明
compress 用 gzip 压缩转储后的日志
nocompress 不压缩转储文件
copytruncate 日志文件备份并截断,先备份再清空,中间时间差可能会丢失日志
nocopytruncate 备份日志文件但不截断
create 指定新建文件属性(权限 用户 用户组)
nocreate 不创建新文件
delaycompress 转储的文件到下一次才压缩
nodelaycompress 转储的同时压缩
missingok 日志不存在时跳过,继续下一个日志
errors
转储的错误信息发送到指定邮箱
ifempty 日志为空时也进行转储
notifempty 日志为空时不转储
mail
转储的日志文件发送到指定邮箱
nomail 转储时不发送日志文件
olddir 转储日志文件放到指定目录
noolddir 转储日志和当前日志放在同一目录
sharedscripts 执行 postrotate 脚本,所有日志转储后统一执行一次脚本
prerotate…endscript 转储前执行的脚本,需独立一行
postrotate…endscript 转储后执行脚本,需独立成行
daily 转储周期为每天一次
weekly 转储周期为每周一次
monthly 转储周期为每月一次
rotate 转储文件保存个数,
dateext 转储文件命名格式为当前日期
dateformat <.%m> 转储文件命名格式,结合 dateext 使用,有 %Y、%m、%d、%s 四种格式
size 文件超过指定大小才会转储(如:100k、2M、5(byte))
minsize 作用同 size
默认运行时间
运行时间由 cron 配置 /etc/anacrontab 决定
#随机延迟 45min
RANDOM_DELAY=45
#有效时间为 3-22 点
START_HOURS_RANGE=3-22
#/etc/cron.daily 执行周期为 1 天,延迟时间为 5min
1 5 cron.daily nice run-parts /etc/cron.daily
没关机的情况下,会在每天 3:05 ~ 3:50 之间执行
有效时间内关机的情况下,会在开机 5min 后开始执行
logrotate 命令
logrotate [OPTION]
-d, --debug,debug 模式,测试文件是否有错
-f, --force,强制转储
-v, --verbose,显示转储过程
-m, --mail=commend,压缩日志后发送到指定邮箱
-s, --state=statefile,指定状态文件
手动转储
执行 /etc/logrotate.d/ 下的配置文件
logrotate -f -v /etc/logrotate.d/bootlog
也可以执行其他目录自定义的配置文件,注意文件要有执行权限
logrotate -f -v /usr/batch/test
想要固定时间执行,则把任务放在 crontab 中
0 23 * * * logrotate -f -v /usr/batch/test
自定义时可以参考现有文件,并结合可用参数,实现需求内容。
/etc/cron.daily/logrotate 文件内容 ↓
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [
E
X
I
T
V
A
L
U
E
!
=
0
]
;
t
h
e
n
/
u
s
r
/
b
i
n
/
l
o
g
g
e
r
−
t
l
o
g
r
o
t
a
t
e
"
A
L
E
R
T
e
x
i
t
e
d
a
b
n
o
r
m
a
l
l
y
w
i
t
h
[
EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [
EXITVALUE!=0];then/usr/bin/logger−tlogrotate"ALERTexitedabnormallywith[EXITVALUE]"
fi
exit 0
9. 简述Linux日志记录服务,日志管理工具 ?
syslog
简介:
syslog是一种广泛使用的日志记录服务,用于记录系统和应用程序的事件,详细记录包括时间戳、主机IP地址、应用程序名称、优先级、消息内容等信息。syslog有三个主要部分:客户端、服务器以及日志消息。
在客户端上,操作系统或应用程序通过syslog协议将日志消息发送到syslog服务器和指定的接收器。在服务器上,syslog守护进程接收和处理日志消息,将其写入目标存储介质,如文本文件或远程数据库。
syslog还支持分层级别的日志分类,通过定义不同的日志级别例如debug、info、warning等级别,更好地帮助管理员识别和跟踪问题。由于syslog历史悠久,已经成为各种日志管理系统中必须的日志协议之一。
优点:
高度可定制:syslog可以根据消费者的需要定制,出口目的地、日志级别等等都可以自定义。
稳健性强:syslog已经广泛使用了几十年,在工业级别的系统中表现出了高度的稳健性。
高效运行:syslog能够处理大量的日志,对于大量用户的组织有足够的处理能力。
适用于集中和分散式日志收集:syslog协议可以通过UDP和TCP传输,从而获得广阔的使用范围,适用于集中和分散式日志收集。
缺点:
安全性较差:syslog协议只提供了基本的加密机制,并未提供完善的安全机制。
无法处理大量的日志信息:对于高容量的日志收集,syslog可能会出现处理困难的问题。
无法提供实时性:syslog是通过轮询机制来处理日志信息的,而非实时推送。
rsyslog
特点:rsyslog是一个高度可扩展的日志记录守护进程,可以将系统日志记录发送到多个远程服务器,同时支持过滤、标记等强大功能。
优点:高性能、可扩展性强,支持多种输入/输出方式和格式化日志数据格式,具有良好的数据完整性和可靠性。
缺点:配置和使用门槛相对较高,需要投入不少时间和精力来掌握其强大的功能。
auditd
特点:auditd是一个强大的系统安全审核和审计记录工具,可以记录所有系统和进程行为,包括文件访问、网络连接、用户登录等等。
优点:广泛应用于安全性高的系统和网络环境中,可以帮助检测和处理攻击、漏洞和安全风险等问题,支持本地和远程审计日志记录。
缺点:对于非专业安全人员使用门槛较高,初始配置和使用需要适应一些复杂的规则和策略,而且会产生大量的日志数据。
logrotate
特点:logrotate是一个轻量级的日志文件管理工具,可以根据预定义的条件和参数来自动压缩、备份和轮换日志文件,避免磁盘空间耗尽等问题。
优点:使用方便,配置简单,可以定期自动执行,帮助管理和维护日志文件,有效地减少相应管理工作的工作量。
缺点:处理的日志文件数量相对较少,只关注单一日志文件的轮换及处理。
journalctl
特点:journalctl是一个用来检查系统日志的命令行工具,它可以搜索、筛选、查看和分析已存储的日志数据,并支持多种数据格式(如JSON)。
优点:方便实用,操作简单,日志信息格式化,易于阅读和分析多种操作结果日志。
缺点:适用于单个服务器上的日志分析,不利于多节点分布式日志收集分析效率优化。
dmesg
简介:
dmesg是一个Linux环境下的命令行工具,用于查询和打印内核环缓冲区信息,包括操作系统启动、硬件检测、设备驱动、内核缺陷等系统信息。这些信息可以用于诊断和修复系统故障、错误和警告,同时也可以用来配合其他的监控和管理工具。
优点:
方便实用:dmesg可以直接在终端中查询和显示内核信息,方便快捷地定位和排查问题。
及时反馈:dmesg可以实时反馈系统的运行状况,包括启动过程、硬件检测进度等,帮助管理员及时发现问题和异常情况。
灵活定制:dmesg可以根据需要进行定制,可以屏蔽一些无用信息,提高查询效率和减少移除日志文件的体积。
支持多种格式的日志记录:dmesg支持多种日志格式,如英文、中文等,在跨国公司和团队中也有着良好的应用。
缺点:
只针对内核信息:dmesg只显示内核环缓冲区的日志信息,不能记录和查询应用程序、代理服务等其他日志信息。
容易出现大量信息:内核环缓冲区的大小是有限的,如果内核日志的刷写速度快于查看速度,将可能导致日志溢出和信息丢失。
不方便数据库化和定期备份:由于dmesg是命令行工具,难以将记录的信息定期地存入数据库中或进行日志的规范化处理。
syslog-ng
简介:
syslog-ng是一个开源的、高性能的系统日志管理工具,它可以收集、处理、转发和存储系统日志。它兼容syslog协议,但与传统syslog工具不同,它提供了更丰富的功能,如多平台支持、安全性、灵活配置和安装等,具有广泛的应用场景。
优点:
可攻性和加密性高:syslog-ng提供了可靠的安全和认证控制功能,包括TLS、SSH、IPSec等加密机制,以确保syslog-ng事件无法被窃听或篡改。
高效运行:syslog-ng已经在高性能、高负载的系统中得到广泛使用,在处理大量信息时也能保证高效性能。
可定制性高:syslog-ng允许管理员根据需要创建特定日志记录配置,控制缓冲大小、记录设施、日志等级、输入/输出通道等。
跨平台支持:syslog-ng支持多种平台,如Linux、Unix、Windows等,在不同的平台下都能正常工作。
缺点:
配置灵活性可能导致难以理解和管理配置:syslog-ng允许管理员根据需要进行高度灵活的配置,这可能会导致复杂和难以理解的系统日志结构和管理工作。
高级功能可能需要一定的技术水平:syslog-ng拥有的一些高级功能需要管理员对其日志分析、特定语言的了解、以及相关统计分析的知识。
Graylog
简介:
Graylog是一个开源的、分布式的日志管理系统,提供了强大且易于定制的日志记录、查询和分析功能。它支持多种数据源,如syslog、GELF、Log4j、Flatfile等,并支持流处理技术,以实时记录和处理数据。
优点:
高效性能和可扩展性:Graylog具有去中心化和分布式的架构,可以在多台服务器之间进行负载均衡并支持持久化数据存储,具有高可扩展性和高效性能。
强大的搜索和过滤能力:Graylog为管理员提供了多种查询方式和灵活的过滤条件,以便根据需要查询和分析日志数据。
安全性强:Graylog支持TLS / SSL加密,用户身份验证和访问控制,提供完整的安全功能,防止未经授权的访问和数据泄露。
易于管理和使用:Graylog提供了易于使用的Web界面,允许管理员轻松查看、查询和管理系统日志数据。
缺点:
配置和管理的学习曲线较高:Graylog的高级功能和复杂的配置需要一定的技术水平和灵活性,对于对Graylog不是很熟悉的管理员,可能需要一段时间来学习和理解其使用方法和配置技巧。
不适合小型部署:由于Graylog是一个高度灵活和可扩展的系统,它可能会给小型部署带来过度的负担,尤其是在搜索和查询大量数据时会极大地减缓性能。
需要特别注意的是,不同的Linux发行版可能会使用特定的日志管理工具。例如,Red Hat Enterprise Linux使用了systemd日志系统,而Debian和Ubuntu则使用rsyslog。因此,管理员应该根据自己所使用的Linux发行版或操作系统版本来选择最适合自己的日志管理工具
10. 简述如何对Nginx访问日志分析以及常用的命令 ?
1、根据访问IP统计UV
awk ‘{print $1}’ paycenteraccess.log | sort -n | uniq | wc -l
2、查询访问最频繁的IP(前10)
awk ‘{print $1}’ /www/server/nginx/logs/access.txt | sort -n |uniq -c | sort -rn | head -n 10
3、查看某一时间段的IP访问量(1-8点)
awk ‘$2 >=“[2023-01-29T11:00:00+08:00]” && $2 <=“[2023-01-29T11:30:00+08:00]”’ /www/server/nginx/logs/access.txt | awk ‘{print $1}’ | sort | uniq -c| sort -nr |wc -l
4、查看访问100次以上的IP
awk ‘{print $1}’ /var/log/nginx/access.log | sort -n |uniq -c |awk ‘{if($1 >100) print $0}’|sort -rn
5、查看指定ip访问过的url和访问次数
grep “39.105.67.140” /var/log/nginx/access.log|awk ‘{print $7}’ |sort |uniq -c |sort -n -k 1 -r
6、根据访问URL统计PV
cat /var/log/nginx/access.log |awk ‘{print $7}’ |wc -l
7、查询访问最频繁的URL(前10)
awk ‘{print $7}’ /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10
8、查看访问最频的URL([排除/api/appid])(前10)
grep -v ‘/api/appid’ /var/log/nginx/access.log|awk ‘{print $7}’ | sort |uniq -c | sort -rn | head -n 10
9、查看页面访问次数超过100次的页面
cat /var/log/nginx/access.log | cut -d ’ ’ -f 7 | sort |uniq -c | awk ‘{if ($1 > 100) print $0}’ | less
10、查看最近1000条记录,访问量最高的页面
tail -1000 /var/log/nginx/access.log |awk ‘{print $7}’|sort|uniq -c|sort -nr|less
11、统计每小时的请求数,top10的时间点(精确到小时)
awk ‘{print $2}’ /www/server/nginx/logs/access.txt |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10
12、统计每分钟的请求数,top10的时间点(精确到分钟)
awk ‘{print $2}’ /www/server/nginx/logs/access.txt |cut -c 14-17|sort|uniq -c|sort -nr|head -n 10
13、统计每秒的请求数,top10的时间点(精确到秒)
awk ‘{print $4}’ /var/log/nginx/access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 10
14、查找指定时间段的日志
awk ‘$4 >=“[25/Mar/2020:01:00:00” &&
4
<
=
"
[
25
/
M
a
r
/
2020
:
08
:
00
:
00
"
′
/
v
a
r
/
l
o
g
/
n
g
i
n
x
/
a
c
c
e
s
s
.
l
o
g
列出传输时间超过
0.6
秒的
u
r
l
,显示前
10
条
c
a
t
/
v
a
r
/
l
o
g
/
n
g
i
n
x
/
a
c
c
e
s
s
.
l
o
g
∣
a
w
k
′
(
s
u
b
s
t
r
(
4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log 列出传输时间超过 0.6 秒的url,显示前10条 cat /var/log/nginx/access.log |awk '(substr(
4<="[25/Mar/2020:08:00:00"′/var/log/nginx/access.log列出传输时间超过0.6秒的url,显示前10条cat/var/log/nginx/access.log∣awk′(substr(NF,2,5) > 0.6){print $4,
7
,
s
u
b
s
t
r
(
7,substr(
7,substr(NF,2,5)}’ | awk -F ‘"’ ‘{print $1,$2,KaTeX parse error: Expected 'EOF', got '}' at position 2: 3}̲' |sort -k3 -rn…NF,2,5) > 0.6 && $7~//api/appid/){print $4,
7
,
s
u
b
s
t
r
(
7,substr(
7,substr(NF,2,5)}’ | awk -F ‘"’ ‘{print $1,$2,$3}’ |sort -k3 -rn | head -10
获取前10条最耗时的请求时间、url、耗时
cat /var/log/nginx/access.log |awk ‘{print $4,
7
,
s
u
b
s
t
r
(
7,substr(
7,substr(NF,2,5)}’ | awk -F ‘"’ ‘{print $1,$2,$3}’ | sort -k3 -rn | head -10
11. 如何对Apache日志分析与状态查看方法 ?
假设apache日志格式为:
118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)”
问题1:在apachelog中找出访问次数最多的10个IP
awk ‘{print $1}’ apache_log |sort |uniq -c|sort -nr|head -n 10
awk 首先将每条日志中的IP抓出来,如日志格式被自定义过,可以 -F 定义分隔符和 print指定列;
sort进行初次排序,为的使相同的记录排列到一起;
upiq -c 合并重复的行,并记录重复次数。
head进行前十名筛选;
sort -nr按照数字进行倒叙排序。
我参考的命令是:
显示10条最常用的命令
sed -e “s/| //n/g” ~/.bash_history | cut -d ’ ’ -f 1 | sort | uniq -c | sort -nr | head
问题2:在apache日志中找出访问次数最多的几个分钟
awk ‘{print $4}’ access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
awk 用空格分出来的第四列是[09/Jan/2010:00:59:59;
cut -c 提取14到18个字符
剩下的内容和问题1类似。
问题3:在apache日志中找到访问最多的页面:
awk ‘{print $11}’ apache_log |sed ‘s/^.cn/(./)/"//1/g’|sort |uniq -c|sort -rn|head
类似问题1和2,唯一特殊是用sed的替换功能将”http://www.a.cn/common/index.php”替换成括号内的内容:”http://www.a.cn(/common/index.php)”
问题4:在apache日志中找出访问次数最多(负载最重)的几个时间段(以分钟为单位),然后在看看这些时间哪几个IP访问的最多?
1、查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l
2、查看80端口的tcp连接:
netstat -tan | grep “ESTABLISHED” | grep “:80” | wc -l
3、通过日志查看当天ip连接数,过滤重复:
cat access_log | grep “19/May/2011” | awk ‘{print $2}’ | sort | uniq -c | sort -nr
4、当天ip连接数最高的ip都在干些什么(原来是蜘蛛):
cat access_log | grep “19/May/2011:00” | grep “61.135.166.230” | awk ‘{print $8}’ | sort | uniq -c | sort -nr | head -n 10
5、当天访问页面排前10的url:
cat access_log | grep “19/May/2010:00” | awk ‘{print $8}’ | sort | uniq -c | sort -nr | head -n 10
6、用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1".“$2”.“$3”."$4}’ | sort | uniq -c | sort -nr
接着从日志里查看该ip在干嘛:
cat access_log | grep 220.181.38.183| awk ‘{print $1"/t"$8}’ | sort | uniq -c | sort -nr | less
7、查看某一时间段的ip连接数:
grep “2006:0[7-8]” www20110519.log | awk ‘{print $2}’ | sort | uniq -c| sort -nr | wc -l
8、当前WEB服务器中联接次数最多的20条ip地址:
netstat -ntu |awk ‘{print $5}’ |sort | uniq -c| sort -n -r | head -n 20
9、查看日志中访问次数最多的前10个IP
cat access_log |cut -d ’ ’ -f 1 |sort |uniq -c | sort -nr | awk ‘{print $0 }’ | head -n 10 |less
10、查看日志中出现100次以上的IP
cat access_log |cut -d ’ ’ -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
11、查看最近访问量最高的文件
cat access_log |tail -10000|awk ‘{print $7}’|sort|uniq -c|sort -nr|less
12、查看日志中访问超过100次的页面
cat access_log | cut -d ’ ’ -f 7 | sort |uniq -c | awk ‘{if ($1 > 100) print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲' | less 13、列出传…NF > 30){print KaTeX parse error: Expected 'EOF', got '}' at position 2: 7}̲'|sort -n|uniq …NF > 60 && $7~//.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
12. 如何查看与分析查看Tomcat日志 ?
一、查看Tomcat日志的重要性
Tomcat是一个开源的Java Servlet容器,用于实现Java Servlet和JSP规范,是Java Web应用服务器中非常常用的一个服务器。在应用开发过程中,Tomcat日志对于排查问题、优化性能、了解用户行为等方面都有着重要的作用。
日志记录了应用运行过程中的各种信息,包括异常信息、调试信息、警告信息以及用户行为等,能够帮助开发者进行问题排查、性能优化以及了解用户行为等方面。
因此,查看Tomcat日志对于应用开发和维护来说是非常重要的,下面将介绍如何查看Tomcat日志。
二、查看Tomcat日志的方法
- 查看Tomcat控制台输出日志
在Tomcat启动时,会在控制台输出各种信息,包括Tomcat的启动过程、应用的部署信息、访问信息等,这些信息非常有用。可以通过查看Tomcat控制台输出日志,来了解应用的运行状态、排查问题等。
// Tomcat启动时的控制台输出示例
2022-11-11 10:30:00 INFO org.apache.catalina.startup.Catalina.start Server startup in 100 ms
2. 查看Tomcat访问日志
Tomcat访问日志记录了对Tomcat服务器的访问请求,包括请求时间、请求方式、请求URL、响应状态码等信息。访问日志可以通过配置Tomcat的server.xml文件来设置,一般会记录在Tomcat的logs目录下。
directory=“logs”
prefix=“localhost_access_log.”
suffix=“.txt”
pattern=“%h %l %u %t “%r” %s %b” />
其中,directory属性表示日志文件存放路径,prefix和suffix属性表示日志文件名的前缀和后缀,pattern属性表示日志记录的格式。
- 查看Tomcat错误日志
Tomcat错误日志记录了Tomcat服务器运行过程中发生的错误信息,包括各种异常、错误、警告等。Tomcat错误日志默认记录在Tomcat的logs目录下。
// Tomcat错误日志示例
2022-11-11 10:30:00 ERROR [http-nio-8080-exec-1] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]: Servlet.service() for servlet [spring] in context with path [] threw exception [An exception occurred while processing request] with root cause
java.lang.NullPointerException: null
4. 实时查看Tomcat日志
通过命令行工具或第三方工具可以实现实时查看Tomcat日志内容,便于快速定位问题。
// Linux命令行查看Tomcat日志
tail -f logs/catalina.out
// Windows命令行查看Tomcat日志
type logs\catalina.out
5. 使用Tomcat管理界面查看日志
Tomcat提供了一个Web管理界面,可以在界面上查看Tomcat的运行状态、日志等信息。
访问Tomcat的管理界面需要在Tomcat的conf/tomcat-users.xml文件中添加管理用户,配置用户的角色和权限。
// tomcat-users.xml配置示例
添加完管理用户后,就可以通过访问http://localhost:8080/manager/html来访问Tomcat管理界面,查看Tomcat的运行状态、日志等信息。
13. 如何对Python多进程日志输出按日期切割 ?
一、需求分析
在实际开发中,我们往往需要将日志输出到文件中,以方便对程序的调试和运行情况进行记录。而对于多进程来说,不同进程的日志输出很可能会交叉在一起,影响日志的可读性。因此,我们需要对日志进行按日期切割,以便于对不同日期的日志进行查看和管理。
二、实现思路
对于Python多进程日志输出按日期切割的实现,我们可以采用如下思路:
使用Python标准库中的logging模块进行日志的输出。
通过定时器控制日志文件的切割时间。当时间到达指定日期时,生成新的日志文件并将日志输出到新的日志文件中。
通过多进程机制,实现不同进程的日志输出分离。
三、代码实现
下面是Python多进程日志输出按日期切割的完整代码实现:
import logging
import logging.handlers
import multiprocessing
import os
import time
def worker_process():
log_path = os.path.join(os.getcwd(), ‘logs’)
os.makedirs(log_path, exist_ok=True)
log_file = os.path.join(log_path, ‘worker.log’)
logger = logging.getLogger(‘worker’)
logger.setLevel(logging.DEBUG)
handler = logging.handlers.TimedRotatingFileHandler(log_file, when=‘d’, encoding=‘utf-8’)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(processName)s %(lineno)d %(message)s’)
handler.setFormatter(formatter)
logger.addHandler(handler)
while True:
logger.info(‘This log is from worker process.’)
time.sleep(1)
if name == ‘main’:
manager = multiprocessing.Manager()
processes = []
for i in range(2): #创建两个工作进程
p = multiprocessing.Process(target=worker_process)
processes.append§
p.start()
for p in processes:
p.join()
四、代码解读
上述代码中,我们使用logging模块来输出日志。具体实现步骤如下:
首先,在worker_process函数中,我们指定日志文件的存储路径和文件名。
然后,我们使用logging.getLogger方法来创建一个名为“worker”的日志记录器。
接着,我们创建一个TimedRotatingFileHandler对象,并指定when参数为“d”,表示按天切割日志文件。
我们为handler对象设置日志级别和格式化器,并将handler对象添加到logger对象中。
在工作进程中,我们通过logger.info方法来输出日志内容。
最后,我们使用multiprocessing库创建两个工作进程,并启动这两个工作进程。
14. 简述什么是filebeat ,以及怎么实现日志数据分析 ?
一、filebeat 日志空格介绍
在 filebeat 中,日志空格是指一个文本块中的空白字符。 当 filebeat 读取日志文件时,会将日志文本分割成多个每行的文本块,然后解析每个文本块以提取重要信息。
在默认情况下,filebeat 使用空格分割日志文本块。 如果您的文本块中包含其他分隔符,您可以使用正则表达式或多个分隔符来定义您的分隔符。
二、filebeat 设置日志空格
在 filebeat 中设置日志空格非常简单。 在您的 filebeat 配置文件中,您可以设置以下内容来指定您的日志空格:
filebeat.inputs:
- type: log
enabled: true
paths: - /var/log/messages
processors: - decode_json_fields:
fields: [“message”]
target: “”
overwrite_keys: true
multiline:
pattern: ‘1’
negate: false
match: after
三、filebeat 多种日志空格分隔符示例
除了默认的空格分隔符外,在 filebeat 中您还可以使用其他分隔符。
1、使用逗号分隔符
multiline.pattern: “^[{”
multiline.negate: true
multiline.match: after
2、使用分号分隔符
multiline.pattern: “^;”
multiline.negate: true
multiline.match: after
3、使用自定义分隔符
multiline.pattern: “^”
multiline.negate: true
multiline.match: after
四、filebeat 日志空格匹配示例
filebeat 可以使用正则表达式进行日志空格匹配。
multiline.pattern: '^INFO | ^ERROR ’
multiline.negate: false
multiline.match: after
五、filebeat 日志空格的应用场景
filebeat 的日志空格功能可以广泛应用于日志收集、数据分析等领域。
在企业级环境中,日志数据是非常珍贵的,可以为企业决策提供重要依据。 在日志数据分析中,对日志文本块进行分割是非常重要的一环。
15. MongoDB 日志过大问题解决方法?
一、MongoDB 日志文件类型
MongoDB 的日志文件主要分为四种类型:
mongod.log: MongoDB 实例的主要日志文件,包含了所有日志信息。
mongodb.log: MongoDB 实例的旧的主要日志文件,仅在下载 MongoDB 程序时使用。
audit.log: MongoDB 的审计日志文件,记录访问数据库的所有操作。
journal: 记录 MongoDB 实例中的事务日志,用于崩溃恢复。
其中,mongod.log 是我们需要关注的主要日志文件。
二、MongoDB 日志过大的原因
在日常操作中,我们可能会忽略 MongoDB 的日志信息,导致日志文件的不断积累。常见的导致 MongoDB 日志过大的原因包括:
调试模式: 如果 MongoDB 实例启动时以调试模式运行,则日志信息会非常详细,这将增加日志文件的大小。
慢查询: 当 MongoDB 实例查询非常耗时时,日志会记录这些查询信息,这些信息可能包含大量的细节,从而导致日志文件变得非常大。
日志轮换未启用: MongoDB 没有启用日志轮换功能,这意味着日志信息将一直写入同一个文件中,直到该文件达到操作系统设置的最大大小。
三、MongoDB 日志过大的解决方法
1、调整 MongoDB 实例的日志等级
我们可以通过设置 MongoDB 实例的日志等级来减少日志文件的大小。MongoDB 提供了多个日志等级,包括:0(禁用日志),1(仅错误),和更高的数字表示更详细的日志信息。
#启动 MongoDB 实例时指定日志等级
mongod --logpath /var/log/mongod.log --logappend --quiet --journal --setParameter diagnosticDataCollectionEnabled=false --setParameter failIndexKeyTooLong=false --setParameter enableTestCommands=false --setParameter transactionLifetimeLimitSeconds=10800 --setParameter transactionAllowImplicitCommit=true --setParameter localThresholdMS=15 --setParameter maxTransactionLockRequestTimeoutMillis=100 --setParameter maxTransactionInactiveTimeSeconds=60 --setParameter maxTransactionLockQueueLength=100 --setParameter maxTransactionNumber=1024 --setParameter gracefulStopInterval=5000 --setParameter blackListRetryIntervalSecs=60 --setParameter tcmallocMaxTotalThreadCacheBytes=241591910 --setParameter enableExperimentalIndexStatsCmd=true --setParameter replaceInvalidHostname=true --setParameter chunkDistributionMaxChangePct=10 --setParameter indexBuildCommitIntervalSeconds=10 --setParameter ticketCompatibility=v7 --setParameter minActiveJournalFiles=3 --setParameter opMetadataWaitForJournalCommit=false --setParameter reIndexUpToTimeLimitSeconds=21600 --setParameter mongodThreads=24 --setParameter noIndexBuildRetry=false --setParameter diagnosticDataCollectionIntervalSecs=60 --setParameter diaglog=1
以上命令将 Mongod 实例的日志等级设置为 1,只记录错误信息。或者,我们可以通过配置文件来设置非标准的日志等级:
#编辑 MongoDB 的配置文件
vi /etc/mongod.conf
在配置文件中,我们可以找到 以下配置项:
systemLog:
verbosity:
将 替换为所需的数字即可。数字越高,日志等级越详细。
2、启用日志轮换
启用日志轮换功能后,MongoDB 会定期将日志记录到新的文件中,从而减少日志文件的大小。我们可以在配置文件中设置日志轮换:
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen #在写入新数据时进行日志轮换
logFileMode: 0644
以上配置将在每次写入新的数据时执行日志轮换。
3、清空日志文件
如果 MongoDB 日志文件已经占据了大量的磁盘空间,我们可以通过清空日志来解决这个问题。我们不必删除整个日志文件,而是可以清空该文件,然后重新开始记录日志。有两种方法可以清空日志文件:
手动清空日志文件: 打开 MongoDB 日志文件所在路径,将 mongod.log 文件清空即可。
使用 MongoDB 内置命令: 从 MongoDB 3.2 版本开始,我们可以使用内置命令清空日志文件。在 MongoDB Shell 中执行以下命令:
#在 MongoDB shell 中执行以下命令,清空 mongod.log 文件
db.runCommand( {
“logRotate” : 1
}
)
以上命令将会触发日志轮换,当前日志文件将被重命名为 mongod.log.0,新的 mongod.log 文件将开始记录日志。
16. 如何监控某Linux文件的变化 ?
notify-tools是一个Linux下的系统工具,可以监听文件或目录的状态变化,包括文件的创建、删除和修改等操作。我们可以使用inotifywait命令来启动一个监控程序,对目标文件或目录进行监控。下面是一个使用inotifywait命令监控/var/log目录下文件变化的示例代码:
#!/bin/bash
inotifywait -m /var/log --exclude ‘.gz
′
−
e
c
r
e
a
t
e
,
m
o
v
e
,
m
o
d
i
f
y
∣
w
h
i
l
e
r
e
a
d
p
a
t
h
a
c
t
i
o
n
f
i
l
e
;
d
o
e
c
h
o
"
T
h
e
f
i
l
e
′
' -e create,move,modify | while read path action file; do echo "The file '
′−ecreate,move,modify∣whilereadpathactionfile;doecho"Thefile′file’ appeared in directory ‘
p
a
t
h
′
v
i
a
′
path' via '
path′via′action’"
#在这里编写需要执行的日志操作
done
上面的代码会持续监控/var/log目录下的文件变化,当有新的文件被创建、移动、修改时,会输出相关信息,同时可以在相应的操作中添加需要执行的命令。
17. 如何利用Shell脚本清理日志文件 ?
除了自动轮替日志外,我们还可以编写相应的shell脚本来定期对日志文件进行手动清理。下面是一个使用find命令和grep命令自动清理nginx日志文件的示例代码:
#!/bin/bash
NGINX_LOGS=“/var/log/nginx/”
MAX_DAYS=30
echo “Looking for old files in: $NGINX_LOGS”
find
N
G
I
N
X
L
O
G
S
−
t
y
p
e
f
−
i
n
a
m
e
"
a
c
c
e
s
s
.
l
o
g
∗
"
−
m
t
i
m
e
+
NGINX_LOGS -type f -iname "access.log*" -mtime +
NGINXLOGS−typef−iname"access.log∗"−mtime+MAX_DAYS | grep -v “$(date +%Y-%m-%d)” | while read file_path;
do
echo “Old log file found: $file_path”
gzip -9 $file_path
done
echo “Done. Old files removed.”
上面的代码将会在指定的/var/log/nginx文件夹下查找所有名为access.log*的日志文件,并将超过30天的历史文件进行压缩。同时,在压缩后会删除所有当天的文件,保留以前的文件作为历史备份
18. 如何实现Python日志输出到文件 ?
一、创建和配置日志
在Python中,通过引入logging模块来创建和配置日志记录器:
import logging
logging.basicConfig(filename=‘example.log’, level=logging.INFO)
在上述代码中,我们使用基本配置方法basicConfig()来配置日志信息的文件名和日志记录级别。我们将日志信息记录到example.log文件中,并将日志记录级别设置为INFO,这意味着所有大于或等于INFO级别的记录都会被记录。
二、输出日志记录
在日志记录器被创建和配置后,可以使用不同级别的方法来输出日志记录,如下所示:
logging.debug(‘This is a debug message’)
logging.info(‘This is an information message’)
logging.warning(‘This is a warning message’)
logging.error(‘This is an error message’)
logging.critical(‘This is a critical message’)
上述代码使用debug()、info()、warning()、error()和critical()方法轻松地输出不同级别的日志消息。例如,当记录级别被设置为INFO时,大于或等于INFO级别的日志将被输出到example.log文件中。
三、日志信息的格式化输出
日志信息的格式化是日志系统中的一个重要组成部分,它使得日志信息更容易阅读和理解。可以使用格式化功能来自定义日志信息输出的格式。下面是一个将日志记录格式化输出的例子:
logging.basicConfig(format=‘%(asctime)s %(message)s’, datefmt=‘%m/%d/%Y %I:%M:%S %p’)
logging.warning(‘This is a warning message with formatting’)
在上述代码中,我们使用format参数和datefmt参数来自定义日志记录消息的格式。“%(asctime)s"表示记录消息的时间,”%(message)s"表示记录消息的内容。datefmt参数用于设置asctime的日期和时间格式。
四、同时输出到控制台和日志文件
在某些情况下,您可能想同时将日志信息输出到控制台和日志文件中。下面是一个例子,演示了如何将日志记录输出到控制台和日志文件中:
import logging
#创建并配置日志记录器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
#创建文件处理器
file_handler = logging.FileHandler(filename=‘example.log’, mode=‘w’)
file_handler.setLevel(logging.DEBUG)
#创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
#创建格式化输出
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’)
#将格式化输出和处理器关联
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
#将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
#输出日志记录
logging.debug(‘This is a debug message’)
logging.info(‘This is an information message’)
logging.warning(‘This is a warning message’)
logging.error(‘This is an error message’)
logging.critical(‘This is a critical message’)
在上述代码中,我们创建并配置了日志记录器,并创建了文件处理器和控制台处理器。使用setFormatter()方法将格式化输出和处理器关联,最后将处理器添加到日志记录器中。现在,日志记录将同时在控制台和example.log文件中输出。
五、使用RotatingFileHandler实现日志轮换
RotatingFileHandler是Python日志模块中一个很重要的类,它提供了一种动态地将日志轮换到多个文件的机制。下面是一个实现日志轮换的例子:
import logging
#配置日志记录器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
#配置RotatingFileHandler
file_handler = logging.handlers.RotatingFileHandler(filename=‘example.log’, maxBytes=1024, backupCount=3)
file_handler.setLevel(logging.DEBUG)
#记录日志
for i in range(10):
logger.debug(‘This is a debug message’)
logger.info(‘This is an information message’)
logger.warning(‘This is a warning message’)
logger.error(‘This is an error message’)
logger.critical(‘This is a critical message’)
在上述代码中,我们使用RotatingFileHandler类来实现日志轮换。这个例子展示了将日志记录写入到文件轮替。maxBytes参数表示日志文件的最大大小,当日志文件超出这个大小时,旧日志将被删除并新日志将从文件顶部开始写入。
19. Linux下如何获取和修改当前日志级别 ?
一、获取当前日志级别
要获取当前日志级别,我们需要调用相关函数或方法,这里以Python为例。Python的logging模块中,可以使用以下代码获取当前日志级别:
import logging
logger = logging.getLogger()
current_level = logger.getEffectiveLevel()
print(‘Current log level:’, current_level)
以上代码中的logger是默认的logger对象,使用getEffectiveLevel()函数可以获取当前的日志级别。如果你有自己的logger对象,可以使用相同的方式获取其当前的级别。
此外,在Java中,我们可以通过Logger对象的getLevel()方法获取当前的日志级别:
import java.util.logging.Logger;
Logger logger = Logger.getLogger(“MyLogger”);
Level currentLevel = logger.getLevel();
System.out.println("Current log level: " + currentLevel.getName());
以上代码中的MyLogger是指定的logger名称,使用getLevel()方法获取当前的日志级别。同样的方式也可以在其他编程语言中实现。
二、修改当前日志级别
要修改当前日志级别,我们可以使用相关函数或方法将当前的级别修改为指定级别。以下是Python的实现方式:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
print(‘Updated log level:’, logger.getEffectiveLevel())
以上代码中,使用logger.setLevel()函数将当前的日志级别修改为DEBUG级别,这里可以设置为其他级别。修改后,使用getEffectiveLevel()函数可以再次获取当前的日志级别,确认修改是否成功。
在Java中,我们可以使用Logger对象的setLevel()方法修改当前的日志级别:
import java.util.logging.Level;
import java.util.logging.Logger;
Logger logger = Logger.getLogger(“MyLogger”);
logger.setLevel(Level.FINE);
System.out.println("Updated log level: " + logger.getLevel().getName());
以上代码中,使用logger.setLevel()方法将当前的日志级别修改为FINE级别,同样可以设置为其他级别。确认修改后,使用getLevel().getName()方法获取当前的日志级别。
20. 如何将Nginx日志按日期切割详解(按天切割) ?
每天凌晨00:00把前一天的Nginx日志access.log重命名为access-xxxx-xx-xx.log格式,例如:access-2016-10-01.log
实现方法
脚本
vim /opt/nginx/cut_nginx_log.sh
1234567891011121314 #!/bin/bash#此脚本用于自动分割Nginx的日志,包括access.log和error.log#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件#Nginx日志文件所在目录LOG_PATH=/opt/nginx/logs#获取昨天的日期YESTERDAY=$(date -d “yesterday” +%Y-%m-%d)#获取pid文件路径PID=/var/run/nginx/nginx.pid#分割日志mv $ {
LOG_PATH
}
access.log $ {
LOG_PATH
}
access-$ {
YESTERDAY
}
.logmv $ {
LOG_PATH
}
error.log $ {
LOG_PATH
}
error-$ {
YESTERDAY
}
.log#向Nginx主进程发送USR1信号,重新打开日志文件kill -USR1 `cat $ {
PID
}
chmod +x /opt/nginx/cut_nginx_log.sh
定时任务
配置crontab每天凌晨00:00定时执行这个脚本
crontab -e#输入以下内容并保存00 00 * * * /bin/bash /opt/nginx/sbin/cut_nginx_log.sh
21. Mysql binlog日志自动清理及手动删除?
有三种解决方法:
1.关闭mysql主从,关闭binlog;
2.开启mysql主从,设置expire_logs_days;
3.手动清除binlog文件,> PURGE MASTER LOGS TO ‘MySQL-bin.010’;
实现:
1.关闭mysql主从,关闭binlog
#vim /etc/my.cnf //注释掉log-bin,binlog_format
#Replication Master Server (default)
#binary logging is required for replication
#log-bin=mysql-bin
#binary logging format - mixed recommended
#binlog_format=mixed
然后重启数据库
2.重启mysql,开启mysql主从,设置expire_logs_days
#vim /etc/my.cnf //修改expire_logs_days,x是自动删除的天数,一般将x设置为短点,如10
expire_logs_days = x //二进制日志自动删除的天数。默认值为0,表示“没有自动删除”
此方法需要重启mysql,附录有关于expire_logs_days的英文说明
当然也可以不重启mysql,开启mysql主从,直接在mysql里设置expire_logs_days
show binary logs;
show variables like ‘%log%’;
set global expire_logs_days = 10;
3.手动清除binlog文件
#/usr/local/mysql/bin/mysql -u root -p
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
//删除10天前的MySQL binlog日志,附录2有关于PURGE MASTER LOGS手动删除用法及示例
show master logs;
也可以重置master,删除所有binlog文件:
#/usr/local/mysql/bin/mysql -u root -p
reset master;
//附录3有清除binlog时,对从mysql的影响说明
22. 简述如何使用 Symbolicatecrash转化crash日志?
查看crash日志的步骤:
1.找到xcode自带的文symbolicatecrash,路径是
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources
2.把symbolicatecrash文件拷贝到你方便查看的地方,比如桌面文件app
3.把应用包.app和crash日志文件也拷贝到app文件中
4.打开终端,cd 进入app文件,输入export DEVELOPER_DIR=“/Applications/Xcode.app/Contents/Developer”,回车。
5.再输入./symbolicatecrash xxx.crash xxx.app >aa.log
aa.log就是我们需要的文件了。
23. 简述Oracle日志挖掘使用什么工具 ?
众所周知,所有对用户数据和数据字典的改变都记录在Oracle的Redo Log中,因此,Redo Log包含了所有进行恢复操作所需要的信息。但是,原始的Redo Log文件无法看懂,所以,Oracle从8i以后提供了一个非常有用的分析工具,称为LogMiner。使用该工具可以轻松获得Redo Log文件(包含归档日志文件)中的具体内容。特别是该工具可以分析出所有对于数据库的DML操作(INSERT、UPDATE、DELETE等)语句。Oracle 9i后可以分析DDL语句,另外还可分析得到一些必要的回滚SQL语句。LogMiner一个最重要的用途就是不用全部恢复数据库就可以恢复数据库的某个变化。该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner工具既可以用来分析在线日志,也可以用来分析离线日志文件,既可以分析本身自己数据库的重作日志文件,也可以用来分析其它数据库的重作日志文件。当分析其它数据库的重作日志文件时,需要注意的是,LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外,必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。源数据库(Source Database)平台必须和分析数据库(Mining Database)平台一样。
Oracle通过LogMiner工具对Redo Log进行挖掘,显示出一系列可读的信息,该过程称为日志挖掘。LogMiner通过V$LOGMNR_CONTENTS视图显示Redo Log中的信息。
总的说来,LogMiner工具的主要用途有:
1、跟踪数据库的变化:可以离线地跟踪数据库的变化,而不会影响在线系统的性能
2、回退数据库的变化:回退特定的变化数据,减少Point-In-Time Recovery的执行
3、优化和扩容计划:可通过分析日志文件中的数据以分析数据的增长模式
4、确定数据库的逻辑损坏时间:准确定位操作执行的时间和SCN
5、确定事务级要执行的精细逻辑恢复操作,可以取得相应的UNDO操作
6、执行后续审计
24. 如何使用Logrotate轮询Nginx日志?
Linux日志文件如果不定期清理,会填满整个磁盘。这样会很危险,因此日志管理是系统管理员日常工作之一。我们可以使用”logrotate”来管理linux日志文件,它可以实现日志的自动滚动,日志归档等功能。下面以nginx日志文件来讲解下logrotate的用法。
在/etc/logrotate.d/目录下创建一个配置文件”nginx”,内容如下:
#vim /etc/logrotate.d/nginx/usr/local/nginx/logs
/.log {
daily
rotate 5
missingok
dateext
compress
notifempty
sharedscripts
postrotate
[ -e /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid
]
endscript
}
注释:
/usr/local/nginx/logs/.log:需要轮询日志路径
daily:每天轮询
rotate 5:保留最多5次滚动的日志
missingok:如果日志丢失,不报错继续滚动下一个日志
dateext:使用日期作为命名格式
compress:通过gzip压缩转储以后的日志
notifempty:当日志为空时不进行滚动
/var/run/nginx.pid: nginx pid位置,请查看nginx.conf
postrotate/endscript:在截断转储以后需要执行的命令
立即截断可执行下面
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
注:
由于logratate已经加到cron.daily(/etc/cron.daily/logrotate),不再需要加到计划任务中
25. 简述Log日志有5G,如何打开?
这个打开是做什么? 是想看看里面的部分内容吗?日志一行一行的,可以先用head命令查看前多少行,觉得不够再用tail查看后面多少行是啥。 如果想从日志里面提出东西可以用awk命令来一行一行处理。 如果处理逻辑的比较多的话,就用python吧, Python中的file(‘log.log’,‘r’)就是一个行迭代器,占内存很少。
如果是想直接用可视化工具打开的话,前面说的ultraEdit64位可以做到
推荐使用EmEditor,下图截取自官网介绍。
可以用fopen/while(!feof($fp))/fgets逐行遍历文件进行操作:
使用linux的split就好了
split -b 100m your_file
用ultraEdit64位试试
26. 详细阐述Linux 如何搭建ELK日志收集系统 ?
首先安装JDK及配置环境变量
1.解压安装包到/usr/local/java目录下
[root@VM_0_9_centos ~]#tar xvf /ryt/soft/jdk-11.0.3_linux-x64_bin.tar.gz -C /usr/local/java/
2.配置环境变量(在尾部追加内容如下)
[root@VM_0_9_centos ~]#vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk-11.0.3
export JRE_HOME=
J
A
V
A
H
O
M
E
/
j
r
e
e
x
p
o
r
t
C
L
A
S
S
P
A
T
H
=
.
:
{JAVA_HOME}/jre export CLASSPATH=.:
JAVAHOME/jreexportCLASSPATH=.:{JAVA_HOME}/lib:
J
R
E
H
O
M
E
/
l
i
b
e
x
p
o
r
t
P
A
T
H
=
{JRE_HOME}/lib export PATH=
JREHOME/libexportPATH={JAVA_HOME}/bin:$PATH
3.重启配置文件,使其立即生效
[root@VM_0_9_centos ~]#source /etc/profile
ELK搭建详细过程
安装程序:filebeat,elasticsearch,logstash,kibana
1.安装Elasticsearch
1)解压安装包到路径/usr/local/elk下
[root@VM_0_9_centos ~]#tar -zxvf /ryt/soft/elk/elasticsearch-7.2.0-linux-x86_64.tar.gz -C /usr/local/elk/
2.创建用户并赋权
[root@VM_0_9_centos elk]#useradd es_user
[root@VM_0_9_centos elk]#groupadd esgroup
[root@VM_0_9_centos elk]#chown -R es_user:esgroup /usr/local/elk/elasticsearch-7.2.0/
3)修改ES配置文件:
[root@VM_0_9_centos elk]#?vim /usr/local/elk/elasticsearch-7.2.0/config/elasticsearch.yml
#这里指定的是集群名称,需要修改为对应的,开启了自发现功能后,ES会按照此集群名称进行集群发现
cluster.name: elk-application
node.name: node-1
#目录需要手动创建
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
#ES监听地址
network.host: 0.0.0.0 #允许外网个访问
http.port: 9200
discovery.seed_hosts: [“172.17.0.9”] #内网ip
cluster.initial_master_nodes: [“node-1”]
4)修改系统参数
#添加参数、
m.max_map_count=655360
注:ES启动的时候回占用特别大的资源所以需要修改下系统参数,若不修改资源启动会异常退出
[root@VM_0_9_centos elk]#vim /etc/sysctl.conf
5)重新载入配置
[root@VM_0_9_centos elk]#sysctl -p /etc/sysctl.conf
6)修改资源参数
[root@VM_0_9_centos elk]#vim /etc/security/limits.conf
修改内容
- soft nofile 65536
- hard nofile 131072
- soft nproc 65536
- hard nproc 131072
7)设置用户资源参数
[root@VM_0_9_centos elk]#vim /etc/security/limits.d/20-nproc.conf
#添加
es_user soft nproc 65536
8)创建数据和日志目录并修改目录权限
[root@VM_0_9_centos elk]#mkdir -pv /usr/local/elk/{data,logs}
[root@VM_0_9_centos elk]#chown -R es_user:esgroup /data/elasticsearch/
[root@VM_0_9_centos elk]#chown -R es_user:esgroup /usr/local/elk/elasticsearch-7.2.0
9)切换用户并后台启动ES
[root@VM_0_9_centos elk]#su es_user
[es_user@VM_0_9_centos elk]$ /usr/local/elk/elasticsearch-7.2.0/bin/elasticsearch &
2.安装logstash
1.解压安装包并移到/usr/local/elk目录下
[root@VM_0_9_centos filebeat-7.2.0]#tar -zvxf /ryt/soft/elk/logstash-7.2.0.tar.gz -C /usr/local/elk/
2.创建软连接
[root@VM_0_9_centos elk]#ln -s /usr/local/elk/logstash-7.2.0 /usr/local/elk/logstash
注:Java HotSpot™ 64-Bit Server VM warning:
INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed;
error=‘Not enough space’ (errno=12)
[root@VM_0_9_centos elk]#vim ./elasticsearch-7.2.0/config/jvm.options
3.安装filebeat
1)解压安装包到路径/usr/local/elk下
[root@VM_0_9_centos elk]#tar xvf filebeat-7.2.0-linux-x86_64.tar.gz -C /usr/local/elk/
2)修改配置文件,使filebeat获取的日志进入redis:
注:此处演示获取spring cloud框架中eureka日志,其他程序日志都可相同方法获取
[root@VM_0_9_centos filebeat-7.2.0]#
[root@VM_0_9_centos filebeat-7.2.0]#pwd
/usr/local/elk/filebeat-7.2.0
[root@VM_0_9_centos filebeat-7.2.0]#vim ./filebeat.yml
#修改的内容有一家几个字段
enabled:true
paths:程序日志路径
output.logstash:
hosts:[“服务器IP:5044”]
output.redis:
hosts:127.0.0.1 #redis所在服务器IP
port:6379 #redis端口
key:“filebeat-log” #redis中的key
3)设置开机启动
修改配置rc.local,后面追加 /usr/local/elk/filebeat-7.2.0/filebeat > /tmp/filebeat.log 2>&1
[root@VM_0_9_centos filebeat-7.2.0]#vim /etc/rc.local
4)后台启动filebeat
[root@VM_0_9_centos filebeat-7.2.0]#/usr/local/elk/filebeat-7.2.0/filebeat &
? 5)查看启动,filebeat有没有监听端口,主要看日志和进程
[root@VM_0_9_centos filebeat-7.2.0]#ps -ef | grep filebeat
[root@VM_0_9_centos filebeat-7.2.0]#tailf logs/filebeat
Linux 搭建ELK日志收集系统 - 文章图片
4.启动logstash
测试一下logstash不指定配置文件启动
[root@VM_0_9_centos config]#/usr/local/elk/logstash/bin/logstash -e ‘input { stdin { } } output { stdout {} }’
注:手动输入 hello world,它也会输出 hello world
Linux 搭建ELK日志收集系统 - 文章图片
5.安装kibana
1)解压安装包到路径/usr/local/elk下
[root@VM_0_9_centos ~]#tar -zxvf /ryt/soft/elk/kibana-7.2.0-linux-x86_64.tar.gz -C /usr/local/elk/
2)编辑kibana配置文件
[root@VM_0_9_centos ~]#vim /usr/local/elk/kibana-7.2.0/config/kibana.yml
? ?server.port: 5601 ? ?server.host: “0.0.0.0” ? ?elasticsearch.hosts: [“http://49.234.206.139:9200”]
3)后台启动kibana
[root@VM_0_9_centos ~]#/usr/local/elk/kibana-7.2.0/bin/kibana --allow-root &
27. Linux怎么删除清空日志?
删除日志的方法:1、使用“cat /dev/null > 日志文件名”命令;2、使用“: > 日志文件名”命令;3、使用“> 日志文件名”命令;4、使用“echo “” > 日志文件名”命令;5、使用“echo > 日志文件名”命令。
28. 简述Linux 宕机日志在哪?
Linux宕机日志在“/var/log/”中;linux下的“/var/log/”的log日志,包括message、内核报错日志demsg等;其中sa记录是记录cpu、内存等运行的性能文件;利用sa文件可以查看宕机时CPU和内存情况。
29. Linux怎么查询Oracle错误日志?
Linux查询oracle错误日志的方法:
1、利用“show parameter background_dump_dest”命令获取错误日志的目录,通过目录来查询错误日志;
2、利用错误提示的PID来模糊查询对应的错误日志,语法为“find -name “ora错误提示的PID*.trc””。
30. 简述Linux如何查看登录日志 ?
last -f /var/log/wtmp
该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。
该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。
31. 简述Linux下查看PHP错误日志的位置的方法?
可以通过执行【echo ‘’ | php 2>&1 |grep -i error_log】命令查看错误日志的存放位置
32. 简述Linux系统日志文件包含几列内容 ?
linux系统日志文件的格式分析
只要是由日志服务 rsyslogd 记录的日志文件,它们的格式就都是一样的。所以我们只要了解了日志文件的格式,就可以很轻松地看懂日志文件。
日志文件的格式包含以下 4 列:
事件产生的时间。
产生事件的服务器的主机名。
产生事件的服务名或程序名。
[root@localhost ~]#vi /var/log/secure
Jun 5 03:20:46 localhost sshd[1630]:Accepted password for root from 192.168.0.104 port 4229 ssh2
#6月5日 03:20:46 本地主机 sshd服务产生消息:接收从192.168.0.104主机的4229端口发起的ssh连接的密码
Jun 5 03:20:46 localhost sshd[1630]:pam_unix(sshd:session):session opened for user root by (uid=0)
#时间 本地主机 sshd服务中pam_unix模块产生消息:打开用户root的会话(UID为0)
Jun 5 03:25:04 localhost useradd[1661]:new group:name=bb, GID=501
#时间 本地主机 useradd命令产生消息:新建立bb组,GID为501
Jun 5 03:25:04 localhost useradd[1661]:new user:name=bb, UID=501, GID=501, home=/home/bb, shell=/bin/bash
Jun 5 03:25:09 localhost passwd:pam_unix(passwd:chauthtok):password changed for bb
33. 简述Linux crontab 错误日志怎么查看?
Linux查看crontab错误日志的方法:
1、查看文件目录“/var/log/cron”;
2、通过“tail -f /var/log/cron”命令实现实时文件尾部查看;
3、通过“vim /var/log/cron”命令实现通过高级文本查看器查看即可。
34. 简述有两台游戏服务器运行于linux 2.6.x内核上,需要同步用户访问日志,你会用下列哪些方法同步日志(开放题:假设权限和条件均可满足) ?
A:rsync
B:wget
C:scp
D:ftp
A
35. 简述被需要检查系统中的设备情况,需要检查哪个log日志? ?
A:/var/log/tmp
B:/var/log/lastlog
C:/var/log/messages
D:/var/log/utmp
C
36. 简述下列哪个命令能查找当前目录一个月(30天)以前大于 100M 的日志文件(.log)并删除() ?
A:find . -name “.log" -m time +30 -type f -size +100M | xargs rm -rf {};
B:find . -name ".log” -mtime +30 -type f -size +100M | xargs rm -rf {};
C:find . -name “.log" -mtime +30 -type -size 100M | xargs rm -rf {};
D:find . -name ".log” -mtime +30 -type f -size 100M | xargs rm -rf {};
B
37. 假设Apache产生的日志文件名为access_log,在apache正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的apache的日志会打印到哪里,请选择下列描述正确的是? ?
A:系统会检查access_log文件是否存在,若不存在则创建。
B:虽然此时文件被改名,但是由于服务正在运行,因为它的inode节点的位置没有变,程序打开的fd仍然会指向原来那个inode,不会因为文件名的改变而改变。apache会继续向已改名的文件中追加日志。
C:系统会报错
D:以上答案都不正确
B
38. 你被需要检查系统中的设备情况,需要检查哪个log日志 ?
A:/var/log/tmp
B:/var/log/lastlog
C:/var/log/messages
D:/var/log/utmp
C
39. 简述bash中,需要将脚本demo.sh的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 ?
A:bash demo.sh &>demo.log
B:bash demo.sh >& demo.log
C:bash demo.sh >demo.log 2>&1
D:bash demo.sh 2>demo.log 1>demo.log
ABC
40. 简述以下对logcat 命令描述正确的是 ?
A:logcat是linux shell中的一个命令行工具,可以用于得到程序的输入信息
B:adb logcat –v time
C:adb log cat –F logcat.txt
D:adb logcat -c
BD
[:space:] ↩︎