我正致力于让为Windows编写的C#应用程序使用Mono在Linux上运行。我正在使用Mono5.18.0.240,它来自MonoRepository,在Ubuntu18.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中的一个bug?