我有一个在客户端 PC(Windows XP)上分配序列号的程序。它将日志写入服务器文件共享(Windows Server 2003),并在发生网络错误时在本地写入日志。(这意味着绝大多数行都在两个文件中。)偶尔,写入服务器日志会失败。有没有好的方法可以合并两个日志文件,恢复丢失的条目?
我不想进行完整的复制;目前有些数据只在服务器副本中,而且我还想保留多个站点的可能性。
进行交互式合并应该相当容易,但我更喜欢自动化合并,因为它基本上是在文件行上进行集合合并。
答案1
这可以在 PowerShell 中轻松完成。假设本地和网络安全良好,以下代码可以实现此目的:
$networkLog = "\\server\share\mylog.log"
$localLog = "C:\mylog.log"
# Append local log to network log
Add-Content $networkLog (Get-Content $localLog)
# Take newly appended network log, sort, filter only unique entries, save
Get-Content $networkLog | Sort-Object | Get-Unique | Out-File $networkLog
答案2
使用内置命令无法有效地完成此操作。最简单的方法是使用来自Unx工具类:
cat log1.txt log2.txt | sort | uniq > output.txt
这基本上是将两个文本文件附加在一起,对它们进行排序(我假设每行以序列号或日期开头),然后删除重复的行。
更有效的方法是编写一个小实用程序或脚本,打开两个文件,一次读取一行,然后写入输出,确保每个条目只写入一次。
答案3
如果我没记错的话,您有两个纯文本日志文件。您可以使用 Windows 复制命令合并这两个文件。
copy log1.txt+log2.txt finallog.txt
这很好,因为如果日志文件名是静态的,您可以制作一个简单的 bat 脚本来运行该命令。即使文件不是静态的,您也可以让 bat 文件提示您要合并的文件。
问题是这些文件基本上只是相互追加。在这种情况下,实际上没有办法检查日志条目日期,以便将缺失的条目插入到原始文件中。
答案4
假设日志位于典型的日志测试文件中,每个日志消息都有日期时间戳,然后尝试超快速系统日志搜索器。它可以将多个日志文件合并为一个日志文件,并按日期时间对日志消息进行排序。它不会删除重复的行。
(假设你有安装有锈迹)
cargo install super_speedy_syslog_searcher
然后
s4.exe X:\Server1\Logs\log.txt C:\Logs\logs.txt > logs-merged.txt