Как добавить несколько строк EventData в EventLog в Windows? - PullRequest
5 голосов
/ 08 октября 2011

В настоящее время я могу создать журнал событий Windows, используя следующий код:

    string sSource;
    string sLog;
    string sEvent;
    sSource = "Sample App";
    sLog = "Application";
    sEvent = "Sample Event";

    if (!EventLog.SourceExists(sSource))
        EventLog.CreateEventSource(sSource,sLog);

EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 11111);

Это создает журнал в журнале приложений.Я хочу добавить более одной строки данных к событию в журнале событий, чтобы во время отладки я мог анализировать журнал непосредственно на наличие проблем.Кроме того, я просмотрел некоторые другие журналы в журналах приложений, и в них, похоже, есть поле двоичных данных.Я не смог понять, как написать такое поле, потому что приведенный выше фрагмент кода добавляет только поле EventData.

Ответы [ 5 ]

3 голосов
/ 17 июля 2015

Один лайнер должен быть таким:

EventLog.WriteEvent("Application", new EventInstance(123, 0, EventLogEntryType.Information), new object[] { "Entry1" , "Entry2" });

Здесь Application - источник события, 123 - Id события, а 0 = NONE - категория события. Возможно, вам придется сначала проверить существование источника события.

Вот как выглядит событие:

 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
  <Provider Name="Application" /> 
  <EventID Qualifiers="0">1001</EventID> 
  <Level>4</Level> 
  <Task>0</Task> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2015-07-12T21:26:07.000000000Z" /> 
  <EventRecordID>86554</EventRecordID> 
  <Channel>Application</Channel> 
  <Computer>YOUR_COMPUTER</Computer> 
  <Security /> 
  </System>
  <EventData>
     <Data>Entry1</Data> 
     <Data>Entry2</Data> 
  </EventData>
 </Event>
2 голосов
/ 13 июня 2013

Я пытался использовать \ n \ t, используя EventLog.WriteEntry (). Однако я не был успешным. Я нашел решение этой проблемы. Мы можем использовать logger.WriteEvent ()

//Object of eventinstance.

EventInstance eventInstance= new EventInstance(0, 0) {EntryType =       EventLogEntryType.Warning};
//Array of string.Event data node is generated based on the array size.

string [] eventLog = EventLogger.BuildEventLog("EventLogSamples.WriteEventSample2","test");

//Need to specify the source

EventLog log = new EventLog {Source = "source"};
log.WriteEvent(eventInstance, eventLog);

Мне удалось успешно написать несколько eventData, как показано ниже

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="test" /> 

  </System>
- <EventData>
  <Data>EventLogSamples.WriteEventSample2</Data> 
  <Data>test</Data> 
  </EventData>
  </Event>

Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы. ПК (Пратхап Кудупу)

1 голос
/ 18 октября 2016

Я немного запутался в ответе Пратхапа Кудпу, поэтому я переписал его

{
    string sSource = "Application Name";
    string sLog = "Application";

    EventInstance eventInstance = new EventInstance(0, 0, EventLogEntryType.Error);

    List<string> sEvent = new List<string>();
    sEvent.Add("Message 1");
    sEvent.Add("Message 2");
    sEvent.Add("Message 3");

    // Check if Event Source was created (Possibly throw error if you are not running with high privilege)
    if (!EventLog.SourceExists(sSource))
        EventLog.CreateEventSource(sSource, sLog);            

    EventLog.WriteEvent(sSource, eventInstance, sEvent.ToArray());
}

По сути, вы создаете список строк с нужными «строками» или данными, создаете объект EventInstance иНапишите событие вместо WriteEntry

Результат:

<EventData>
  <Data>Message 1</Data> 
  <Data>Message 2</Data> 
  <Data>Message 3</Data> 
</EventData>
1 голос
/ 13 июля 2016

Если вы хотите добавить больше строк, вы можете просто добавить 'Enviroment.NewLine'

  [Extension()]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void WriteInfo(string info)
    {
        try
        {
            MethodBase callingMethod = new StackFrame(1, true).GetMethod();
            string typeCalling = callingMethod.DeclaringType.FullName;

            string baseStr = "TYPE: {0}{3} METHOD: {1}{3} DETAIL: {2}";
            baseStr = string.Format(baseStr, new object[] {
                                                        callingMethod,
                                                        typeCalling,
                                                        info,
                                                        Environment.NewLine
    });

            EventLog.WriteEntry("entryName", baseStr, EventLogEntryType.Information);
        }
        catch
        {
            Debugger.Break();

        }
    }
0 голосов
/ 08 октября 2011

Просто вставьте символы разрыва строки в строку сообщения, чтобы записать несколько строк текста.

...