2013-05-06 2 views
0

Я использую пользовательский ADONetAppender, который определяет основные параметры: Date, Thread, Level и т. Д., Но также использует пользовательский добавочный параметр. Кажется, что на моей машине разработки Win 7, работающей под управлением SQL Server 2008 R2, она отлично работает, и добавлен специальный параметр, привязанный к столбцу бит и требуемый (не нулевой).Пользовательский лог4net ADONET appender не работает на некоторых машинах

При запуске службы на компьютере с Win Server 2003 (один из запущенных SQL Server 2005 и другой с 2008 R2), log4net не может добавить журнал в базу данных, но мои другие приложения работают. Я знаю, что log4net имеет внутреннюю отладку, но на этом работает служба, поэтому у меня нет доступа к консоли. Существуют ли проблемы совместимости с разными версиями окон или некоторые другие предлагаемые действия по отладке?

Если бы я должен был удалить дополнительный параметр, журналы записываются в БД.

<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(); 
     } 
    } 

Update, сделал некоторые отладки с небольшой консольного приложения, который имеет тот же раздел журнала. Кажется, он взорвался по имени столбца. Кажется, это означает, что столбец не существует, но он это делает. Интересно, возникает ли проблема с преобразованием логического в фактический тип данных 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();