sirius007greatstar Ответов: 3

Как создать журнал событий в папке


Привет,

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

например:
текущее местоположение моего журнала событий таково
"Журналы приложений и служб/мой журнал событий"

Я хотел, чтобы так оно и было.
"Журналы приложений и служб/папка журнала событий/мой журнал событий"

Есть ли кто-нибудь, кто может подсказать мне, как этого достичь?

Sergey Alexandrovich Kryukov

Лучший вопрос. Мой 5.
--СА

Delphiwizard

Я знаю, что это 9 лет назад, но я ищу то же самое, но в Delphi, а не в C#, я ищу аналогичное решение в коде Delphi, если кто-то достиг этого, пожалуйста, дайте мне знать.

3 Ответов

Рейтинг:
28

Abhinav S

Попробуй

EventLog.CreateEventSource("Event Log Folder", "My Event Log"); 
EventLog.WriteMessage("Event Log Folder", "My message"); 


Sergey Alexandrovich Kryukov

Очевидно, вы закончили печатать быстрее, чем я. Мой 5.
--СА

Abhinav S

Спасибо. Вы опубликовали более длинный ответ. :)

sirius007greatstar

Привет Абхинав,

Спасибо за быстрый ответ.
Я попробовал метод, который вы упомянули, однако он все равно создает журнал непосредственно в разделе "журналы приложений и служб"..

Если вы увидите в своем средстве просмотра событий папку "Microsoft" в разделе "журналы приложений и служб". Я хотел, чтобы мой журнал событий был таким же..

Спасибо..
С уважением,
Паулюс

Sergey Alexandrovich Kryukov

Попробуйте перезагрузить машину после создания журнала событий: бывают ситуации, когда система запутывается в результате выполнения отладки.

Кроме того, я точно не помню, я не уверен, что Абхинав использовал правильный параметр.
Попробуй:
Журнал событий.WriteMessage("мой журнал событий", "мое сообщение");

Sergey Alexandrovich Kryukov

Вот API, который вам нужен:

публичный статический недействительными метод writeentry(
строку источник,
строковое сообщение
)
Первый параметр-это источник событий, который является "моим журналом событий", а не "папкой журнала событий" в Примере Anhinav.

--СА

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите все перегрузки системы.Диагностика.Журнал событий.Метод writeentry.
Это статический подход. Нестатический подход заключается в создании экземпляра EventLog и постоянном назначении источника событий.
Если вы все еще не разобрались, я напишу инструкцию по использованию позже.
--СА

sirius007greatstar

Привет СА,

Спасибо за ответ.

Я не уверен, что пропустил что-то здесь, но я попробовал оба метода, и это все еще дает мне тот же результат = журнал событий, созданный непосредственно в разделе "журналы приложений и служб, без папки или чего-либо еще"

Единственная разница заключается в том, что записи, написанные с указанием другого источника в столбце "источник".

Перезагрузка моего компьютера тоже не решает эту проблему.

Спасибо..
с уважением,
Паулюс

Sergey Alexandrovich Kryukov

Смотрите мой обновленный ответ: добавлен пример использования, работает по назначению!
--СА

Member 12001038

Эй, у тебя есть решение для этого ?

Sergey Alexandrovich Kryukov

Абхинав, я думаю, что ты допустил ошибку в использовании. Смотреть выше.
Не могли бы вы проверить и исправить это?
--СА

Sergey Alexandrovich Kryukov

Абхинав, я добавил образец использования к своему ответу и проверил его; он работает.
Возможно, вы захотите проверить свои.
--СА

Abhinav S

К сожалению, я не смог протестировать этот код. Возможно, мы сделаем это позже.
Если ваш код работает, OP может использовать ваш фрагмент кода в любом случае. :)

Sergey Alexandrovich Kryukov

Конечно. Спасибо.
--СА

Nish Nishant

Проголосовало 5 человек.

Abhinav S

Спасибо, Ниш.
Это один из немногих вопросов, где я видел комментарии к ответам на 2 страницы. ;)

Member 12001038

Кто-нибудь нашел решение для этого ? Я столкнулся с той же проблемой.

Рейтинг:
2

DdenBraver

Я изо всех сил пытался заставить часть подпапки работать так же, как я хотел бы иметь такую структуру, как:

- Application and Services Logs
-- Company Name
--- Application 1
---- ApplicationLog
--- Application 2
---- SecurityLog
---- OperationalLog

Я не мог найти никакого способа сделать это непосредственно с помощью C, однако после некоторых проб и ошибок с ключами реестра и документацией, предоставленной по адресу https://docs.microsoft.com/en-us/windows/desktop/eventlog/eventlog-key наконец-то я заставил его работать.
Похоже, что вам нужно создать ключи в HKLM\Software\Microsoft\Windows\CurrentVersion\WINEVT\Channels, где имя первичного ключа реестра является ключом к структуре "папка". "-" рассматривается как более глубокая структура. Например: "название" \\журнал приложения, должен быть ключ с именем "название" -приложение журнала.

Ниже приведен пример сценария для этого с помощью PowerShell:

# Create the eventlog (in a subfolder structure)
# Params()
$PrimaryEventKey = 'Company'
$ApplicationName = 'Application'
$LogName = 'NewLog'

# Vars()
$primarylocation = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\WINEVT\Channels'
$LogName = $PrimaryEventKey + '-' + $ApplicationName + '-' + $LogName
$EventRoot = (Join-Path $primarylocation $LogName)

if (!(Test-Path $EventRoot)) {
    New-Item -Path ($secondarylocation + '\' + $Logname)
    New-ItemProperty -Path ($secondarylocation + '\' + $Logname) -Name providerGuid -PropertyType String -Value "{$($GUID)}"

    New-Item -Path $EventRoot
    New-ItemProperty -Path $EventRoot -Name Enabled -PropertyType DWord -Value 1
    New-ItemProperty -Path $EventRoot -Name Type -PropertyType DWord -Value 1
    New-ItemProperty -Path $EventRoot -Name Isolation -PropertyType DWord -Value 0
    New-ItemProperty -Path $EventRoot -Name RestrictGuestAccess -PropertyType String -Value 1
    New-ItemProperty -Path $EventRoot -Name OwningPublisher -PropertyType String -Value "{$($GUID)}"

    # See https://docs.microsoft.com/en-us/windows/desktop/eventlog/eventlog-key for documentation on the ChannelAccess or or RestrictGuestAccess (see: RestrictGuestAccess / Isolation)
}
else {
    Write-Warning 'Event Log (Key) Already exists in registry'
}

# Write into the event log (Example)
$eventType = ([System.Diagnostics.EventLogEntryType]::Information)
$evt = New-Object System.Diagnostics.EventLog($LogName)
$evt.Source = "SomeSource"
$evt.WriteEntry("random message", $eventType, 60001)


Рейтинг:
13

Sergey Alexandrovich Kryukov

Вы имеете в виду системный журнал Windows?
Да, это не так просто понять. Вам нужно установить свой собственный источник событий.

using System.Diagnostics;

internal class DefinitionSet {
    //define how much do you need:
    internal const int MaximumLogSizeKilobytes = 2048;
} //class DefinitionSet

public class EventLogInstallationHelper {

    public EventLogInstallationHelper(
        string applicationName, string eventLogName) {
            this.EventLogName = eventLogName;
            this.ApplicationName = applicationName;
    } //EventLogInstallationHelper

    public void Install() { //can throw exception!
        if ((!string.IsNullOrEmpty(ApplicationName)) &&
            (!string.IsNullOrEmpty(EventLogName)))
                  EventLog.CreateEventSource(
                      ApplicationName,
                      EventLogName);
        EventLog log = new EventLog(EventLogName);
        log.MaximumKilobytes = DefinitionSet.MaximumLogSizeKilobytes;
        log.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 0);
    } //Install

    public void Uninstall() { //can throw exception!
        if (!string.IsNullOrEmpty(EventLogName)) {
                EventLog deletingLog = new EventLog(EventLogName);
                deletingLog.Clear();
        } //if
        if (!string.IsNullOrEmpty(ApplicationName))
                EventLog.DeleteEventSource(ApplicationName);
        result |= true;
        if (!string.IsNullOrEmpty(EventLogName))
                EventLog.Delete(EventLogName);
        result |= true;
    } //Uninstall

    string ApplicationName, EventLogName;

} //class EventLogInstallationHelper


Нетривиальная часть здесь-исключение. Вы должны иметь дело со случаем, когда вы устанавливаете источник событий, если он уже сделан, и удаляете, когда он не установлен.

Теперь это пример использования:

string Application = "Event Log Test";
string EventLogName = "CodeProject";
EventLogInstallationHelper helper =
    new EventLogInstallationHelper(
        Application,
        EventLogName);

try {
    helper.Install();
} catch {
    System.Console.WriteLine("Event Log already installed");
} //exception

EventLog.WriteEntry(Application, "some log");
EventLog.WriteEntry(Application, "some warning", EventLogEntryType.Warning);
EventLog eventLog = new EventLog();
eventLog.Source = Application;
eventLog.WriteEntry("another log");
eventLog.WriteEntry("some error", EventLogEntryType.Error);

System.Console.WriteLine("See event log now, then press any key");
System.Console.ReadKey(true);

try {
    helper.Uninstall();
} catch {
    System.Console.WriteLine("Event log already uninstalled");
} //exception


Идея здесь заключается в том, что вы можете иметь EventLogName имя, оно представляет все ваши приложения для ведения журнала в одной отдельной папке. Другое имя, Application, будет представлять имя одного из ваших приложений в качестве источника в свойствах каждого журнала.

Этот код хорошо протестирован.

—СА


Nuri Ismail

Отличный помощник. 5+

Sergey Alexandrovich Kryukov

Спасибо,
Добавлен образец использования, протестирован
--СА

Abhinav S

Мой 5. :)

Espen Harlinn

Хорошее усилие, мой 5-й

Sergey Alexandrovich Kryukov

Спасибо.
--СА

Sergey Alexandrovich Kryukov

Добавлено исправлено в коде помощника, отсутствуют объявления для компиляции кода, добавлен пример использования, образец тестируется: показ журналов в отдельной папке по мере необходимости.
--СА

Nish Nishant

Проголосовали 5. Хороший подробный ответ.

Sergey Alexandrovich Kryukov

Спасибо, Нишант,
--СА

Sergey Alexandrovich Kryukov

Паулюс,

Эта штука становится довольно популярной :-)
Спасибо, что приняли мой ответ.

Удачи, звоните еще раз,
--СА

Manfred Rudolf Bihy

Очень хорошо! 5+
Вы снова подняли планку. Продолжай в том же духе, парень!

Sergey Alexandrovich Kryukov

О, большое спасибо.
(ОП все еще сомневается, что это работает.)
--СА

sirius007greatstar

Привет СА,
Я очень ценю вашу помощь.
Однако это все еще не дает мне ожидаемого результата.

Решение, которое вы мне даете, предоставляет "EventLogName" в качестве одного файла журнала, а "Application" - в качестве источника каждой записи журнала.

Используя ваше решение, это структура, которую я могу видеть из средства просмотра событий:
> Просмотр событий(локальный)
> журналы приложений и служб
CodeProject
аппаратные события
> Microsoft
> Windows
оболочка Windows PowerShell
(Нажав на кнопку "CodeProject", вы увидите все записи с "приложением" в качестве источника)

На самом деле я хотел, чтобы "приложение" появилось как файл журнала, а не как источник. Я должна выглядеть вот так:
> Просмотр событий(локальный)
> журналы приложений и служб
> CodeProject
Приложение1
Приложение2
аппаратные события
> Microsoft
> Windows
оболочка Windows PowerShell
(Нажатие на кнопку "CodeProject" развернет дерево и покажет вам файл журнала событий под ним)

Если у вас есть какой-либо другой метод для достижения этой цели, пожалуйста, поделитесь со мной. Я отчаянно пытаюсь достичь этого, но безуспешно до сих пор.

Еще раз, я очень ценю вашу помощь. Спасибо..
с уважением,
Паулюс

Sergey Alexandrovich Kryukov

Паулюс,

Спасибо, что приняли мой ответ.
Я не понимаю, что случилось? Я проверил решение.
Может быть, проблема в том, чтобы назвать вещь. Я создал код, который генерирует двухуровневую структуру:
1) папка, которую я называю "имя журнала";
2) значение для столбца в журнале я назвал "приложение".
А теперь будь логичен и следуй за мной. В этой технике есть только 2-уровневая структура, не более.
Моя идея состояла в следующем: 1) используйте "имя журнала", скажем, для вашей компании или крупного продукта, оно сформирует папку. 2) Используйте "приложение" для конкретного приложения внутри продукта, оно перейдет в колонку Source.
Теперь вы говорите: "Я хочу...". во-первых, оставайтесь в рамках двухуровневой структуры. Во-вторых: осознайте, что я оперирую только именем. Именование не меняет функциональности. Вы хотите меньший масштаб, более мелкозернистый? Папка-это ваше приложение? Хорошо, дайте "имя журнала" имя вашего приложения. В приложении создайте один или несколько источников. Дайте им какие-то смысловые названия, они пойдут к истокам; неважно, что я называю это "приложением". В конце концов, переименуйте мой член приложения во что-то другое, а член LogName-в "приложение". У вас все еще есть 2-уровневая классификация, ни больше, ни меньше. Вы показываете три уровня в своем запросе-объедините два из них в один.
Если вам это не нравится-вините Microsoft и создайте свою альтернативу их системному журналу (вполне возможно, кстати).
Я уже перевел документацию Microsoft в код для вас, вы могли бы сделать это сами, но не набрались достаточного терпения (потому что вы знаете достаточно, я думаю). Это все, что можно сделать в принципе с помощью этого объекта с точки зрения структуры папок/членов. И я думаю, что этого достаточно для всех практических целей. Вы должны знать, как не злоупотреблять возможностями.

Спасибо за понимание,
--СА

sirius007greatstar

Мои знания недостаточно хороши, чтобы создать свою собственную альтернативу, поэтому я просто подожду, пока Microsoft не предоставит возможность создать более чем 2-уровневую структуру в своем системном журнале. Что касается сейчас, я думаю, что нет другого пути, кроме как остаться с 2-уровневой структурой.

В любом случае, я очень благодарен вам за вашу помощь. Отмеченные вами в качестве ответа :)

с уважением,
Паулюс

Sergey Alexandrovich Kryukov

Возможно, вам придется ждать слишком долго... Я бы использовал то, что доступно. Поверьте мне, это достаточно хорошо, и гораздо лучше, чем большинство домашних способов лесозаготовок.
Лучший,
--СА

munazza.farooq

Сэр если у вас есть какое либо решение этой проблемы пожалуйста поделитесь им я сталкиваюсь с такой же проблемой

Sergey Alexandrovich Kryukov

Ты имеешь в виду свою проблему? Я не знаю, что вы имеете в виду, не могли бы вы дать мне ссылку или задать вопрос?
--СА