log4net without app.config

本文关键字:config app without log4net | 更新日期: 2024-09-26 04:12:49

我正试图使用adoNetappender登录到sql server,它与app.config一起使用,但我需要它将app.config清空。这是我的adoNetappenter测试代码。

[assembly: log4net.Config.XmlConfigurator( Watch = true )]

命名空间TestAdoNet{

class Program
{
    private static readonly log4net.ILog logger = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType );
    static void Main( string[] args )
    {
        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
        PatternLayout patternLayout = new PatternLayout();
        patternLayout.ConversionPattern = "%date [%thread] %level %logger - %message%newline";
        patternLayout.ActivateOptions();
        AdoNetAppender adoNet = new AdoNetAppender();
        adoNet.BufferSize = 1;
        adoNet.Layout = patternLayout;
        adoNet.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
        adoNet.ConnectionString = "data source=.; initial catalog=test;integrated security=true;";
        adoNet.CommandText = "INSERT INTO Log2 ([Date],[Thread],[Level],[Logger], [Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)";

        AdoNetAppenderParameter logDate = new AdoNetAppenderParameter();
        logDate.ParameterName = "@log_date";
        logDate.DbType = DbType.DateTime;
        logDate.Layout = new RawTimeStampLayout();
        adoNet.AddParameter( logDate );
        RawLayoutConverter rlc = new RawLayoutConverter();
        AdoNetAppenderParameter logThread = new AdoNetAppenderParameter();

        logThread.ParameterName = "@thread";
        logThread.DbType = DbType.String;
        logThread.Size = 255;
        logThread.Layout = (IRawLayout)rlc.ConvertFrom( new PatternLayout( "%thread" ) );
        adoNet.AddParameter( logThread );
        AdoNetAppenderParameter logLevel = new AdoNetAppenderParameter();
        logLevel.ParameterName = "@log_level";
        logLevel.DbType = DbType.String;
        logLevel.Size = 50;
        logLevel.Layout = (IRawLayout)rlc.ConvertFrom( new PatternLayout( "%level" ) );
        adoNet.AddParameter( logLevel );
        AdoNetAppenderParameter logLogger = new AdoNetAppenderParameter();
        logLogger.ParameterName = "@logger";
        logLogger.DbType = DbType.String;
        logLogger.Size = 255;
        logLogger.Layout = (IRawLayout)rlc.ConvertFrom( new PatternLayout( "%logger" ) );
        adoNet.AddParameter( logLogger );
        AdoNetAppenderParameter logMessage = new AdoNetAppenderParameter();
        logMessage.ParameterName = "@message";
        logMessage.DbType = DbType.String;
        logMessage.Size = 4000;
        logMessage.Layout = (IRawLayout)rlc.ConvertFrom( new PatternLayout( "%message" ) );
        adoNet.AddParameter( logMessage );
        AdoNetAppenderParameter logException = new AdoNetAppenderParameter();

        logException.ParameterName = "@exception";
        logException.DbType = DbType.String;
        logException.Size = 2000;
        logException.Layout = (IRawLayout)rlc.ConvertFrom( new ExceptionLayout() );

        adoNet.ActivateOptions();
        hierarchy.Root.AddAppender( adoNet );
        hierarchy.Root.Level = Level.All;
        hierarchy.Configured = true;

        logger.Error( "test" );
    }
}

我对rolingfileappender也做了同样的尝试,它能工作,我现在唯一的问题是sql服务器。我没有收到任何错误消息,所以我不知道出了什么问题。

log4net without app.config

谢谢@stuartd我找到了

错误:ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;",

右:ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",

最后的";"是问题:D

您也可以设置为:ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data"

这样,您就不会将自己绑定到依赖项的特定版本。

我发现,使用特定的Version=1.0.3300.0会不断地创建到数据库的新连接。这样的连接保留在SQL端的连接池中,没有被重复用于类似的请求——期望池中的连接在相同的上下文下被重复使用。我的应用程序周期性地宕机,因为连接池达到了它的极限,并且没有可用的连接供应用程序使用。

当我删除这个版本(使用上面粘贴的代码)时,连接池变得更加稳定,因为连接被重用了。

这个特定版本背后的原因是什么?我在网上没有找到任何东西。