提取日志文件值

时间:2017-12-12 15:49:10

标签: c# regex

如何设置Regex以提取从ERROR开始并以INFO或DEBUG或WARN忽略换行符结束的字符串。 日志样本:

  

错误2017/12/12 00:11:34.352错误:{0} System.Reflection.TargetInvocationException:调用目标引发了异常。 ---> OutboundServiceSoftFailureException:对聚合服务执行请求失败:未将对象引用设置为对象的实例。      在ProxyAggregationService.Execute [T](ILog日志,请求请求)      at ResetChangeRequestForMAF(String mafGuid,String senderCode)      at HandleImpl(CleanupWorkbookRequest request)      在UnitRequestHandler`1.Handle(TRequest请求)      在ExecuteInternal [TRequest,TResponse](TRequest请求)      ---内部异常堆栈跟踪结束---      at System.RuntimeMethodHandle.InvokeMethod(Object target,Object [] arguments,Signature sig,Boolean constructor)      at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments)      在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)      在ExecuteUnknown(对象请求)      在InvokeMethodOnTarget()      在CProceed()      在拦截(IInvocation调用)      在AbstractInvocation.Proceed()      在拦截(IInvocation调用)      在AbstractInvocation.Proceed()      在拦截(IInvocation invocation)

     

DEBUG 2017/12/12 00:11:35.300进程进入等等等等。

     

WARN 2017/12/12 00:11:37.300某些流程可能出现问题

试过这个 - 没有成功

Regex r = new Regex(@"(ERROR.*?((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9])))(.*)");

1 个答案:

答案 0 :(得分:0)

我认为你可以使用positive lookahead直到你遇到INFO或DEBUG或WARN。

ERROR[\S\s]*?(?=\s+INFO|DEBUG|WARN)

  • 匹配ERROR
  • 将任何空白字符或任何非空格字符匹配为非贪婪[\S\s]*
  • 零次或多次
  • 积极向前看(?=
  • 断言接下来是一个或多个空格\s+
  • 后面是INFO或DEBUG或WARN INFO|DEBUG|WARN
  • 关闭正向前瞻)

Demo

Regex r = new Regex(@"ERROR[\S\s]*?(?=\s+INFO|DEBUG|WARN)");