gpt4 book ai didi

powershell - 在日志文件中的连续行中搜索多个字符串

转载 作者:行者123 更新时间:2023-12-04 07:38:07 24 4
gpt4 key购买 nike

我有一个日志文件 输入日志 其中记录了不同用户的登录失败和成功尝试,并实时更新。我只对一个用户的登录尝试失败感兴趣,即 大师 .每当用户尝试登录失败时 大师 , 以下 3 个固定文本字符串将始终出现在 3 个连续行中,如下面的示例 所示输入日志 文件:

Authenticating the user "master" with the password
Failed to logon to the system due to something unexpected
SSCMPE-00102: Failed to authenticate user. Invalid credentials. Enter valid credentials
输入日志 登录尝试失败的文件示例大师 :
[2021-05-14T04:18:41.378-06:00] [FoundationServices0] [NOTIFICATION] [01216] [oracle.bi.bifndnepm.bpmui.logon.CSSAuthenticate] [tid: 30] [userId: <anonymous>] [ecid: 00j8DrPuyNGB1FwDwFj8CW0001hC0004FL,0:1] [APP: WORKSPACE#11.1.2.0] [SRC_CLASS: com.hyperion.bpm.logon.CSSAuthenticate] [SRC_METHOD: authenticateUser:473] Authenticating the user "master" with the password "*********".
[2021-05-14T04:18:41.573-06:00] [FoundationServices0] [ERROR] [02601] [oracle.bi.bifndnepm.bpmui.logon.LogonServlet] [tid: 30] [userId: <anonymous>] [ecid: 00j8DrPuyNGB1FwDwFj8CW0001hC0004FL,0:1] [APP: WORKSPACE#11.1.2.0] [SRC_CLASS: com.hyperion.bpm.logon.LogonServlet] [SRC_METHOD: writeLogonCssException:206] Failed to logon to the system due to something unexpected.[[
SSCMPE-00102: Failed to authenticate user. Invalid credentials. Enter valid credentials.
at com.hyperion.css.store.identity.IdentityStoreImpl.authenticate(IdentityStoreImpl.java:1845)
at com.hyperion.css.spi.impl.nvdb.NativeProvider.authenticate(NativeProvider.java:74)
at com.hyperion.css.facade.impl.CSSAbstractAuthenticator.authenticateUser(CSSAbstractAuthenticator.java:645)
at com.hyperion.css.facade.impl.CSSAPIAuthenticationImpl.authenticate(CSSAPIAuthenticationImpl.java:69)
我想创建一个监控脚本,以便一旦这 3 个文本字符串出现在 3 个连续的行中,我就会收到有关用户 登录尝试失败的电子邮件警报。大师 .
我将安排脚本在 Windows 任务调度程序中运行。我想让脚本连续运行以实时检测失败的登录尝试。所以它应该只读取 中新写的条目。输入日志 上次运行脚本的文件。
到目前为止,我有以下代码,在 失败.log , 给了我在三行中连续出现的三个字符串以上的所有行(我真正想要的),但还有许多其他不需要的行在不同的行中分别匹配三个字符串(我不想要)。
$File = "C:\data\Input.log"

$EmailParam=@{
To='usergroup@domain.com'
From='user@domain.com'
SmtpServer='smtp.serveraddress.com'
Subject='Failed Login Attempt by the user Master'
Body='Alert! Failed Login Attempt found for the user Master'
Attachment='failed.log'
}

$String='Authenticating the user "master" with the password','Failed to logon to the system due to something unexpected','SSCMPE-00102: Failed to authenticate user. Invalid credentials. Enter valid credentials'

Get-Content $File | Select-string -Pattern $String | Set-Content failed.log | ForEach {
Send-MailMessage @EmailParam
}
如果您能指导我修复它,将不胜感激。谢谢!

最佳答案

  • 使用 Get-Content -Wait切换到无限期地等待新行添加到日志文件中。
  • 通过 ForEach-Object 维护状态您可以使用的电话-match , regular-expression matching operator检查线条。
  • $matchingLineCount = 0
    $matchingLines = @()

    Get-Content -Wait $File | ForEach-Object {
    if ($matchingLineCount -eq 2) { # 3rd line -> send email.
    $matchingLines += $_
    $matchingLines | Set-Content failed.log
    Send-MailMessage @EmailParam
    }
    elseif ($matchingLineCount -eq 0 -and $_ -match 'Authenticating the user "master"') {
    $matchingLines += $_
    ++$matchingLineCount
    return
    } elseif ($matchingLineCount -eq 1 -and $_ -match 'Failed to logon to the system due to something unexpected') {
    $matchingLines += $_
    ++$matchingLineCount
    return
    }
    $matchingLineCount = 0; $matchingLines = @()
    }
    笔记:
  • 鉴于只需要收集 3 行,我定义了 $matchingLines作为常规数组( @() )并使用 +=为了简洁和方便,将行“附加”到它。
  • 但是,通常这种迭代构建集合的方法效率低下,因为每个 +=导致在幕后创建一个新数组 - 这是必要的,因为数组相对于它们的元素数量是不可变的 - 参见 this answer想要查询更多的信息。
  • GitHub issue #5643讨论从不可扩展的 PowerShell 的默认集合数据结构切换 arrays到可扩展的集合类型。

  • 关于powershell - 在日志文件中的连续行中搜索多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67641372/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com