Reputation: 300
Using log4net (C#) and Oracle, I'm trying to create a custom ADO Appender so that I don't need to use a config file. My code so far
public static void CreateAppender()
{
var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
var ADOAppender = new AdoNetAppender();
AddDateTimeParameterToAppender(ADOAppender, ":log_date", "log4net.Layout.RawTimeStampLayout");
AddStringParameterToAppender(ADOAppender, ":thread", 255, "%thread");
AddStringParameterToAppender(ADOAppender, ":log_level", 50, "%level");
AddStringParameterToAppender(ADOAppender, ":logger", 255, "%logger");
AddStringParameterToAppender(ADOAppender, ":message", 30000, "%message");
ADOAppender.ConnectionType =
"System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
ADOAppender.CommandText =
"INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)";
ADOAppender.ConnectionString = "data source=[db];User ID=[id];Password=[pass]";
ADOAppender.BufferSize = 1;
ADOAppender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(ADOAppender);
}
public static void AddDateTimeParameterToAppender(AdoNetAppender appender, string paramName, string conversionPattern)
{
var param = new AdoNetAppenderParameter { ParameterName = paramName, DbType = System.Data.DbType.DateTime, Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern)) };
appender.AddParameter(param);
}
public static void AddStringParameterToAppender(AdoNetAppender appender, string paramName, int size, string conversionPattern)
{
var param = new AdoNetAppenderParameter
{
ParameterName = paramName,
DbType = System.Data.DbType.String,
Size = size,
Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern))
};
appender.AddParameter(param);
}
I'm not getting any exceptions, yet no data is being inserted into the database. I'm almost positive it has to do with the parameters because when I set all of the values to null, it works.
Does anyone see what I'm doing wrong? I've googled A LOT but none of the examples I found used the ADO Appender. Thanks
Upvotes: 0
Views: 1245
Reputation: 300
Tobyb, Thanks for your response, I figured out what I was doing wrong. When adding the DateTime parameter I set the layout to Layout2RawLayoutAdapter when it needed to be RawTimeStampLayout(). I needed to replace Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern))
with Layout = new RawTimeStampLayout()
. My updated AddDateTimeParameterToAppender method looks like this..
public static void AddDateTimeParameterToAppender(AdoNetAppender appender, string paramName)
{
var param = new AdoNetAppenderParameter
{
ParameterName = paramName,
DbType = System.Data.DbType.DateTime,
Layout = new RawTimeStampLayout()
};
appender.AddParameter(param);
}
Upvotes: 0
Reputation: 746
I've had similar experiences with the ADONetAppender. Have you turned on the internal log4net debugging? I don't recall the specifics for my problem, but after turning on debugging I was able to figure it out.
http://logging.apache.org/log4net/release/faq.html#internalDebug
Also, I'm sure you have, but ensure you have the 'XmlConfigurator' line in your project.
Details here: Log4Net not writing to the database
Upvotes: 1