我正在尝试寻找一种解决方案来帮助我监控产品的机器以及每台机器上的日志文件。以下是有关我的工作环境的一些事实:
我有一个产品安装在由多台机器(其中一些是 3 台虚拟机,一些是 8 台虚拟机)组成的实验室中,这些机器运行的是 Windows Server 2016 及更高版本和 Windows 10。
我的笔记本电脑在一个局域网中,实验室在另一个局域网中
该产品在每台机器上创建具有不同名称和用途的多个日志文件 (*.log)。
我认为这些日志文件是由 log4net 功能创建的......
需要跟进的服务有 5 个:IIS、SQL、RabbitMQ、产品的服务
我无法从我的笔记本电脑将 UNC(如:\server-name\logs\product.log)传输到这些机器,反之亦然。
机器无法访问互联网
目前,如果我想监视日志文件,我需要通过 RDP 连接到每台机器并运行以下 PowerShell 脚本行:
Get-Content C:\Product\Logs\Product.log -wait -tail 1000
或者
使用 SSL 连接从“外部”(从我的笔记本电脑)运行此脚本,并使用
Invoke-Command
命令包装脚本行:
...
#region SSL connecting to server
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem
)
{
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
#endregion
Enter-PSSession -ComputerName $hqappIP -Credential $cred
Invoke-Command -ComputerName $hqappIP -Credential $cred -ScriptBlock {
Get-Content C:\Product\Logs\Product.log -wait -tail 1000
}
...
- 有人建议我在笔记本电脑中安装一个可以运行 ELK\logstash + Kibana 的 Docker 引擎,并在实验室的机器上安装 filebeat,以便与 Docker 中的服务器通信,但我发现实验室的机器在一个 LAN 中,无法 ping 通位于另一个 LAN 中的笔记本电脑(这让我很困惑,因为我可以从我的笔记本电脑 ping 通那些机器,并按照我在上一节中向您提供的方式运行脚本)
- 我不会在实验室的局域网中购买额外的机器,所以这不是一个选择
- 我的笔记本电脑装有 Windows 10 操作系统
因此,我一手拿着安全的实验室,另一手拿着组织的笔记本电脑——在这样的环境中,我如何在我的笔记本电脑中构建一个监控服务器,尤其是使用免费工具(正如我在背景中提到的那样)?
答案1
安装并使用集中式日志记录服务。此领域的免费软件示例包括 Graylog 或 ELK(Elasticsearch、Logstash 和 Kibana)。它们均可用于在主机上运行代理,并将日志文件内容或 Windows 事件日志转发到数据库。
确实,部署和配置工作量相当大,但比查看多个主机上的单个日志文件要强大得多。例如,查询所有 Web 服务器上的 http 500 错误。
我无法将 UNC(例如:\server-name\logs\product.log)发布到这些机器。
在文件共享上跟踪日志可能在小规模上有效。要么将所有文件放在一个中央共享上,要么应用程序服务器导出共享。但是,某些应用程序无法或不会记录到与此兼容的路径。跟踪工作站上的少量文件只是用“大量 BareTail 标签”取代了“终端丛林”。