Разбор журнала DataStage в объект C#

Я пытаюсь найти оптимальный способ анализа следующего журнала заданий DataStage в объект С#:

Event Id: 827
Time    : Mon Nov 14 12:29:35 2022
Type    : STARTED
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0070
Invocation Id   : RANDMONINVOCATIONID
Message :
        Starting Job DS_JOB_NAME.RANDMONINVOCATIONID.
        PS_APPL_Folders = (As pre-defined)
        PS_APPL_Folders.DIR_DATA = /data     (Compiled-in default)
        PS_APPL_Folders.DIR_DATA_IN = files/inputfiles     (Compiled-in default)
        PS_APPL_Folders.DIR_ERR = files/errorfiles     (Compiled-in default)
        PS_APPL_Folders.DIR_REJ = files/rejectfiles     (Compiled-in default)
        PM_FLOW_ID = 0
        $LKP_CUSTOM_ERR_JB_NM = JP_Lookup_Custom_Error
        DSJobController = SQ_Start_Job.RANDMONINVOCATIONID
Event Id: 828
Time    : Mon Nov 14 12:29:35 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0126
Invocation Id   : RANDMONINVOCATIONID
Message :
        Environment variable settings:
        _=/usr/bin/nohup
        TDG_STR_StrMin_Length=1
        TDG_STR_StrNewLines=false
        TDG_STR_StrSpaces=false
        TDG_STR_StrSpecial=false
        TDG_STR_StrUpperCase=true
        TDG_TBL_Type=standard
        TDG_Username=fu_uq47ep
        TDG_UserPassword=********
        TDG_UserStory_No=STRY02TEST
Event Id: 829
Time    : Mon Nov 14 12:29:35 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-E-0268
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID: Set NLS locale to US-ENGLISH,US-ENGLISH,US-ENGLISH,US-ENGLISH,US-ENGLISH
Event Id: 830
Time    : Mon Nov 14 12:29:35 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (@Coordinator): Starting new run of checkpointed Sequence job
Event Id: 831
Time    : Mon Nov 14 12:29:37 2022
Type    : BATCH
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0034
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID -> _FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID): Job run requested
        Mode (row/warn limits) = 0/0
        Generating operational metadata
        Job Parameters --->
        PM_FLOW_ID=0
        PS_Database=(As pre-defined)
        PS_Folders=(As pre-defined)
        PS_Database=(As pre-defined)
        PS_CustomErrors=(As pre-defined)
        PS_APPL_Folders=(As pre-defined)
        PM_JOB_RUN_ID=123752
        PM_MASTER_SEQUENCE_NM=DS_JOB_NAME
RANDMONINVOCATIONIDDCA8689FE4A3BB45C63E4361AAD61
        $LKP_CUSTOM_ERR_JB_NM=JP_Lookup_Custom_Error
        DSJobController=DS_JOB_NAME.RANDMONINVOCATIONID
Event Id: 832
Time    : Mon Nov 14 12:29:37 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (DSRunJob): Waiting for job_FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID to start
Event Id: 833
Time    : Mon Nov 14 12:29:38 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (DSWaitForJob): Waiting for job_FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID to finish
Event Id: 834
Time    : Mon Nov 14 12:29:45 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (DSWaitForJob): Job_FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID has finished, status = 1 (Finished OK)
Event Id: 835
Time    : Mon Nov 14 12:29:45 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (@XJS_FR_JP_TEST_JOB_CC): Checkpointed run of job _FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID'
Event Id: 836
Time    : Mon Nov 14 12:29:45 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (@Coordinator): Removed checkpoint record at successful completion of sequence
Event Id: 837
Time    : Mon Nov 14 12:29:45 2022
Type    : INFO
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0019
Invocation Id   : RANDMONINVOCATIONID
Message :
        DS_JOB_NAME.RANDMONINVOCATIONID.JobControl (@Coordinator): Summary of sequence run
        12:29:35: Sequence started (checkpointing on)
        12:29:36: XJS_FR_JP_TEST_JOB_CC (JOB_FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID) started
        12:29:45: XJS_FR_JP_TEST_JOB_CC (JOB_FR_JP_TEST_JOB_CC.RANDMONINVOCATIONID) finished, status=1 [Finished OK]
        12:29:45: Sequence finished OK
Event Id: 838
Time    : Mon Nov 14 12:29:45 2022
Type    : STARTED
User    : dsusr
Message Id      : IIS-DSTAGE-RUN-I-0077
Invocation Id   : RANDMONINVOCATIONID
Message :
        Finished Job DS_JOB_NAME.RANDMONINVOCATIONID.

Я определил следующий класс:

public class JobLog
{
        public int EventId { get; set; }
        public DateTime Time { get; set; }
        public string Type { get; set; }
        public string User { get; set; }
        public string MessageId { get; set; }
        public string InvocationId { get; set; }
        public string Message { get; set; }
}

Я думал разделить журнал по \r\n и проверить, содержит ли строка слово Event Id, затем присвоить значение свойству EventId и так далее. Моя проблема связана со свойством сообщения, поскольку оно может включать несколько строк. Какая тут должна быть логика?

    private void ParseLog()
    {
            var log = GetSampleLog()
                    .Split("\r\n");

            foreach (var line in log)
            {
                    if (line.Contains("Event Id:", StringComparison.InvariantCultureIgnoreCase))
                    {
                            var logObj = new JobLog
                            {
                                    EventId = int.Parse(line.Split(":")[1])
                            };
                    }
            }
    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это мое решение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using System.Globalization;

namespace ConsoleApplication51
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            string line = "";
            StreamReader reader = new StreamReader(FILENAME);

            List<Event> events = new List<Event>();
            Event _event = null;
            string[] splitArray = null;
            Boolean getMessages = false;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("Event Id"))
                    {
                        splitArray = line.Split(new char[] { ':' });
                        _event = new Event();
                        events.Add(_event);
                        _event.eventID = splitArray[1].Trim();
                        getMessages = false;
                        continue;
                    }
                    if (line.StartsWith("Time"))
                    {
                        int startOfDate = line.IndexOf(":") + 6;
                        string date = line.Substring(startOfDate).Trim();
                        _event.date = DateTime.ParseExact(date,"MMM dd HH:mm:ss yyyy", CultureInfo.InvariantCulture);
                        continue;
                    }
                    if (line.StartsWith("Type"))
                    {
                        splitArray = line.Split(new char[] { ':' });
                        _event.type = splitArray[1].Trim();
                        continue;
                    }
                    if (line.StartsWith("User"))
                    {
                        splitArray = line.Split(new char[] { ':' });
                        _event.user = splitArray[1].Trim();
                        continue;
                    }
                    if (line.StartsWith("Message Id"))
                    {
                        splitArray = line.Split(new char[] { ':' });
                        _event.messageID = splitArray[1].Trim();
                        continue;
                    }
                    if (line.StartsWith("Invocation Id"))
                    {
                        splitArray = line.Split(new char[] { ':' });
                        _event.InvocationID = splitArray[1].Trim();
                        continue;
                    }
                    if (line.StartsWith("Message"))
                    {
                        getMessages = true;
                        continue;
                    }
                    if (getMessages)
                    {
                        if (_event.messages == null)
                           _event.messages = new List<string>();
                        _event.messages.Add(line.Trim());

                    }
                }
            }
        }
    }
    public class Event
    {
        public string eventID { get; set; }
        public DateTime date { get; set; }
        public string type { get; set; }
        public string user { get; set; }
        public string messageID { get; set; }
        public string InvocationID { get; set; }
        public List<string> messages { get; set; }
    }
 
}

Другие вопросы по теме