ELMAH를 사용하여 다음을 수행 할 수 있습니까?
logger.Log(" something");
나는 이런 식으로하고있다 :
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
이 예외는 처리 되었기 때문에 ELMAH에 의해 자동으로 기록되지 않습니다.
ELMAH를 사용하여 다음을 수행 할 수 있습니까?
logger.Log(" something");
나는 이런 식으로하고있다 :
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
이 예외는 처리 되었기 때문에 ELMAH에 의해 자동으로 기록되지 않습니다.
답변:
ELMAH 1.0부터 작동하는 직접 로그 작성 방법 :
try
{
some code
}
catch(Exception ex)
{
Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex));
}
ELMAH 1.2는보다 유연한 API를 도입했습니다.
try
{
some code
}
catch(Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
두 솔루션 간에는 차이점이 있습니다.
Raise
메소드는 ELMAH 필터링 규칙을 예외에 적용합니다. Log
방법은하지 않습니다.Raise
구독 기반이며 여러 로거에 하나의 예외를 기록 할 수 있습니다.Elmah.ErrorLog.Log()
: 로그 호출 자체가 실패하면 전체 웹 응용 프로그램을 중단시킬 수 있습니다. Raise()
조용히 실패합니다. 예를 들어, 서버 측에 잘못된 구성 문제가있는 경우 (예 : Elmah가 디스크에 오류를 저장하도록 구성되어 있지만 logs 폴더에 대한 올바른 액세스 권한이없는 경우) .Log()
메소드가 발생합니다. (이것은 디버깅에 좋습니다. 왜 .Raise()
아무것도 기록 하지 않습니까?)
Elmah에 대한 호출을 간단한 래퍼 클래스로 래핑하는 것이 좋습니다.
using Elmah;
public static class ErrorLog
{
/// <summary>
/// Log error to Elmah
/// </summary>
public static void LogError(Exception ex, string contextualMessage=null)
{
try
{
// log error to Elmah
if (contextualMessage != null)
{
// log exception with contextual information that's visible when
// clicking on the error in the Elmah log
var annotatedException = new Exception(contextualMessage, ex);
ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current);
}
else
{
ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current);
}
// send errors to ErrorWS (my own legacy service)
// using (ErrorWSSoapClient client = new ErrorWSSoapClient())
// {
// client.LogErrors(...);
// }
}
catch (Exception)
{
// uh oh! just keep going
}
}
}
그런 다음 오류를 기록해야 할 때마다 호출하십시오.
try {
...
}
catch (Exception ex)
{
// log this and continue
ErrorLog.LogError(ex, "Error sending email for order " + orderID);
}
다음과 같은 이점이 있습니다.
참고 : 컨텍스트 정보를 위해 'contextualMessage'속성을 추가했습니다. 원하는 경우 이것을 생략 할 수 있지만 매우 유용합니다. Elmah는 예외를 자동으로 풀기 때문에 기본 예외는 여전히 로그에보고되지만이를 클릭하면 contextualMessage가 표시됩니다.
// uh oh! just keep going
. 내 오류 처리가 실패하면 알고 싶습니다. 나는 약간의 소음을 내고 싶다.
네 가능합니다. ELMAH는 처리되지 않은 예외를 차단하도록 설계되었습니다. 그러나 ErrorSignal 클래스를 통해 ELMAH에 예외 신호를 보낼 수 있습니다. 이러한 예외는 발생하지 않으며 (버블 링하지 않음) ELMAH (및 ErrorSignal 클래스의 Raise 이벤트 구독자)에게만 전송됩니다.
작은 예 :
protected void ThrowExceptionAndSignalElmah()
{
ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
}
MVC4 응용 프로그램 내에서 메일을 대기열에 넣기 시작한 스레드에서 이와 동일한 작업을 수행하려고했습니다. 예외가 발생할 때 HttpContext를 사용할 수 없었습니다. 이렇게하려면이 질문과 여기에있는 다른 대답을 기반으로 다음과 같은 결과를 얻었 습니다. elmah : HttpContext without exceptions?
구성 파일에서 응용 프로그램 이름을 지정했습니다.
<elmah>
<security allowRemoteAccess="false" />
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH" applicationName="myApplication"/>
</elmah>
그런 다음 코드에서 (위의 답변과 같지만 HttpContext가없는) HttpContext 대신 null을 전달할 수 있습니다.
ThreadPool.QueueUserWorkItem(t => {
try {
...
mySmtpClient.Send(message);
} catch (SomeException e) {
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e));
}
});
packages.config
모습은 어떻습니까? 다음과 같은 것이 보 <package id="elmah" version="1.2.2" targetFramework="net45" />
<package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" />
<package id="elmah.sqlserver" version="1.2" targetFramework="net45" />'
입니까? NuGET으로 설치 했습니까?
packages.config
때로는 CurrentHttpContext
사용하지 못할 수 있습니다.
밝히다
public class ElmahLogger : ILogger
{
public void LogError(Exception ex, string contextualMessage = null, bool withinHttpContext = true)
{
try
{
var exc = contextualMessage == null
? ex
: new ContextualElmahException(contextualMessage, ex);
if (withinHttpContext)
ErrorSignal.FromCurrentContext().Raise(exc);
else
ErrorLog.GetDefault(null).Log(new Error(exc));
}
catch { }
}
}
사용하다
public class MyClass
{
readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void MethodOne()
{
try
{
}
catch (Exception ex)
{
_logger.LogError(ex, withinHttpContext: false);
}
}
}
Signal.FromCurrentContext (). Raise (ex);를 사용하여 elmah 로그에 사용자 정의 메시지를 쓰려고했습니다. 다음과 같은 예외가 발생했음을 발견했습니다. 예 :
try
{
...
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
// this will write to the log AND throw the exception
}
또한 elmah가 다양한 수준의 로깅을 지원하는 방법을 알 수 없습니다. web.config 설정으로 자세한 로깅을 해제 할 수 있습니까?