기본 매개 변수 인 날짜, 스레드, 수준 등을 정의하는 사용자 지정 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]
" />
<param name="Footer" value="[Footer]
" />
<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
 (@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()