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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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日志并进行多维度分析。
相关文章
|
13天前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
|
13天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
17天前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
41 3
|
18天前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
49 3
|
18天前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
18天前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
46 0
|
18天前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!
|
19天前
|
运维 监控 Linux
深入理解Linux系统运维:命令行与脚本的奥秘
【8月更文挑战第30天】在Linux的世界里,命令行是运维人员的灵魂之窗。掌握命令行,就像握住了一把钥匙,能开启系统管理的宝藏箱。本文将带你走进Linux的命令行世界,通过实际代码示例,解锁那些高效管理和维护系统的秘籍。你将学到不仅仅是命令本身,更是如何将这些命令编织成强大的脚本,让日常的运维工作变得游刃有余。准备好跟随我的步伐,一起深入探索Linux命令行与脚本的奥秘吧!
|
16天前
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
175 73
|
9天前
|
Linux Shell
Linux 中 Tail 命令的 9 个实用示例
Linux 中 Tail 命令的 9 个实用示例
33 6
Linux 中 Tail 命令的 9 个实用示例