Skip to content

LogAddressPacket does not support milliseconds in Timestamp #46

@Cryptoc1

Description

@Cryptoc1

Context:
I'm building a custom log ingestion server (for use with logaddress_add_http in CS2), and am using the parsers in this library to handle certain logs being ingested.

Problem:
The format of the log "packet" slightly differs when using HTTP:

  • the log text does not start with L
  • the log's timestamp includes milliseconds

As a result, I was unable to use the LogAddressPacket type for parsing log content.

Workaround:

I created the following LogPacket type in my project to handle these differences (note that I'm on net8.0):

public sealed partial record LogPacket( string Body, DateTime Timestamp )
{
    [GeneratedRegex( @"^(\d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}\.\d{3}) - " )]
    private static partial Regex Parser( );

    public static bool TryParse( string? value, [NotNullWhen( true )] out LogPacket? packet )
    {
        if( !string.IsNullOrWhiteSpace( value ) )
        {
            var match = Parser().Match( value );
            if( match.Success && DateTime.TryParseExact( match.Groups[ 1 ].Value, "MM/dd/yyyy - HH:mm:ss.fff", CultureInfo.InvariantCulture, default, out var timestamp ) )
            {
                var body = value[ match.Groups[ 0 ].Length.. ].Trim();
                if( body.Length is not 0 )
                {
                    packet = new( body, timestamp );
                    return true;
                }
            }
        }

        packet = default;
        return false;
    }
}

The LogPacket.Body can then be used with DefaultParser<> implementations as expected.

I considered opening a PR, but wasn't sure if this use case fit the "scope" of this project.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions