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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 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日志并进行多维度分析。
相关文章
|
9天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
14天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
71 5
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
51 7
|
2月前
|
Unix Linux Shell
linux入门!
本文档介绍了Linux系统入门的基础知识,包括操作系统概述、CentOS系统的安装与远程连接、文件操作、目录结构、用户和用户组管理、权限管理、Shell基础、输入输出、压缩打包、文件传输、软件安装、文件查找、进程管理、定时任务和服务管理等内容。重点讲解了常见的命令和操作技巧,帮助初学者快速掌握Linux系统的基本使用方法。
81 3
|
2月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
32 0
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
87 1
|
8月前
|
存储 监控 Ubuntu
Linux系统之GoAccess实时Web日志分析工具的基本使用
【5月更文挑战第22天】Linux系统之GoAccess实时Web日志分析工具的基本使用
238 1
|
8月前
|
存储 监控 数据可视化
linux日志分析工具与命令
在Linux中,日志分析常用命令行工具如`tail`(实时追踪日志)、`head`(显示日志开头)、`grep`(搜索关键词)、`awk`(复杂文本处理)、`sed`(文本替换)、`less`(分页查看)和`cat`(输出内容)。此外,还有日志分析工具如Logwatch(自动分析邮件摘要)、rsyslog/syslog-ng(日志收集)、Graylog(集中式管理)、ELK Stack(日志收集、解析、存储和可视化)和Splunk(企业级日志管理)。这些工具帮助管理员监控系统、排查问题、进行安全审计并获取业务洞察。
236 1