初入公司,一招shell教你如何看清linux应用服务日志

news2024/11/15 4:52:35

文章目录

    • Linux系统查看应用日志
      • 一、背景
      • 二、分析
        • 2.1、思路
      • 三、shell脚本实现
        • 3.1、效果演示1
        • 3.2、优化shell脚本
        • 3.3、效果演示2
      • 四、技能扩展

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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过可视化运维配置,实现故障秒级自愈

急促的告警铃声响彻寂静的夜晚。对运维人来说&#xff0c;晚间值守耗费更大的精力&#xff0c;往往一个简单的磁盘使用率告警通知&#xff0c;就不得不爬起来进行处理&#xff0c;毕竟告警无小事&#xff0c;对于小问题&#xff0c;运维人也不能心存侥幸心理。虽然有着值班人员…

QML学习笔记【02】:QML快速入门

一、QML语法&#xff08;QML Syntax&#xff09; QML是一种描述用户界面的声明式语言。它将用户界面分解成一些更小的元素&#xff0c;这些元素能够结合成一个组件。QML语言描述了用户界面元素的形状和行为。用户界面能够使用JavaScript来提供修饰&#xff0c;或者增加更加复杂…

【OFDM系列9】OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交

不经意间在知乎看到这样一个问题&#xff0c;在此记录一下我的看法 OFDM采用正交区分不同子载波的&#xff0c;但是子载波通过调相后携带了基带信号后&#xff0c;如何还能继续保证两者正交&#xff1f; 补充内容是&#xff1a;OFDM是指通过2组正交载波传递信息&#xff0c;但…

最小生成树,贪心算法和Prim算法的Java代码实现过程详解

1.最小生成树原理 之前学习的加权图&#xff0c;我们发现它的边关联了一个权重&#xff0c;那么我们就可以根据这个权重解决最小成本问题&#xff0c;但如何才能找到最小成本对应的顶点和边呢&#xff1f;最小生成树相关算法可以解决。 定义&#xff1a; 图的生成树是它的一棵含…

新生活、新成长、新认知

总览&#xff1a; 承接上文&#xff1a;https://blog.csdn.net/weixin_46141936/article/details/125537093 ​ 今年夏天 (即大三暑假) 入职 北京金山云 开始进行暑期实习&#xff0c;首次进到大城市、步入职场、接触到各种人、年龄的成长 等等&#xff0c;让我的心态 在 202…

Canvas drawImage() 方法实现图片压缩

图片压缩原理 1.CanvasRenderingContext2D.drawImage() 方法可以从页面 DOM 元素作为图像源来根据坐标和大小重新绘制该图像。 2.HTMLCanvasElement.toDataURL() 和 HTMLCanvasElement.toBlob() 方法支持导出为 base64 字符串或 Blob 对象。 CanvasRenderingContext2D.drawIm…

uboot增加开机logo

uboot的开机logo图片是存放在uboot源码的tools/logos下的&#xff0c;并且对图片的格式是有要求的&#xff0c;必须为bmp格式&#xff0c;且色彩深度为8bit&#xff0c;大小应小于显示屏像素大小。按如下步骤即可在uboot中添加自己的开机logo 1、修改logo的图片格式&#xff0…

Trie树,并查集的简单应用(AcWing)

Trie树 Trie 树&#xff0c;也叫“字典树”。顾名思义&#xff0c;它是一个树形结构。它是一种专门处理字符串匹配的数据结构&#xff0c;用来解决在一组字符串集合中快速查找某个字符串的问题。 在每一个单词的结尾需要进行标记&#xff0c;统计个数 现在对上述样例进行模拟…

C/C++教程-从一个main函数带你走进C、C++的世界

通过文章C语言教程-main函数 我们知道一个程序只有一个main函数; 通过这个文章,学习第一个程序; 程序: #include <stdio.h> int main() {printf("my first programe");return 0; } 输出效果: 很多书籍中的第一个程序都是什么"hello world"…

BurpSuite抓取https数据包配置

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是BurpSuite抓取https数据包配置。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁…

Linux 系统安装 pyenv 简明教程

推荐关注博主的微信公众号 Android安全工程&#xff0c;微信公众号围绕 Android 应用的安全防护和逆向分析为主要的两个点&#xff0c; 分享各种安全攻防手段、Hook 技术、ARM 汇编等 Android 相关的知识 前置条件 gitKali 2022 / Ubuntu 16.04 安装步骤 1. 从远程仓库中克隆…

(十三)大白话一行数据中的多个NULL字段值在磁盘上怎么存储?

文章目录 1、为什么一行数据里的NULL值不能直接存储?2、NULL值是以二进制bit位来存储的3、结合小小案例来思考一行数据的磁盘存储格式4、磁盘上的一行数据到底如何读取出来的?5、今日思考题1、为什么一行数据里的NULL值不能直接存储? 之前我们已经给大家讲了在数据库里一行…

【虚幻引擎UE】UE5 按自定义日期范围筛选数据UI实现

基于UMG_Calendar插件按自定义日期范围筛选数据UI实现 数据一般由后端筛选,本文不作具体说明。 如果需要了解快捷 选择本周范围 以及 数据在前端筛选 如何实现,可私聊咨询。 一、插件下载 官方文档 二、范围筛选界面效果实现 1、打开DEMO关卡,默认是简单日历组件 2、创建…

Apollo浅解3

目录 Namespace Item Namespace与Item Namespace修改 界面操作 存储逻辑 更新Item 创建Item 删除Item Namespace发布 界面操作 存储逻辑 发布版本 发布顺序 题外 Namespace Namespace是配置项的集合&#xff0c;类似于一个配置文件的概念。官网解释的更为全面&a…

01 flv 的 binary 解析

想要看一下 这个 flv 的格式主要因素为 rtsp视频服务 转换为 rtmp服务 转换为前端可用的服务 , 然后 里面有 flv.js 的代码, 因为之前出现了一些问题 flvjs 播放 ws 服务代理的不存在的 rtsp 连接, Cannot read properties of null (reading ‘flushStashedSamples‘) 然后看了…

Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

Problem - C - Codeforces 翻译&#xff1a; Boboniu喜欢位操作。他想和你玩个游戏。 Boboniu给你两个序列的非负整数&#x1d44e;1&#x1d44e;2,…,&#x1d44e;&#x1d45b;&#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45a;。 为每个&#x1d456;(1≤&…

FPGA模拟SENSOR,MIPI CSI-2发送图像到RV1126

FPGA模拟SENSOR&#xff0c;MIPI CSI-2发送图像到RV1126 1&#xff1a;FPGA模拟Sensor&#xff0c; 使用MIPI CSI-2 Transmit&#xff0c;发送图像到RV1126。 2&#xff1a;MIPI CSI-2信号LANE&#xff0c;共5对。图像分辨率1920*1080&#xff0c;格式YUV422 8Bit&#xff0c…

整理了上千个 Python 工具库,涵盖24个大方向

Python 生态&#xff0c;向来以各种类库齐全而闻名&#xff0c;这也是这门语言如此受欢迎的重要原因。 今天就给大家分享一下这几天的战果&#xff0c;宵衣旰食&#xff0c;不眠不休的整理了近千个 Python 库&#xff0c;梳理不易啊&#xff0c;收藏的同时&#xff0c;记得点赞…

数据可视化之seaborn绘图

记录一个今天画出来的数据统计图(绝美&#xff0c;当然数据是癌症相关的就不是很美了, 之前一直都用plt.plot&#xff0c;也不太会用 但是现在发现seaborn真的可以 palette sns.color_palette("ocean", 2) sns.kdeplot(datacancer_data,xRadius (worst),shadeTrue…

ext4 extent详解2之内核源码详解

在查看本文前&#xff0c;希望先查看《ext4 extent详解1之示意图演示》这篇文章&#xff0c;有助于理解本文。本文内核源码版本3.10.96&#xff0c;详细内核详细源码注释见https://github.com/dongzhiyan-stack/kernel-code-comment。 什么时候会用到ext4 extent B树呢&#xf…