2010-08-10 2 views
0

log4Net 및 AdoNetAppender를 사용하는 asp.net 3.5 앱이 있습니다. 현재 응용 프로그램은 log4net 설명서 http://logging.apache.org/log4net/release/config-examples.html처럼 메시지 필드를 사용합니다. 필드를 varchar2에서 Clob로 변환하고 싶습니다. 이 작업을 수행하는 방법에 대한 몇 가지 문서를 찾으려고했습니다. 내가 찾을 수있는 모든은 다음과 같습니다AdoNetAppender 및 Clob 필드

http://old.nabble.com/DbType-for-CLOB-column-using-AdoNetAppender-td1214036.html#a1214036

하는 것은 너무 유용하지이었다. 누구나 AdoNetAppender와 함께 Clob 파일을 사용하는 방법에 대한 링크 나 샘플을 알고 있습니까?

덕분에, 빌 N

답변

0

당신이 시도해 봤어 :

http://marc.info/?l=log4net-user&m=110874200319166

은 기본적으로 당신이 DbTypestring에 설정하고 Size 매개 변수를 제거해야합니다. 분명히 이것은 nvarchar (max) (here 참조)에 대해 올바르게 작동하지 않지만 그것이 Clob에서 작동하지 않는다는 것을 의미하지는 않습니다.

0

이 질문은 오래된 것이지만 최근에는 log4net을 사용하여 CLOB 매개 변수를 패키지 프로 시저에 전달해야했습니다. DbType을 String으로 설정하고 Size를 삭제하는 방법을 포함하여 온라인에서 찾은 제안을 사용하여이를 수행 할 수 없었습니다.

CLOB 유형의 매개 변수를 사용하는 Oracle 패키지 프로 시저를 사용하고 있습니다. 커스텀 AdoNetAppenderParameter를 사용하면 프로 시저에 긴 문자열 (270k + 문자)을 전달하고이를 DB (Oracle 9i)에 저장할 수 있습니다.

우선 Oracle의 데이터 액세스 공급자 (Microsoft의 System.Data.OracleClient는 deprecated)를 사용해야했습니다. 프로젝트에서 Oracle.DataAccess.dll을 참조해야합니다. NuGet 패키지 관리자에서 "oracle.dataaccess"를 검색하여 NuGet 패키지를 얻었습니다.

라이브러리에는 OracleDbType 특성이있는 DbParameter, OracleParameter의 구현이 있습니다. 속성 유형은 OracleDbType이며 Clob 값을 갖는 열거 형입니다.

public class OracleAdoNetAppenderParameter : AdoNetAppenderParameter 
{ 
    public OracleDbType OracleDbType { get; set; } 

    public override void Prepare(System.Data.IDbCommand command) 
    { 
     if (!(command is OracleCommand)) 
     { 
      string message = string.Format("The log4net parameter of type {0} can only be used with an appender connection of type {1}. The expected command type, {2}, cannot be supplied. Please check the parent appender's connectionType property.", 
              this.GetType(), typeof(OracleConnection), typeof(OracleCommand)); 

      throw new System.ArgumentException(message, "command"); 
     } 

     var parameter = command.CreateParameter() as OracleParameter; 

     parameter.ParameterName = base.ParameterName; 
     parameter.OracleDbType = this.OracleDbType; 

     command.Parameters.Add(parameter); 
    } 
} 

I : 다음 새로운 OracleParameter를 만들고 대 CLOB 유형을 설정 맞춤 AdoNetAppenderParameter 생성

<connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 

:

이 기준을 추가하면, I는 상기 펜더의 연결 유형을 변경 OracleDbType 속성을 노출 했으므로 구성을 통해 지정할 수 있습니다.

처음에는 OracleClobAdoNetAppenderParameter 클래스라는 이름의 특성을 노출시키지 않았고 Prepare 메소드 내에서 OracleDbType 특성을 Clob로 설정했습니다. 내가 클래스를 만든 후

는,이처럼 펜더의 구성 매개 변수를 추가 :

<parameter type="YourNamespace.OracleAdoNetAppenderParameter, YourAssembly"> 
    <OracleDbType value="Clob" /> 
    <parameterName value=":yourProcedureClobParam"/> 
    <layout type="..."></layout> 
</parameter> 

당신은 당신의 자신의 레이아웃을 사용할 수 있습니다. 큰 문자열을 log4net의 컨텍스트를 통해 사용자 지정 매개 변수로 전달하고 있습니다.

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
     <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
     <connectionString value="data source=xxx;User ID=xxx;Password=xxx"/> 
     <commandText value="MY_PKG.LogMessage"/> 
     <commandType value="StoredProcedure" /> 
     <!-- SERVICE_MESSAGE --> 
     <parameter type="MyNamespace.OracleAdoNetAppenderParameter, MyAssembly"> 
     <OracleDbType value="Clob" /> 
     <parameterName value=":service_message"/> 
     <layout type="log4net.Layout.RawPropertyLayout"> 
      <key value="service_message"/> 
     </layout> 
     </parameter> 
     <!-- LOG_LEVEL --> 
     <parameter> 
     <parameterName value=":type"/> 
     <dbType value="String"/> 
     <size value="20"/> 
     <layout type="log4net.Layout.PatternLayout" value="%level"/> 
     </parameter> 
     <!-- LOG_DATE --> 
     <parameter> 
     <parameterName value=":timestamp"/> 
     <dbType value="DateTime"/> 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
     </parameter> 
     <!-- MESSAGE --> 
     <parameter> 
     <parameterName value=":message"/> 
     <dbType value="String"/> 
     <size value="1000"/> 
     <layout type="log4net.Layout.PatternLayout" value="%message"/> 
     </parameter> 
     <!-- EXCEPTION --> 
     <parameter> 
     <parameterName value=":error"/> 
     <dbType value="String"/> 
     <size value="4000"/> 
     <layout type="log4net.Layout.ExceptionLayout"/> 
     </parameter> 
...... 
</appender> 

는 희망이 도움이 :

는 여기에 내가 사용하고 최종 구성입니다.