log4net에서 고유 한 식별기/안내서를 사용자 정의 속성으로 사용합니다

StackOverflow https://stackoverflow.com/questions/424018

  •  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 매개 변수에 이러한 유형의 레이아웃을 사용할 수도 있습니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top