Рейтинг:
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
Спасибо,
Добавлен образец использования, протестирован
--СА
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
Ты имеешь в виду свою проблему? Я не знаю, что вы имеете в виду, не могли бы вы дать мне ссылку или задать вопрос?
--СА