コード例 #1
0
 /// <summary>Parser standard (for all levels) prefix &lt;n&gt;. </summary>
 /// <param name="ctx">parser context.</param>
 /// <returns>True if prefix read correctly; otherwise, false.</returns>
 public static bool ReadSyslogPrefix(this ParserContext ctx)
 {
     try
     {
         ctx.Position = 0;
         ctx.ReadSymbol(SyslogChars.LT);
         var digits = ctx.ReadDigits(3);
         ctx.ReadSymbol(SyslogChars.GT);
         ctx.Prefix = ctx.Text.Substring(0, ctx.Position);
         return(true);
     }
     catch (Exception)
     {
         ctx.Position = 0;
         return(false);
     }
 }
コード例 #2
0
        public static bool TryParseTimestamp(ParserContext ctx)
        {
            // sometimes there's starting space
            if (ctx.Current == SyslogChars.Space)
            {
                ctx.SkipSpaces();
            }

            // some messages start with some numeric Id:
            // <139>36177473: Mar  4 17:21:18 UTC:
            if (char.IsDigit(ctx.Current))
            {
                // make sure it's not a year and at least 5 chars
                var fiveDigits = ctx.Text.Substring(ctx.Position, 5).All(ch => char.IsDigit(ch));
                if (fiveDigits)
                {
                    var savePos = ctx.Position;
                    var digits  = ctx.ReadDigits(20);
                    if (ctx.Match(": "))
                    {
                        // we swallowed this numeric prefix and ': ' after that, nothing to do
                    }
                    else
                    {
                        ctx.Position = savePos; // rollback, timestamp evaluation will go from string start
                    }
                }
            }
            try
            {
                // quick guess - if it contains current month name
                if (TryParseIfStartsWithYear(ctx) || TryParseTimestampWithMonthName(ctx) ||
                    TryParseIfStartsWithColonThenYear(ctx) || TryParseIfStartsWithSpace(ctx))
                {
                    return(true);
                }
            }
            catch (Exception ex)
            {
                ctx.ErrorMessages.Add(ex.ToString());
            }
            return(false);
        }
コード例 #3
0
        public static int ReadNumber(this ParserContext ctx, int maxDigits = 10)
        {
            var digits = ctx.ReadDigits(maxDigits);

            return(int.Parse(digits));
        }