Анализировать многострочный журнал json с помощью logstash

#asp.net #json #logstash #elk

#asp.net #json #logstash #elk

Вопрос:

Мне нужно проанализировать многострочный журнал json с исключениями и трассировками стека, используя logstash. У меня есть asp.net основной журнал, созданный с помощью NLog в формате json:

 { "timestamp": "2021-01-31T17:18:30.1781670 03:00", "level": "Error", "eventid": "0", "logger": "WebScraper.WebApi.Controllers.ProductWatcherController", "callsite": "ProductWatcherController.CreateProduct", "message": "Internal server error", "exception": "System.Net.Http.HttpRequestException: The connection is not established, because the destination computer rejected the connection request.
 ---> System.Net.Sockets.SocketException (10061): The connection is not established. the destination computer rejected the connection request.
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at WebScraper.Core.Helpers.HangfireSchedulerClient.CreateOrUpdateScheduler(ProductSchedulerDto productSchedulerDto) in D:C#WebScraperWebScraper.CoreHelpersHangfireSchedulerClient.cs:line 43
   at WebScraper.Core.ProductWatcherManager.CreateProduct(String productUrl, Site siteDto, List`1 scheduler, Boolean pushToHangfire) in D:C#WebScraperWebScraper.CoreProductWatcherManager.cs:line 131
   at WebScraper.WebApi.Controllers.ProductWatcherController.CreateProduct(CreateProductDto createProductDto) in D:C#WebScraperWebScraper.WebApiControllersProductWatcherController.cs:line 202", "url": "https://localhost/api/ProductWatcher/product", "action": "CreateProduct" }
 

В настоящее время я тестирую этот logstash.conf

 input {
        file {
                codec => multiline
                {
                    pattern => '^{'
                    negate => true
                    what => previous                
                }
                start_position => "beginning"
                path => "/usr/data/json-log.txt"
                sincedb_path => "/dev/null"
        }
}

filter {
        mutate {
            gsub => [ 'message','n','']
        }
        json {
                source => "message"
        }
}

output {
        elasticsearch {
                hosts => "elasticsearch:9200"
                index => "file-json"
        }

        stdout {}
}
 

Пожалуйста, помогите сделать правильную конфигурацию.

Комментарии:

1. Какая у вас проблема с тем, что делает эта конфигурация?

2. @Badger В elastic я получаю теги multiline, _jsonparsefailure , и весь json помещается в раздел message . В этом разделе json не анализируется.

Ответ №1:

Анализатор JSON возражает против «D:C#WebScraperWebScraper.Core «, потому что C не является допустимым экранированием. В вашем журнале logstash вы должны видеть

 :exception=>#<LogStash::Json::ParserError: Unrecognized character escape 'C' (code 67)
 

Я предлагаю вам изменить сообщение, чтобы заменить обратную косую черту косой чертой. Вы могли бы сделать это с помощью

 mutate { gsub => [ 'message', '[\]', '/'] }
 

Обратите внимание, что перед цитатой не может быть обратной косой черты, поскольку она обрабатывается как escape, поэтому вам нужно использовать группу символов, содержащую обратную косую черту. Это также означает, что вы не можете легко преобразовать в \ , что было бы другим способом исправить это.