Я работаю над тем, чтобы приложения C #, написанные для Windows, работали в Linux с использованием Mono.Я использую Mono 5.18.0.240 из репозитория Mono в Ubuntu 18.04.1.
Насколько я понимаю, Mono включает в себя локальный файловый регистратор событий.Если для переменной среды MONO_EVENTLOG_TYPE
задать значение local
(за которым следует необязательный путь), события будут записываться в журнал на основе файлов.Однако зарегистрированные события, кажется, не сортируются в правильный исходный каталог, который создается.Это позволяет регистрировать все события в одном и том же каталоге, что затрудняет навигацию по файлам, если регистрируется много событий.
Рассмотрим эту программу на C #, которая просто регистрирует два события каждое для трех источников событий.:
using System;
using System.Diagnostics;
namespace EventLogTest
{
class Program
{
public static void Main()
{
var sources = new string[] { "source1", "source2", "source3" };
foreach(var source in sources){
if(! EventLog.SourceExists(source)) EventLog.CreateEventSource(source, "Application");
EventLog log = new EventLog();
log.Source = source;
log.WriteEntry("some event");
log.WriteEntry("another event");
}
}
}
}
Мы можем встроить программу в исполняемый файл, а затем запустить его:
$ csc events.cs
Microsoft (R) Visual C# Compiler version 2.8.2.62916 (2ad4aabc)
Copyright (C) Microsoft Corporation. All rights reserved.
$ MONO_EVENTLOG_TYPE=local:./eventlog mono ./events.exe
Полученная структура каталога журнала событий выглядит следующим образом:
$ tree ./eventlog
./eventlog
└── Application
├── 1.log
├── 2.log
├── 3.log
├── 4.log
├── 5.log
├── 6.log
├── Application
├── source1
├── source2
└── source3
5 directories, 6 files
Обратите внимание, что каталоги source1
, source2
и source3
были созданы, но шесть файлов журнала были помещены в каталог Application
верхнего уровня вместо исходных каталогов.Если мы посмотрим на поле источника каждого файла журнала, то увидим, что источник указан правильно:
$ grep -a Source ./eventlog/Application/*.log
eventlog/Application/1.log:Source: source1
eventlog/Application/2.log:Source: source1
eventlog/Application/3.log:Source: source2
eventlog/Application/4.log:Source: source2
eventlog/Application/5.log:Source: source3
eventlog/Application/6.log:Source: source3
Я ожидаю, что приведенная выше структура каталогов должна выглядеть следующим образом, учитывая, что каждый источник журнала событийбыло записано два события (и я не вижу смысла во втором каталоге приложений):
./eventlog
└── Application
├── source1
│ ├── 1.log
│ └── 2.log
├── source2
│ ├── 1.log
│ └── 2.log
└── source3
├── 1.log
└── 2.log
Теперь я знаю, что очевидным решением может быть использование решения для ведения журналов, отличного от встроенного в Mono.регистрация событий.Однако на этом этапе важно придерживаться доступных встроенных инструментов.
Существует ли способ настройки встроенной локальной регистрации событий Mono для сохранения событий в файлах журналов в соответствующем источнике?каталог, или это возможно ошибка в Mono?