logging - 使用 Elmah 记录客户端错误

标签 logging client-side elmah

我正在使用 ELMAH记录我的 .net 错误。它运行良好,但我想扩展错误日志记录以包含客户端错误,即任意 JavaScript 错误。我可以使用 window.onerror 事件捕获错误,然后调用 .net 处理程序 (.ashx) 在 elmah 中记录错误,但这只是我解决问题的小技巧。有没有更好的方法将客户端错误记录到 elmah?

最佳答案

这是一个更完整的解决方案(我想我是从 ELMAH 网站上抓取的……记不清了)

ErrorLogging.js:

    window.onerror = function (msg, url, line) {
        logError(msg, arguments.callee.trace());
    }
    function logError(ex, stack) {
        if (ex == null) return;
        if (logErrorUrl == null) {
            alert('logErrorUrl must be defined.');
            return;
        }

        var url = ex.fileName != null ? ex.fileName : document.location;
        if (stack == null && ex.stack != null) stack = ex.stack;

        // format output
        var out = ex.message != null ? ex.name + ": " + ex.message : ex;
        out += ": at document path '" + url + "'.";
        if (stack != null) out += "\n  at " + stack.join("\n  at ");

        // send error message
        jQuery.ajax({
            type: 'POST',
            url: logErrorUrl,
            data: { message: out }
        });
    }

    Function.prototype.trace = function()
    {
        var trace = [];
        var current = this;
        while(current)
        {
            trace.push(current.signature());
            current = current.caller;
        }
        return trace;
    }

    Function.prototype.signature = function()
    {
        var signature = {
            name: this.getName(),
            params: [],
            toString: function()
            {
                var params = this.params.length > 0 ?
                    "'" + this.params.join("', '") + "'" : "";
                return this.name + "(" + params + ")"
            }
        };
        if (this.arguments)
        {
            for(var x=0; x<this.arguments.length; x++)
                signature.params.push(this.arguments[x]);
        }
        return signature;
    }

    Function.prototype.getName = function()
    {
        if (this.name)
            return this.name;
        var definition = this.toString().split("\n")[0];
        var exp = /^function ([^\s(]+).+/;
        if (exp.test(definition))
            return definition.split("\n")[0].replace(exp, "$1") || "anonymous";
        return "anonymous";
    }

布局/母版页:
<script src="@Url.Content( "~/Scripts/ErrorLogging.js" )" type="text/javascript"></script>

<script type="text/javascript">
    //This needs to be here to be on everypage
    var logErrorUrl = '@Url.Action( "LogJavaScriptError", "Home" )';
</script>

HomeController.cs:
    [HttpPost]
    public void LogJavaScriptError( string message ) {
        ErrorSignal.FromCurrentContext().Raise( new JavaScriptErrorException( message ) );
    }

JavaScriptErrorException.cs:
[Serializable]
public class JavaScriptErrorException: Exception{
    public JavaScriptErrorException( string message ) : base ( message ){}
}

关于logging - 使用 Elmah 记录客户端错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2764525/

相关文章:

javascript - 是否可以仅使用客户端创建txt文件? ...但是到特定文件夹

javascript - 客户端和服务器端编程有什么区别?

jquery - 使用 jQuery 库 DataTables 时,是否可以对 Ajax 源进行延迟分页?

smtp - Elmah 在开发服务器上发送错误邮件,但不在生产服务器上发送

c# - 使用 Gmail 进行 ElMAH 错误记录?

Elmah 日志条目不包括服务器变量

logging - 通过 RSS 订阅 log4j 日志?

windows - 如何在 Windows 上刷新 console.log 输出

c# - 如何将自定义列添加到我的 Serilog MS SQL Server 接收器?

logging - Doxygen:如何将日志输出写入文件?