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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 关于如何使用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日志并进行多维度分析。
相关文章
|
10天前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
34 17
|
10天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
26 12
|
8天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
25 8
|
9天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
14天前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
30 0
|
14天前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
37 0
|
14天前
|
运维 监控 Shell
自动化运维之宝:编写高效的Shell脚本
【8月更文挑战第31天】在运维的世界里,Shell脚本是一把瑞士军刀,它让日常任务变得简单而高效。本文将通过浅显易懂的语言和实际案例,带你领略Shell脚本的魅力,并教你如何打造属于自己的自动化工具箱。无论你是初学者还是资深运维,这篇文章都将为你打开一扇窗,让你看到不一样的风景。让我们一起探索Shell脚本的世界吧!
|
15天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
53 6
|
4天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析