[运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: [运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)

[运维日志] Web 服务器日志依日期归档


1.概述

本文记录了一个以 Jboss 服务器日志归档的 powershell 示范项目。该项目只需要略加修改,即可用于所有类似需要归档日志的场景。

Jboss 是一个Java Web 框架,在 Jboss Web 服务器运行期间,默认会生成许多server.log日志文件,你可以在 Jboss中设置每个 server.log 的最大大小,这样每当一个日志文件写满后,将后缀依次添加.1.2…以示区别,知道到达设置的最大日志文件个数后,将其删除。

在某些场景下,我们不希望有过多的大日志文件,或者希望在有限的服务器磁盘上存储更多的日志,以备保留服务器在生产运行下的某些重要信息,这个时候我们就需要对日志进行压缩归档,让日志文件更小,并且不至于被过早地由系统自动删除。

7zip 是一款不错的压缩软件,目前在WindowsLinux以及macOS上都有相应官方版本,它以极高的压缩比例独步武林,尤其适合压缩文本文件,往往一份纯文本日志能压缩到百分之一到百分之二左右。

在我的另外一篇博文《案例详解-如何在 Linux 系统中安装和使用 7zip 以及 7zip的脚本编程使用教程》https://blog.csdn.net/qq_28550263/article/details/124876070 详细介绍了7zip的命令行使用方式,并提供了一个基于7zip官方给出的可执行文件而制作的.deb安装包。你也可以在7zip官网https://www.7-zip.org/找到并下载其他平台的版本。

我们通过 powershell 查询管理指定目录中的server.log.x文件,并通过powershell调用 7zip 软件提供的命令进行极限压缩,按照归档日期时间,自动地将写满的日志文件归档到一个指定的历史日志目录下。

2. Readme 文档 - VCS服务器 Jboss 日志压缩脚本

2.1 功能概述

该脚本用于压缩并清理 正在写入的 VCS JBOSS server.log 日志。

2.2 项目结构

└─zip_log_script            # 项目根目录
    ├─history_logs          # 历史日志压缩归档目录
    │  └─2022-06-08           # 某天被归档的目录,将由程序自动生成,当天归档压缩包放在其中
    |  └─ ...                 # ...
    |  └─ ...                 
    └─programs              # 脚本目录
        ├─log               # 空目录,存在只是为了程序运行
        └─utils             # 工具集目录,存放主程序运行需要的东西
        └─zip_logs.ps1      # 主程序

2.3 清理逻辑

->1

JBOSS 当前默认写入的文件为 server.log,当此文件写入到配置大小后,将会被赋予后缀 .1.2.3… 即 server.log.1server.log.2server.log.3…。

脚本读取 路径变量 $JBoss_LOG_DIR 中指定的路径(默认为"D:\orca\jboss\server\ORCA\log")下的所有文件,不包含该路径下的子路径。这个路径下存放了 1 处所述的 server.log.x。由于该文件夹下同时存放了其它文件,因此取出文件名包含 server 但非 server.log 的日志,有多少个取多少个。

无需要压缩的归档文件

如果在 路径变量 $JBoss_LOG_DIR 指定的目录中没有需要压缩的文件,比如刚刚完成前一次归档,JBOSS 还没有生成新的日志,那么即使你运行日志也不会执行任何归档操作,并且你将看到形如以下提示:

2022-06-08 03:22:04 [DEBUG] There are currently no logs need to archive.

2.4 程序运行环境依赖

脚本的运行需要安装有 powershell 以及 7zip 软件,同时两个软件的主目录在系统的 Path 环境变量中。Windows 系统中已经默认安装好了 powershell 并添加到环境变量,只需要更改powershell脚本执行策略,即已管理员身份打开 powershell 窗口输入并执行以下代码:

Set-ExecutionPolicy Unrestricted

关于 7zip 软件,由于安装完成后不会自动添加环境变量,如果系统上已经安装了该软件,则只需要手动在 Windows 高级系统设置中添加到 Path 边境变量中即可。

2.5 运行方式

可以手动运行,假设你位于该项目项目根目录下:

powershell ./programs/zip_logs.ps1

或者直接双击根目录下的Run.cmd

也可以添加到 Windows 任务计划,指定每天运行多次。

2.6 压缩级别

采用7z极限压缩,对于纯文本压缩后的大小可为压缩前的百分之一左右,因此可以大大节省日志在磁盘中的存储空间。

3. 项目源代码

主程序:zip_log_script

#*****************************************************************************
# Copyright Jack Lee. All rights reserved.
# Licensed under the MIT License.
# Email: 291148484@163.com
# https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343
#*****************************************************************************
using module .\utils\jcpath.psm1
using module .\utils\jclogger.psm1
$JBoss_LOG_DIR = "D:\orca\jboss\server\ORCA\log"
$BASE_DIR = (Get-Location).Path
$OUTPUT_DIR = [Path]::Join($BASE_DIR,'history_logs')
$PROGRAM_DIR = [Path]::Join($BASE_DIR,'programs')
$SavePath = [Path]::Join(
    $PROGRAM_DIR,
    'log'
)
$logger = [Logger]::new($SavePath);
$ArchiveName = (Get-Date -Format 'yyyy-MM-dd-HH-mm-ss')+".7z"
$Date_dir_name =  [Path]::Join($OUTPUT_DIR, (Get-Date -Format 'yyyy-MM-dd'))
$order = '7z a -mx9 -sdel '+ [Path]::Join($Date_dir_name, $ArchiveName)+' '
$order_sub = ""
foreach ($file in [Path]::get_items($JBoss_LOG_DIR) ) {
    $basename = [Path]::basename($file)
    if($basename.Contains('server') -and ($basename -ne 'server.log')){
        $logger.Info('The current log file found is: '+$basename)
        $order_sub = $order_sub + [Path]::Join($JBoss_LOG_DIR, $file) + ' '
    }
}
if($order_sub -ne ""){
    $logger.Info('Making compressed package and deleting the original log.')
    powershell -Command ($order + $order_sub)
    $logger.Info('All down')
}else{
    $logger.Debug("There are currently no logs need to archive.")
}

模块 jcpath.psm1

请参考我的博客:

【运维】PowerShell编程 目录文件相关方法的封装与案例详解https://blog.csdn.net/qq_28550263/article/details/124378032

在全文末尾的附录部分给出了这部分代码。

模块 jclogger.psm1

[运维技术]PowerShell中实现一个最基本的日志器loggerhttps://blog.csdn.net/qq_28550263/article/details/124024540

文中章节 2. 代码实现 部分给出了这部分代码。

其中,32行$logmessages >> $this.SavePath,若该归档脚本本身不希望输出任何日志,则可以注释掉。


附: 参考博文链接汇总

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
17天前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
43 2
|
2天前
|
弹性计算 运维
新 企业级ECS集群运维管理训练营 打卡学习领好礼
新 企业级ECS集群运维管理训练营 打卡学习领好礼
20 3
|
1天前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
9天前
|
运维 应用服务中间件 调度
自动化运维:使用Ansible实现服务器批量管理
【10月更文挑战第26天】在当今快速发展的IT领域,自动化运维已成为提升效率、降低人为错误的关键技术手段。本文通过介绍如何使用Ansible这一强大的自动化工具,来简化和加速服务器的批量管理工作,旨在帮助读者理解自动化运维的核心概念和实践方法。文章将围绕Ansible的基础使用、配置管理、任务调度等方面展开,通过实际案例引导读者深入理解自动化运维的实现过程,最终达到提高运维效率和质量的目的。
|
20天前
|
运维 负载均衡 安全
自动化运维:使用Ansible进行服务器配置管理
【10月更文挑战第15天】在本文中,我们将探讨如何利用Ansible这一强大的自动化工具来简化和加速服务器的配置管理工作。通过实际案例和代码示例,我们将展示Ansible如何帮助运维人员高效地进行软件部署、系统更新和日常维护任务,从而提升工作效率并减少人为错误。
|
26天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
1月前
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible管理服务器配置
【10月更文挑战第2天】在现代IT运维中,自动化是提高效率和减少错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化日常的服务器管理工作。我们将从基础讲起,逐步深入到高级应用,展示如何通过编写简单的Playbooks来自动化复杂的配置任务。文章还将探讨Ansible的最佳实践,并分享一些实际案例来说明其在实际工作中的应用。
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
41 1
|
1月前
|
分布式计算 资源调度 数据可视化
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
30 1
|
1月前
|
运维 应用服务中间件 nginx
自动化运维:使用Ansible管理服务器
【8月更文挑战第70天】随着互联网技术的飞速发展,服务器的数量和复杂性也在日益增加。如何高效、准确地管理这些服务器,成为了每一个运维人员必须面对的问题。本文将介绍如何使用Ansible这个开源的IT自动化工具,来帮助我们更好地管理服务器。Ansible以其简洁的语法、强大的功能和易于上手的特性,成为了运维人员的好帮手。我们将通过一些实际的例子,来看看Ansible是如何工作的。

热门文章

最新文章