[运维日志] Web 服务器日志依日期归档
1.概述
本文记录了一个以 Jboss 服务器日志归档的 powershell 示范项目。该项目只需要略加修改,即可用于所有类似需要归档日志的场景。
Jboss 是一个Java Web 框架,在 Jboss Web 服务器运行期间,默认会生成许多server.log
日志文件,你可以在 Jboss中设置每个 server.log
的最大大小,这样每当一个日志文件写满后,将后缀依次添加.1
、.2
…以示区别,知道到达设置的最大日志文件个数后,将其删除。
在某些场景下,我们不希望有过多的大日志文件,或者希望在有限的服务器磁盘上存储更多的日志,以备保留服务器在生产运行下的某些重要信息,这个时候我们就需要对日志进行压缩归档,让日志文件更小,并且不至于被过早地由系统自动删除。
7zip 是一款不错的压缩软件,目前在Windows
、Linux
以及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.1
, server.log.2
, server.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中实现一个最基本的日志器logger:https://blog.csdn.net/qq_28550263/article/details/124024540
文中章节 2. 代码实现 部分给出了这部分代码。
其中,32行
:$logmessages >> $this.SavePath
,若该归档脚本本身不希望输出任何日志,则可以注释掉。