I found myself requiring to instantiate a log4net logger in code (not through the xml configuration).
However, there are a few things that I haven’t worked around yet, here’s the code I came up with.
var hierarchy = (Hierarchy)LogManager.GetRepository();
var logger = hierarchy.LoggerFactory.CreateLogger((ILoggerRepository)hierarchy, "logname");
logger.Hierarchy = hierarchy;
logger.AddAppender(CreateFileAppender());
logger.AddAppender(CreateDbAppender());
logger.Repository.Configured = true;
// alternative use the LevelMap to set the Log level based on a string
// hierarchy.LevelMap["ERROR"]
hierarchy.Threshold = Level.Debug;
logger.Level = Level.Debug;
ILog log = new LogImpl(logger);
log.Error(“This is my error message”);
Note that setting the level needs to be both on the hierarchy and the logger. This is based on the log4net hierarchy implementation.
Creating the Appenders is quite simple.
private IAppender CreateFileAppender()
{
var fileAppender = new RollingFileAppender
{
Name = "myFileAppenderName",
File = "logfile.log",
LockingModel = new FileAppender.MinimalLock(),
AppendToFile = true,
RollingStyle = RollingFileAppender.RollingMode.Size,
MaxSizeRollBackups = 2,
MaximumFileSize = "1MB",
StaticLogFileName = true,
Layout = new log4net.Layout.PatternLayout("%d [%t] %-5p %c %m%n")
};
fileAppender.ActivateOptions();
return fileAppender;
}
private IAppender CreateDBAppender()
{
RawLayoutConverter layoutConverter = new RawLayoutConverter();
var databaseAppender = new AdoNetAppender
{
Name = "myDbAppender",
ConnectionString = connectionStringBuilder.ConnectionString,
CommandText = @"INSERT INTO [Log] ([DateTime], [Exception], [Level], [Logger], [Message], [Thread])
VALUES (@logdate, @exception, @level, @logger, @message, @thread)",
CommandType = System.Data.CommandType.Text,
ConnectionType = "System.Data.SqlClient.SqlConnection",
UseTransactions = true
};
databaseAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@logdate",
DbType = System.Data.DbType.DateTime,
Layout = new RawTimeStampLayout()
});
databaseAppender.AddParameter(new AdoNetAppenderParameter
&n