DNN (DotNetNuke) 模块异常不记录

DNN (DotNetNuke) module exceptions not logging

我有一个客户的 DNN 站点有一个自定义模块,该模块在模块错误日志记录方面存在问题。该站点已从 6.2 升级到 7.4 版,现在升级到 9.0 版。自升级到 7.4 后,模块异常不再出现在管理/主机事件中。 DNN 7.4 as explained here 中似乎更改了模块异常日志记录。这是之前有效的代码,但现在没有任何记录;

测试对象:

public class foo
{
    public int id { get; set; }
    public string bar { get; set; }
}

测试 webapi 控制器:

[DnnAuthorize]
public class MyCustomModuleController : DnnApiController
{
    private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(MyCustomModuleController));


    [HttpGet]
    public HttpResponseMessage GetFoo(int id)
    {
        try
        {
            foo test = null;
            var bar = test.bar; //will throw null exception

            ...

        }
        catch (Exception ex)
        {
            Logger.Error(ex); //no log entries in db since ver. 7.4
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Server error");
        }
    }

是否有我应该启用的设置或是否有记录事件的新方法?

据我了解,DotNetNuke.Instrumentation.GetLogger() returns 用于执行 Log4Net 日志记录的日志记录对象存储在 /Portals/_default/Logs 中的文件附加程序日志中。您也可以从 Host > Host Settings > Logs 查看它们。

通常,您可以通过在构造函数中设置它并调用 .Error()/.ErrorFormat()、.Warn()/.WarnFormat() 等函数来添加到 class将错误或信息消息附加到日志文件。

public class MyCustomModuleController : DnnApiController
{
    private DotNetNuke.Instrumentation.ILog Logger { get; set; }

    public MyCustomModuleController()
    {
        Logger = DotNetNuke.Instrumentation.LoggerSource.Instance.GetLogger(this.GetType());
    }

    public HttpResponseMessage GetFoo(int id)
    {
        try
        {
           ...
        }
        catch (Exception ex)
        {
            Logger.Error(ex); 
        }
    }
}

另一种可用的日志记录技术是使用 DotNetNuke.Services.Exceptions 将异常记录到数据库中。这些错误被添加到 EventLog 和 Exceptions 表中。

public class MyCustomModuleController : DnnApiController
{   
    public HttpResponseMessage GetFoo(int id)
    {
        try
        {
           ...
        }
        catch (Exception ex)
        {
            DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); 
        }
    }
}

DNN 可能断开了 Log4Net 进程与 EventLog 的连接。我不记得它在版本 6 中是如何工作的。