[运维技术]PowerShell中实现一个最基本的日志器logger

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: [运维技术]PowerShell中实现一个最基本的日志器logger

PowerShell中实现一个最基本的日志器logger


1. 场景介绍

Powershell 是 IT 运维中绕不过去的一个语言,它不仅能在Windows中使用,同样也适用于Linux。对于运维人员来说,虽然不需要像后端开发人员一样制作日志器以记录大量的生产数据,但也同样存在记录某些运行过程的需求。

本文实现一个简单的Logger,但我们再运维中使用脚本自动化启停服务,测试系统运行状态,执行脚本时,可以通过该Logger方便地输出记录相应地信息,清晰地标注日志等级和记录发生的时间。

2. 代码实现

#*****************************************************************************
# 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
#*****************************************************************************
class Logger {
    [string]$Lines
    [string]$SavePath
    [bool]$log
    Logger([string]$SavePath){
        $this.Lines = '';
        $this.log = $True;
        $this.SavePath = $SavePath;
    }
    Logger([string]$SavePath, [bool]$log){
        $this.Lines = '';
        $this.log = $log;
        $this.SavePath = $SavePath;
    }
    [string]getDataTime(){
        return  Get-Date -Format 'yyyy-MM-dd hh:mm:ss'
    }
    [void]writeLog($color,$logmessages)
    {
        write-host -ForegroundColor $color $logmessages
        $logmessages >> $this.SavePath
    }
    [void]Trace($s){
        $msg = $this.getDataTime() + " [TRACE] " + $s
        if ($this.log){
            $this.writeLog('DarkGreen',$msg)
        }
    }
    [void]Info($s){
        $msg = $this.getDataTime() + " [INFO] " + $s
        if ($this.log){
            $this.writeLog('Gray',$msg)
        }
    }
    [void]Debug($s){
        $msg = $this.getDataTime() + " [DEBUG] " + $s
        if ($this.log){
            $this.writeLog('DarkBlue',$msg)
        }
    }
    [void]Warn($s){
        $msg = $this.getDataTime() + " [WARN] " + $s
        if ($this.log){
            $this.writeLog('Yellow',$msg)
        }
    }
    [void]Error($s){
        $msg = $this.getDataTime() + " [ERROR] " + $s
        if ($this.log){
            $this.writeLog('Red',$msg)
        }
    }
    [void]Critical($s){
        $msg = $this.getDataTime() + " [CRITICAL] " + $s
        if ($this.log){
            $this.writeLog('Magenta',$msg)
        }
    }
}

3. 使用示例

3.1 基本使用

【例】简单测试各个日志方法的使用,代码如下:

$SavePath = 'C:\Users\Administrator\Desktop\mylog.log';
$logger = [Logger]::new($SavePath);
$logger.Trace('tracetracetrace')
$logger.Info('InfoInfoInfo')
$logger.Debug('debugdebugdebug')
$logger.Warn('warnwarnwarn')
$logger.Error('errorerrorerror')
$logger.Critical('criticalcriticalcritical')

其效果如图:

其中mylog.log是运行该ps1脚本后所生产的历史日志记录,使用 VSCode 等工具打开,可以看到高亮显示的输出日志如图所示:

注意:如果你想要像使用 bat 脚本那样运行 ps1 脚本,需要设置执行策略,你可以先使用Get-ExecutionPolicy查看你当前的执行策略:

Get-ExecutionPolicy

将执行策略设置为 Unrestricted 以直接运行ps1脚本:

Set-ExecutionPolicy Unrestricted

3.2 实例:检测网络情况,自动重启适配器并记录日志

【需求介绍】

Windows 系统上的网络适配器出现问题时,可能导致服务器与外界无法通信。有时,这种故障将会随着网络适配器的重启而解决。

手动打开 网络与贡献中心 => 高级网络配置

图:Windows Server 2016 网络适配器界面

图:Windows 11 网络适配器界面

你当然可以在这里手动点击 禁用(Disable),然后再手动点击 启用(Enable)。但是设想当一台服务器运行时,人工发现网络适配器故障需要重启比较缓慢,我们希望一旦电掉线则自动地重启某个网络适配器,以此减小由于网络适配器故障(假定每次重启后一定可以恢复)带来生产上更大的损失,这时我们可以考虑使用定时测试网络的方式。

  • 执行某次定时任务时,先尝试 Ping 某个正常情况下可以Ping 通的主机;
  • 若本次Ping测试顺利,则网络正常,无需重启网络适配器,日志记录测试成功,程序结束;
  • 若本次Ping测试失败,输出Ping失败到日志,尝试先禁用网络适配器;
  • 若网络适配器禁用成功,输出禁用成功到日志,并执行启用刚刚禁用的网络适配器;
  • 若网络适配器禁用失败,输出失败信息到日志,程序结束;
  • 若禁用成功且启用仍然成功,则重启网络适配器全过程顺利执行完成,程序结束。

【代码实现】

function Main(){
    $tracepath='C:\tmp\restart_jboss';
    $SavePath = "$tracepath\$env:COMPUTERNAME _restartNetAdapter.log";
    $logger = [Logger]::new($SavePath);
    $adapterName = 'Ethernet0 2'
    Ping www.baidu.com;
    if($?){
        $logger.Info('Pingִ Execution succeeded.')
    }
    else{
        $logger.Warn('Pingִ Execution failed, attempting to restore the network adapter.')
        $logger.Info('Disable NetAdapter...');
        Disable-NetAdapter -Name $adapterName;
        if($?){
            $logger.Info('The network adapter has been disabled');
            $logger.Info('Enable NetAdapter...');
            Enable-NetAdapter -Name $adapterName;
            if($?){
                $logger.Info('The network adapter is enabled.')
            }else{
                $logger.Critical('Failed to enable the network adapter, which requires manual processing.');
            }
        }
        else{
        }
    }
};
Main
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
24天前
|
机器学习/深度学习 运维 自然语言处理
大模型技术在运维中的知识管理革命
大模型技术在运维中的知识管理革命
173 81
|
4月前
|
运维 监控 安全
运维技术——从基础到高阶的全面解析
本文是一篇技术性文章,主要探讨了运维技术。运维不仅仅是保持系统的稳定运行,更包括优化、预防故障和应对突发事件的能力。本文将从运维的基本概念入手,逐步深入到高阶技术和策略,为读者提供一个全面的运维知识体系。希望通过这篇文章,读者能够更好地理解和应用运维技术,提升自己的运维能力。
|
3月前
|
存储 运维 监控
API明细日志及运维统计日志全面提升API可运维性
在数字化转型的大潮中,数据已成为企业最宝贵的资产之一。而数据服务API可快速为数据应用提供数据接口。面对越来越多的API以及越来越多的应用调用,如何快速查看API的服务情况、异常情况及影响范围,以及查看API的调用详情,进行API的性能优化、错误排查变得越来越重要,本文将介绍如何配置和开通API运维统计及明细日志,以及如何查看日志进行介绍。
182 0
|
4月前
|
运维 Kubernetes 监控
提升运维效率:容器化技术在现代IT基础设施中的应用
本文将探讨容器化技术如何优化企业的IT基础设施,提高部署效率和资源利用率。我们将深入分析容器技术的优势、实现步骤以及在实际运维中的应用场景。通过实例展示,帮助读者更好地理解并应用这一前沿技术,助力企业实现高效运维。
|
19天前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
139 15
|
1月前
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
74 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
|
3月前
|
边缘计算 运维 Cloud Native
云原生技术的崛起:重新定义软件开发与运维
云原生技术的崛起:重新定义软件开发与运维
|
4月前
|
存储 运维 监控
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
本文解析了Elasticsearch Serverless在智能日志分析领域的关键技术、优势及应用价值。
166 8
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
|
3月前
|
运维 监控 安全
运维自动化:提升效率与可靠性的关键技术
在信息技术飞速发展的今天,企业对IT系统的稳定性和高效性要求越来越高。运维自动化作为实现这一目标的重要手段,通过软件工具来模拟、执行和管理IT运维任务,不仅大幅提高了工作效率,还显著增强了系统的可靠性。本文将探讨运维自动化的概念、实施步骤以及面临的挑战,旨在为读者提供一份关于如何有效实施运维自动化的指南。
|
3月前
|
运维 资源调度 监控
提升运维效率的关键技术与实践
在当今快速发展的信息技术时代,运维工作面临着前所未有的挑战和机遇。本文旨在探讨如何通过采用先进的技术和实施最佳实践来提高IT运维的效率和效果。我们将深入分析自动化工具、监控策略、灾难恢复计划以及持续集成/持续部署(CI/CD)等关键领域,展示它们如何协同工作以优化运维流程。此外,文章还将提供一些实际案例研究,帮助读者更好地理解这些概念的应用。无论是对于初创公司还是大型企业,掌握这些技术都将是提升竞争力的关键。