ASP.Net Core 1 日志记录错误 - 找不到源应用程序中的事件 ID xxxx 的说明

ASP.Net Core 1 Logging Error - The description for Event ID xxxx from source Application cannot be found

提问人:tinonetic 提问时间:8/24/2017 最后编辑:tinonetic 更新时间:8/31/2017 访问量:3957

问:

我想从 ASP.Net Core 应用程序的 Controller 方法写入 Windows 事件日志。

我遇到的问题是,在我希望写入日志信息的地方,我不断收到错误/信息日志:

无法从源应用程序获取事件 ID xxxx 的说明 被发现。引发此事件的组件未安装 或安装已损坏。您可以 在本地计算机上安装或修复组件。

如果事件源自另一台计算机,则显示信息 必须与事件一起保存。

该活动包含以下信息:

My.Fully.Qualified.Namespace.WebApi.Controllers.MyController 错误 发生在方法“MyMethod”中

消息资源存在,但在 字符串/消息表

快速说明一下,在 .Net Core 之前,我总是通过使用 Powershell 或命令创建事件源或正确配置 Microsoft.Practices.EnterpriseLibrary.Logging 应用程序块或其他第三方库来解决类似的错误

我使用的方法是:

安装 Nuget 包后:Microsoft.Extensions.Logging.Abstractions 和 Microsoft.Extensions.Logging,我在“开始配置”代码块中指定 EventLog 提供程序

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory
            .AddDebug()
            .AddEventLog();

        //... rest of the code here
    }

对于每个 Controller,请使用 ILogger<T> 方法

public class MyController : Controller
{
    private readonly IMyRepository _myRepository;
    private readonly ILogger _logger;

    public MyController(IMyRepository myRepository,
        ILogger<MyController> logger)
    {
        _myRepository = myRepository;
        _logger = logger;
    }

    public bool MyMethod(MyRequestObject request)
    {
        try
        {
            var response = privateDoSomethingMethod(request);

            return response.Success;
        }
        catch (Exception ex)
        {
            _logger.LogError(6666,ex, "Error occured when doing stuff.");

            return false;
        }
    }

这是基于日志记录的官方文档

我读过和尝试过:

C# ASP.NET Core 事件日志

评论

0赞 Matt 8/28/2017
我正要建议您需要创建始终用于解决此问题的源代码,但看到您尝试过,我已经使用带有 dotnet core 的 Serilog 写入事件日志(尚未升级到 2.0),因此如果所有其他方法都失败了,您可以尝试一下。
0赞 Peter Ritchie 9/8/2022
EventViewer 在二进制文件中查找已编译的 Windows MESSAGETABLE 资源,以查找 id/字符串字典。您如何创建该二进制文件?
0赞 tinonetic 9/9/2022
嗨,@PeterRitchie,虽然这是一个非常古老的话题(超过 5 年),但我仍然无法理解您的问题。这是一个 ASP.Net 核心应用程序。它是编译的代码。这回答了你吗?
0赞 Jcl 1/27/2023
应用程序是否具有足够的权限来创建事件源?你试过以管理员身份运行吗?(哎哟,我看到这是一个老问题,但是,我的评论仍然来自非常古老的经验,所以它可能适用;-))

答:

0赞 Igor 8/30/2017 #1

我无法在 .Net Core 2.0 中使用 loggerFactory.AddEventLog()。由于 Microsoft.Extensions.Logger.EventLog 仅存在于 .net 4.5.1 中,尽管 Nuget 包可用于此处的 2.0.0 ,因此看起来需要将其移植到 Core。

enter image description here

但也许这对你有用。 添加 CustomEventIds

 public static class CustomEventIds
{
    public const int Debug = 100;
    public const int Information = 101;
    public const int Warning = 102;
    public const int Error = 103;
    public const int Critical = 104;
}

和:

_logger.LogInformation(CustomEventIds.Debug, "Starting to do something with input: {0}", "test");

评论

0赞 tinonetic 8/31/2017
感谢您的回答,但我已经指定了事件 ID。您可以参考代码。
1赞 Camilo Terevinto 9/4/2017
如果 OP 能够安装 NuGet 包,则该包可用。NuGet 不允许安装平台不可用的包。
0赞 Igor 9/5/2017
这里的链接说它在核心中不可用。可以考虑在运行时调用可以执行 EventLogging 的程序集,请参阅此处
0赞 snj 9/30/2022
通常,您不希望 API 创建 Windows 事件日志消息,因为调用方可能会强制创建足够的事件日志消息,从而导致 Windows 服务器计算机运行速度异常缓慢。此外,正如其他人所指出的,将 .NET Core/.net 5 库与 .net framework 4.7x/net standard 库混合使用可能会导致问题。