2016-03-10 106 views
0

当记录异常时,它在命令行中正确显示。但是,它不写入数据库。其他参数记录正确。在向MySQL数据库写入异常时发生Log4Net异常

在我的app.config,异常配置如下:

<commandText value="INSERT INTO logs (time, log_level, logger, message, exception, thread) VALUES (?time, ?log_level, ?logger, ?message, ?exception, ?thread)" /> 

参数:

try 
{ 
    throw new DivideByZeroException(); 
} 
catch (Exception e) 
{ 
    log.Error("", e); 
} 

我启用log4net的调试,并得到了:

<parameter> 
    <parameterName value="exception" /> 
    <dbType value="String" /> 
    <size value="2000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%exception" /> 
    </layout> 
</parameter> 

我与测试以下输出:

log4net: Hierarchy Threshold [] 
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 
log4net:ERROR [CustomAdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database 
12:25:37,902 [Game.Program] {exceptions}() ERROR: System.DivideByZeroException: Attempted to divide by zero. 
    at Game.Program.Init() in --:line 98 

log4net:ERROR [CustomAdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database 
System.FormatException: Input string was not in a correct format. 
    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.String.System.IConvertible.ToInt32(IFormatProvider provider) 
    at System.Convert.ToInt32(Object value) 
    at MySql.Data.Types.MySqlInt32.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length) 
    at MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.Statement.SerialiSystem.FormatException: Input string was not in a correct format. 
    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.String.System.IConvertible.ToInt32(IFormatProvider provider) 
    at System.Convert.ToInt32(Object value) 
    at MySql.Data.Types.MySqlInt32.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length) 
    at MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex) 
    at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet) 
    at MySql.Data.MySqlClient.Statement.BindParameters() 
    at MySql.Data.MySqlClient.Statement.Execute() 
    at MySql.Data.MySqlClient.PreparableStatement.Execute() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 
    at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) 
    at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events) 
zeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex) 
    at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet) 
    at MySql.Data.MySqlClient.Statement.BindParameters() 
    at MySql.Data.MySqlClient.Statement.Execute() 
    at MySql.Data.MySqlClient.PreparableStatement.Execute() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 
    at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) 
    at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events) 
+0

看起来像一个值,你试图插入的问题。我认为你有一列NUMBER类型。你能发布你试图插入列的值吗?或者更好的是,所有绑定变量的值。 –

+0

直接询问什么是?time,?log_level,?logger,?message,?exception,?线程变量的值? –

+0

这些都是Log4Net的内部值。除异常外,它们正确记录到数据库。 – Z0q

回答

0

我发现了错误。

显然,我添加了一些全局变量,这些变量在调用我的测试异常函数时尚未初始化。我初始化这些变量为空字符串和零,它的工作。

相关问题