我正在编写一个程序来读取日志文件。每个条目都以时间戳记开头,除非出现错误,否则在这种情况下,我将有多行错误消息且没有时间戳记。
文件如下:
20190207 14:23:10.123 info Read input
20190207 14:23:11.001 info connecting to database
20190207 14:23:17.101 error truncating the table customer. Error code XXXX
the file was blocked.
我想将每个条目及其时间戳,事件类型和消息存储在一个表中,该表具有三列,一列用于时间戳记(datetime),另一列用于事件(info / warning /错误),以及一列文字(数据类型文字)。
我如何遍历文件并读取包括错误消息的所有条目,有时有时会出现在多行中?
答案 0 :(得分:0)
您可以做的是使用Regex
来尝试匹配日志的每一行。如果匹配,则创建条目,否则将行附加到现有条目上。我将提供代码以尝试解释方法...
//strings for simplification, in your code you should use DateTime and parse properly
public class Entry
{
public string Timestamp { get; set; }
public string Type { get; set; }
public string Description { get; set; }
}
然后,您可以定义regular expression
来捕获日志行。我使用组进行了此操作,因此更容易从中提取数据。请注意,您应该添加所有期望的类型,我只使用info|error|warning
。
//you should define all types you expect in log, I just put info and error
string LogLineRegex = @"(?<date>\d{4}\d{2}\d{2} \d{2}:\d{2}:\d{2}.\d{3}) (?<type>info|error|warning) (?<text>.*)";
然后阅读日志的每一行:
日志解析示例
Entry rollingEntry = null;
foreach (var line in log)
{
var match = Regex.Match(line, LogLineRegex);
if (match.Success)
{
if (rollingEntry != null) { entries.Add(rollingEntry); }
rollingEntry = new Entry{
Timestamp = match.Groups["date"].ToString(),
Type = match.Groups["type"].ToString(),
Description = match.Groups["text"].ToString() };
}
else
{
if (rollingEntry != null) { rollingEntry.Description += $"{Environment.NewLine}{line}"; }
}
}
答案 1 :(得分:-4)
使用ReadLine来读取每一行。 例如:
while((line = file.ReadLine()) != null)
{
// some code here
}
现在,对于每一行,您都必须找到第一个出现的空格(“”),在该索引处分割,如果它是有效日期(使用特定格式解析),则将其用作日志。 否则,请将该行保留在临时列表中,直到找到另一个日期为止