具有多线程的Log4Net AdoNetAppender Xml列类型因ORA-31011而失败:XML解析失败

时间:2015-07-16 20:48:35

标签: xml oracle log4net adonetappender

背景:我们正在使用AdoNetAppender登录Oracle数据库。 有5个单元测试,所有这些测试都将虚拟错误消息记录到同一个表中。 Logger实例由Unity解析,生命周期为PerThreadLifetimeManager。

登录数据库的代码如下

public void Error(LogInformation message, Exception exception)
{
    mapLogInformationToContext(message);
    Task.Factory.StartNew(() => Logger.Log(_stackBoundary, Level.Error, message, exception));
 }`

日志信息映射到ThreadContext,如下所示:

private static void mapLogInformationToContext(LogInformation message)
{
    ThreadContext.Properties["LogUserName"] = message.LogUserName;
    ThreadContext.Properties["LogMachineName"] = message.LogMachineName;
    ThreadContext.Properties["LogType"] = message.LogType;
    ThreadContext.Properties["LogCreateDate"] = message.LogCreateDate == default(DateTime) ? DateTime.Now : message.LogCreateDate;
    if (message.LogPropertiesXml != null)
    {
        ThreadContext.Properties["LogPropertiesXml"] = message.LogPropertiesXml.Trim();
    }
}

我们面临的问题是LogPropertiesXml。即使格式良好的Xml也无法使用Task.Factory.StartNew登录数据库。如果取消了Tasking,则所有5个单元测试都有效。否则,只有1-2个测试随机登录到数据库,其他测试因此错误而失败

  

ORA-19202:XML处理发生错误   LPX-00210:预期'<'代替 '('   Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,String procedure,Boolean bCheck,Int32 isRecoverable)第1行出错      at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)      在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()      at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran,LoggingEvent [] events)      at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent [] events)

我在这里做错了什么?

0 个答案:

没有答案