背景:我们正在使用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)
我在这里做错了什么?