2013-05-06 3 views
0

기본 매개 변수 인 날짜, 스레드, 수준 등을 정의하는 사용자 지정 ADONetAppender를 사용하고 있지만 사용자 지정 매개 변수 appender도 사용합니다. 그것은 내 승리 7 developmet 컴퓨터에서 SQL Server 2008 R2를 실행, 잘 작동하고 비트 열에 묶여 있고 (null이 아닌) 필요한 특수 매개 변수가 추가됩니다 것 같습니다.사용자 지정 log4net ADONET appender가 일부 컴퓨터에서 작동하지 않습니다.

Windows Server 2003 컴퓨터에서 서비스를 실행할 때 (SQL Server 2005를 실행하고 다른 컴퓨터를 2008 R2로 시도한 경우) log4net이 로그를 DB에 추가하지 못하지만 다른 추가 기능이 작동합니다. Log4net에는 내부 디버깅 기능이 있지만 서비스를 실행 중이므로 콘솔에 액세스 할 수 없습니다. 다른 버전의 Windows와의 호환성 문제 또는 다른 제안 된 디버깅 동작이 있습니까?

추가 매개 변수를 제거하면 로그가 DB에 기록됩니다.

<log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
     <param name="File" value="C:\Logs\Log.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <param name="ImmediateFlush" value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="Header" value="[Header]&#xD;&#xA;" /> 
     <param name="Footer" value="[Footer]&#xD;&#xA;" /> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" /> 
     </layout> 
    </appender> 
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> 
     <bufferSize value="1"/> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
     <connectionString value="Data Source=localhost\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True"/> 
     <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[IsCritical]) VALUES&#xD;&#xA;  (@log_date, @thread, @log_level, @logger, @message, 

@exception, @is_critical)" 
                     /> 
     <parameter> 
     <parameterName value="@log_date"/> 
     <dbType value="DateTime"/> 
     <layout type="log4net.Layout.RawUtcTimeStampLayout"/> 
     </parameter> 
     <parameter> 
     <parameterName value="@thread"/> 
     <dbType value="String"/> 
     <size value="32"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%t"/> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@log_level"/> 
     <dbType value="String"/> 
     <size value="512"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%p"/> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@logger"/> 
     <dbType value="String"/> 
     <size value="512"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%c"/> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@message"/> 
     <dbType value="String"/> 
     <size value="4000"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%m"/> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@exception"/> 
     <dbType value="String"/> 
     <size value="2000"/> 
     <layout type="log4net.Layout.ExceptionLayout"/> 
     </parameter> 
     <parameter type="MyApp.Logging.IsCriticalAdoNetParameter"> 
     <parameterName value="@is_critical"/> 
     <dbType value="Boolean"/> 
     <size value="10"/> 
     <layout type="log4net.Layout.PatternLayout" value=""/> 
     </parameter> 
    </appender> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="LogFileAppender" /> 
     <appender-ref ref="ADONetAppender"/> 
    </root> 
    </log4net> 

사용자 정의 매개 변수 :

public class IsCriticalAdoNetParameter : AdoNetAppenderParameter 
    { 
     public override void FormatValue(IDbCommand command, LoggingEvent loggingEvent) 
     { 
      // Lookup the parameter 
      IDbDataParameter param = (IDbDataParameter)command.Parameters[ParameterName]; 

      // extension method, returns bool. 
      param.Value = loggingEvent.IsCritical(); 
     } 
    } 

업데이트, 같은 로깅 섹션이 작은 콘솔 응용 프로그램으로 디버깅을했다. 열 이름에 불고있는 것 같습니다. 그것은 기둥이 존재하지 않는다는 것을 암시하는 것처럼 보이지만 그렇게합니다. 부울을 실제 SQL 데이터 형식으로 변환하는 것이 문제가되는지 궁금합니다.

log4net: XmlHierarchyConfigurator: Setting Property [Layout] to object [log4net. 
Layout.Layout2RawLayoutAdapter] 
log4net: XmlHierarchyConfigurator: Setting Collection Property [AddParameter] to 
object [log4net.Appender.AdoNetAppenderParameter] 
log4net: SystemInfo: Loaded type [MyApp.Logging.IsCriticalAdoNetPar 
ameter] from assembly [MyApp, Version=2.0.0.2929, Culture=neutral, 
PublicKeyToken=null] by searching loaded assemblies. 
log4net: XmlHierarchyConfigurator: Setting Property [ParameterName] to String va 
lue [@is_critical] 
log4net: XmlHierarchyConfigurator: Setting Property [DbType] to DbType value [Bo 
olean] 
log4net: XmlHierarchyConfigurator: Setting Property [Size] to Int32 value [1] 
log4net: XmlHierarchyConfigurator: Parameter [layout] specified subtype [log4net 
.Layout.PatternLayout] 
log4net: XmlHierarchyConfigurator: Performing additional conversion of value fro 
m [PatternLayout] to [IRawLayout] 
log4net: XmlHierarchyConfigurator: Setting Property [Layout] to Layout2RawLayout 
Adapter value [log4net.Layout.Layout2RawLayoutAdapter] 
log4net: XmlHierarchyConfigurator: Setting Collection Property [AddParameter] to 
object [MyApp.Logging.IsCriticalAdoNetParameter] 
log4net: XmlHierarchyConfigurator: Created Appender [ADONetAppender] 
log4net: XmlHierarchyConfigurator: Adding appender named [ADONetAppender] to log 
ger [root]. 
log4net: XmlHierarchyConfigurator: Hierarchy Threshold [] 
log4net:ERROR [AdoNetAppender] Exception while writing to database 
System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'IsCritical 
'. 
Statement(s) could not be prepared. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolea 
n breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception 
, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 

답변

0

먼저 부울 (비트)이므로 내 맞춤 매개 변수를 크기 1로 변경했습니다. 이렇게해도 문제가 해결되지는 않지만 더 정확한 구성입니다.

<parameter type="MyApp.Logging.IsCriticalAdoNetParameter"> 
    <parameterName value="@is_critical"/> 
    <dbType value="Boolean"/> 
    <size value="1"/> 
    <layout type="log4net.Layout.PatternLayout" value=""/> 
    </parameter> 

마지막으로, 일부 추적을 통해 사용자 정의 매개 변수가로드 된 어셈블리가 아니었다 듯, 그래서는 XML의 구성 관리자를 실행 한 후 나는 명시 적으로 부트 스트랩 단계에서 매개 변수를 건설했다. Log4net은로드 된 어셈블리가 아니기 때문에 리플렉션을 사용하여 Appender를 찾는데 어려움을 겪고 있다고 생각합니다.

XmlConfigurator.Configure(); 
    // this ensure the ado net appender is loaded. 
    IsCriticalAdoNetParameter adoNetParameter = new IsCriticalAdoNetParameter(); 
관련 문제