log4net에서 고유 한 식별기/안내서를 사용자 정의 속성으로 사용합니다
-
05-07-2019 - |
문제
나는 안내 인 사용자 정의 속성을 추가하려고 노력하고 있지만이 오류를줍니다.
System.InvalidCastException : 매개 변수 값을 문자열에서 Guid로 변환하지 못했습니다. ---> System.InValidCastException : 'System.String'에서 'System.Guid'로 잘못 캐스트됩니다.
나는 이것을 구성에 지정합니다.
<parameter>
<parameterName value="@id" />
<dbType value="Guid" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{id}" />
</layout>
</parameter>
내가 사용하는 실제 코드 (스 니펫)는 다음과 같습니다.
Guid guid = Guid.NewGuid();
if (defaultLogger.IsEnabledFor(level))
{
var loggingEvent = new LoggingEvent(ThisDeclaringType,
defaultLogger.Repository, defaultLogger.Name, level, message, exception);
loggingEvent.Properties["Id"] = guid;
도와주세요? :) 데이터베이스의 ID 필드는 NULL이 아닌 고유 식별자로 정의되지만 기본 주요 기부금은 없습니다.
해결책
예를 들어 다음이 작동해야합니다.
<parameter>
<parameterName value="@Oid" />
<dbType value="Guid" />
<layout type="log4net.Layout.RawPropertyLayout">
<key value="Id" />
</layout>
</parameter>
중요하지 않으면 @ID를 다른 것으로 바꾸는 것이 중요합니다. 그렇지 않으면 문자열을 삽입하려고하더라도 데이터베이스에서 NULL 값을 얻을 수 있습니다.
그런 다음 RawPropertyLayout을 사용하여 보관하십시오. CUS는 변환 할 필요가 없습니다.
다른 팁
1. log4.net의 소스 코드를 다운로드하십시오
2. 기능을 변경하십시오 FormatValue
파일 내부 log4net.Appender.AdoNetAppender.cs
이와 같이:
virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
{
// Lookup the parameter
IDbDataParameter param = (IDbDataParameter)command.Parameters[m_parameterName];
// Format the value
object formattedValue = Layout.Format(loggingEvent);
// If the value is null then convert to a DBNull
if (formattedValue == null)
{
formattedValue = DBNull.Value;
}
if (param.DbType == System.Data.DbType.Guid)
{
param.Value = new Guid(formattedValue.ToString());
}
else
{
param.Value = formattedValue;
}
}
그런 다음 작동합니다!
일반 목적 지침 속성을 얻으려면 다음을 수행 할 수 있습니다.
private void ConfigureLog4Net()
{
// adds a global custom log4net property
log4net.GlobalContext.Properties[nameof(Guid.NewGuid)] = new NewGuidWrapper();
// configures log4net by XML configurations from a .config file
log4net.Config.XmlConfigurator.Configure();
}
private class NewGuidWrapper
{
// will return new GUID every time it's called
public override string ToString() => Guid.NewGuid().ToString();
}
그런 다음 다음과 같은 방식으로 부동산을 호출 할 수 있습니다.
<layout type="log4net.Layout.PatternLayout">
<!-- if you want to format the layout as a GUID followed by a message -->
<conversionPattern value="%property{NewGuid} %m%n" />
</layout>
설명 된대로 사용자 정의 DB 매개 변수에 이러한 유형의 레이아웃을 사용할 수도 있습니다. 여기.
제휴하지 않습니다 StackOverflow