【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。

Linux系统查看应用日志

一、背景

为了方便测试查看服务日志,而开发shell来实现快捷查看日志的脚本,具体做法呢就是固定输出服务日志路径:/logs/server-name/server*.log;这样做的意图就是简单明了、同时方便谁都可以维护,只需要按格式往脚本添加服务日志路径即可,缺点是可移植性不高,基本等于重写。

在这里插入图片描述

二、分析

经过一段时间沉淀之后,觉得这样写的脚本不够灵活,所以想再改进一下,当然这个需要约定,比如服务名称和服务日志路径名称基本一致;以固定的格式来查看服务日志:/public/server-name/log/log_tatol.log,那么只需要获取server-name就可以查看对应的服务日志了;

2.1、思路

通过ps命令过滤获取java服务进程(服务名称);然后for循环提取服务名称,并按序号储存(用字典);按序号echo输出服务名称,动态获取的服务名,即如果没有进程则不会出现,还有每次重启它将在最后一名;然后使用while循环,通过序号key提取value,拼接成服务日志路径,最后tail,再获取一个行数即可。

三、shell脚本实现

  • 储备linux系统指令,如echo、tail、ps等;
  • 要有面向过程编程思想,熟练掌握for … in、while、if…else等循环、条件语句的用法;
  • 扩展一些特殊的用法:echo -e -n ,e表示输出带颜色的内容、-n便是不用换行。
#!/bin/bash
# 服务路径
SERVER_HOME=/home/dingding
# 索引
index=0
# 定义一个dict
declare -A SERVERS
echo -e "\e[92m☆★☆★★☆☆★☆ 当前可查询日志的服务如下列表 ★★★★★☆★★★★★☆★★☆★☆\e[0m"
echo -e "\e[92m☆★☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆☆☆☆★☆★☆★☆☆★★\e[0m"
# 遍历java进程
for server in `ps -aux|grep xxxx|grep -v grep|awk -F '.jar' '{print $2}'`
do
    index=$(($index+1))
    echo -e "\e[92m☆★☆★☆☆★☆★☆ $index: ${server/xxxx/yyyy}      \e[0m"
    # 增加字典key-value
    SERVERS[$index]=${
   
   server/xxxx/yyyy}
done

echo -e "\e[92m☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆☆☆★☆☆★☆★☆★☆☆★★\e[0m"
echo -e "\e[92m☆★☆☆★☆★ 输入任何序号外的数字即退出当前日志系统! ☆★★☆★☆★\e[0m"
echo -e "\e[92m☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆☆☆★☆☆★☆★☆★☆☆★★\e[0m"

while true;do

echo -e "\e[92m★☆★☆★★★★☆★★☆★★☆★★★   请输入服务序号 ★☆★★★☆★★☆★☆★☆★★☆★★★★:\e[0m"
read no

if [ -v ${
   
   SERVERS[$no]} ] 
then
  echo -e "\e[92m☆★☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆★☆☆★☆★☆★☆☆★★\e[0m"
  echo -e "\e[92m☆★☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆☆☆★☆☆★☆★☆★☆☆★★\e[0m"
  echo -e "\e[91m☆★☆★☆★☆☆☆★☆★☆★ 服务不存在请输入正确服务序号! ☆★☆☆★☆★☆★☆★\e[0m"
  echo -e "\e[92m☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆☆☆★☆☆★☆★☆★☆☆★★\e[0m"
  echo -e "\e[92m☆★☆★☆★☆★☆★★☆★★☆★★☆★★☆★☆★★☆★☆★☆★☆★☆★☆☆★☆☆★☆☆☆★☆☆★☆★☆★☆☆★★\e[0m"
  continue

else
  echo -e "\e[92m★☆★☆★★☆☆★★★   请输入日志行数(不输默认查看50行) ★☆★★☆★☆★★:\e[0m"
  read line

  if [ -z $line ];then
    line=50
  fi

  echo -e "\033[92m ${SERVERS[$no]}服务日志: \033[0m"
  tail -${
   
   line}f $SERVER_HOME/${
   
   SERVERS[$no]}/log/log_total.log 

fi

done
3.1、效果演示1

除去一些echo输出语句,实际脚本有效代码行约15行,而且都是动态的获取的服务名称,只需要约定服务名称唯一且有效,无论换到哪台服务器,基本稍作修改就能投入使用;查看下面效果截图,可以看出它不是很完美,就是服务旁边有缺口,这是处女座所不能容忍的,所以必须想办法处理。

在这里插入图片描述

3.2、优化shell脚本
  • 增加字符串替换,原因是出现不同节点的服务目录名称和jar包名不一致,所以需要替换一下,当然也可以改成一样;
  • 就是for循环输出服务旁边的缺口,在循环体内通过获取字符的长度,然后再用固定值减去它,用空格*差值,最后输出星星
3.3、效果演示2

在这里插入图片描述

四、技能扩展

  • shell字符串替换
[root@localhost ~]# server=yunxin-bizjoinquery
[root@localhost ~]# new_server=#{server/yuxin/s5}
[root@localhost ~]# echo $new_server
s5-bizjoinquery
  • 数字字符串转成数字类型
[root@localhost ~]# s=123
[root@localhost ~]# echo $s
123
[root@localhost ~]# echo $s""
123
  • 字符串长度
[root@localhost ~]# s=123abc
[root@localhost ~]# echo ${#s}
6
  • for循环
for ((i=1;i<5;i++))
do
 echo $i
done
  • 定义dict
declare -A SERVER
SERVER=(['A']=1,['B']=2)
SERVER['C']=3
echo ${!SERVER[*]} # 输出key
echo ${SERVER[*]} # 输出value
  • echo输出颜色的文字
[root@localhost ~]# echo -e "\033[32m 绿色 \033[0m"
[root@localhost ~]# echo -e "\033[31m 红色 \033[0m"
[root@localhost ~]# echo -e "\033[33m 黄色 \033[0m"

# \033[31m开始......\033[0m,结束还原
# \033可以使用\e代替
[root@localhost ~]# echo -e "\e[34m 蓝色 \e[0m"

五、总结

不管题主前面写了什么,说了什么,每个看到的人,都需要着手去试验一番,然后理解成自己能掌握的样子,当然也可以先收藏起来,待到需要用的时候再翻出来。日拱一卒无有尽,功不唐捐终入海。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
175 3
|
2月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
73 4
|
3月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
185 25
|
3月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
63 18
|
Shell Linux
Linux使用Shell脚本定时清理日志
Linux使用Shell脚本定时清理日志
256 1
|
监控 Shell Linux
linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志
linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志
329 0
|
4月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。