안녕하세요, Ninject를 종속성 주입에 사용하는 웹 API 2 응용 프로그램과 함께 NLog를 사용하려고합니다.Ninject 및 Ninject.Extensions.Logging을 사용하여 ILogger에 NLog를 바인딩하는 방법
지금까지 NLog에 NuGet 패키지를 설치 한 방법에 대한 구체적인 정보를 찾기 위해 고심했습니다. & NLog.Configuration. 지금까지 내가 읽었던 것은 논문 패키지가 단지 작동하고 나를 묶어 둘 것임을 암시합니다.
Nlog.config 파일을 설정 한 다음 Ninject.Extensions.Logging & Ninject.Extensions.NLog4 패키지를 설치했습니다.
내가
- 을 시도 내 NinjectWebCommon에서
public class ErrorCheckController : ApiController { private readonly ILogger _logger; public ErrorCheckController(ILogger logger) { _logger = logger; } public IHttpActionResult Get(string version) { try { throw new Exception("Manually thrown exception"); } catch (Exception ex) { _logger.Debug(ex); } return Ok(); } }
을 다음과 같이 NLog를 사용하려고 해요 아니 MyLogger는을이다
kernel.Bind<ILogger>().To<Logger>();
- 가
kernel.Bind<ILogger>().ToMethod(lm => LogManager.GetLogger("MyLogger"));
와 바인딩과 바인딩 - 바인딩 타겟 구성의 이름
나는 형태의 컨트롤러의 ErrorCheckController '을 만들려고 할 때 오류가 발생했습니다
오류를 얻을. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오.
제 3의 옵션은 로거를 얻을 수 있지만 NLog.config가
EDIT 파일 사용하여 구성되지 않은 여기 내 설정 파일
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false">
<targets>
<target xsi:type="Database" name="Ink3DPowderDbLogger" connectionStringName="MyDbContext">
<commandText>
INSERT INTO Log.ApiLog (
Application,
Logger,
Logged,
Level,
Environment,
Request,
Message,
BaseDir,
Message,
CallSite,
CallSiteLn,
Exception,
EventProperties,
StackTrace,
ServerName,
Port,
Url,
Https,
ServerAddress,
RemoteAddress,
) VALUES (
@Application,
@Logger,
@Logged,
@Level,
@Environment,
@Request,
@BaseDir,
@Message,
@CallSite,
@CallSiteLine,
@Exception,
@EventProperties,
@StackTrace,
@ServerName,
@Port,
@Url,
@Https,
@ServerAddress,
@RemoteAddress,
);
</commandText>
<parameter name="@application" layout="${appsetting:name=AppName:default=Unknown}" />
<parameter name="@logger" layout="${logger}" />
<parameter name="@logged" layout="${date}" />
<parameter name="@level" layout="${level}" />
<parameter name="@environment" layout="${environment}" />
<parameter name="@request" layout="${asp-request}" />
<parameter name="@basedir" layout="${basedir}" />
<parameter name="@message" layout="${message}" />
<parameter name="@callSite" layout="${callsite}" />
<parameter name="@callSiteLine" layout="${callsite-linenumber}" />
<parameter name="@exception" layout="${exception:tostring}" />
<parameter name="@eventproperties" layout="${eventproperties:tostring}" />
<parameter name="@stacktrace" layout="${stacktrace:tostring}" />
<parameter name="@serverName" layout="${aspnet-request:serverVariable=SERVER_NAME}" />
<parameter name="@port" layout="${aspnet-request:serverVariable=SERVER_PORT}" />
<parameter name="@url" layout="${aspnet-request:serverVariable=HTTP_URL}" />
<parameter name="@https" layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" />
<parameter name="@serverAddress" layout="${aspnet-request:serverVariable=LOCAL_ADDR}" />
<parameter name="@remoteAddress" layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="Ink3DPowderDbLogger" />
</rules>
</nlog>
편집 2 I입니다 Get Method를 변경했습니다.
public IHttpActionResult Get(string version)
{
IKernel kernel = new StandardKernel();
//var resolver = new NinjectDependencyResolver(kernel);
//var logger = (ILogger) resolver.GetService(typeof(ILogger));
var logger = kernel.Get<ILogger>();
try
{
throw new Exception("Manually thrown exception");
}
catch (Exception ex)
{
//_logger.Debug(ex);
logger.Debug(ex);
}
return Ok();
}
이것은 나에게
일치하는 바인딩을 사용할 수없는 오류를 제공하고, 유형 자기 바인딩하지 않습니다 (210)
.
ILogger에 아무것도 바인딩되어 있지 않은 것 같습니다.
편집 3
나는 다시 내 설정 파일을 통해 찾고 내가 자동으로 실패 할 NLog 말씀하신 것을 발견했습니다. 나는 이것을 꺼 버렸고 이제는 적절한 오류가 발생합니다. NLog.Targets에 재산 '레이아웃'을 설정할 때 오류 : 나는 오류
예외가 내
에 문제가있는 것 같습니다.DatabaseParameterInfo
내부 예외 : LayoutRenderer 찾을 수 없습니다 : 'appsetting'
나는 이것이 내가
을 appsetting에 대한 문서에 동일한 구문을 사용하고 찾을 수없는 이유도 확실하지 않다
안녕하세요, 저는 여러분을 따르고 있는지, 매개 변수가없는 생성자가 기본적으로 .Net에 만들어지지 않았는지 잘 모르겠습니까? 나는 또한 다른 프로젝트에서 Ninject를 사용 해왔고 컨트롤러를 명시 적으로 구성하지 않아도되었지만 살펴 보았습니다. 구성 파일을 원래 질문에 추가했습니다. Thanks –
@JeffFinn Bind(). AsSelf()'를 사용하여'ErrorCheckController'를 등록하십시오. 이것을 시도한 후에이 토론을 계속할 것입니다. :) –
Steven
Thanks @Steven 컨트롤러를 연결하고 이전 단계를 다시 시도했습니다. –