【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"

五、总结

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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
358 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
222 2
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
226 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
435 0
|
12月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
3270 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
6月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
713 54
|
11月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
295 9
|
9月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
713 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log