如何从 log4net 中的存储过程插入数据库?
Posted
技术标签:
【中文标题】如何从 log4net 中的存储过程插入数据库?【英文标题】:how to insert into database from stored procedure in log4net? 【发布时间】:2011-03-28 07:38:02 【问题描述】:我必须像这样记录线程上下文属性:
string logFilePath = AppDomain.CurrentDomain.BaseDirectory + "log4netconfig.xml";
FileInfo finfo = new FileInfo(logFilePath);
log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);
ILog logger = LogManager.GetLogger("Exception.Logging");
log4net.ThreadContext.Properties["MESSAGE"] = exception.Message;
log4net.ThreadContext.Properties["MODULE"] = "module1";
log4net.ThreadContext.Properties["COMPONENT"] = "component1";
logger.Debug("test");
配置文件为:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<logger name="Exception.Logging" level="Debug">
<appender-ref ref="AdoNetAppender"/>
</logger>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<connectionString value="Data Source=xe;User ID=test;Password=test;" />
<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<bufferSize value="10000"/>
<commandText value="Log_Exception_Pkg.Insert_Log" />
<commandType value="StoredProcedure" />
<parameter>
<parameterName value="@p_Error_Message" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%propertyMESSAGE"/>
</layout>
</parameter>
<parameter>
<parameterName value="@p_Module" />
<dbType value="String" />
<size value="225" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%propertyMODULE"/>
</layout>
</parameter>
<parameter>
<parameterName value="@p_Component" />
<dbType value="String" />
<size value="225" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%propertyCOMPONENT"/>
</layout>
</parameter>
</appender>
</log4net>
</configuration>
但它没有将它们插入数据库。我怎样才能让它工作?
【问题讨论】:
尝试开启内部调试(logging.apache.org/log4net/release/faq.html)。另请注意:Log4net 可以处理您实际上不需要为此使用线程上下文属性的异常... 非常感谢斯特凡。它现在完成了。我从参数名称中删除了“@”。它终于奏效了:) 【参考方案1】:简单的回答:因为这是一个 Oracle 连接,所以从参数名称中删除 @ 符号,它将起作用。
示例:
<parameter>
<parameterName value="@p_Module" />
<dbType value="String" />
<size value="225" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%propertyMODULE"/>
</layout>
</parameter>
【讨论】:
【参考方案2】:当 log4net 表在不同的架构中时,我遇到了类似的问题。 (如果它们在不同的模式中,它肯定也适用于存储过程或包)
不要忘记在表或存储过程之前键入您的架构名称。
示例:
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<connectionString ..../>
<commandText value="INSERT INTO schemaName.LOG4NET (LOG_DATE, LOG_LEVEL, LOG_IDENTITY, LOG_MESSAGE, LOG_EXCEPTION) VALUES (:log_date, :log_level, :log_identity, :log_message, :log_exception)" />
....
【讨论】:
以上是关于如何从 log4net 中的存储过程插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何执行存储在 MySQL 中的将 ID 从一个表插入到另一个表的过程?