简体   繁体   English

没有 app.config 的 log.net

[英]log4net without app.config

I am trying to log to an sql server with the adoNetappender it works with an app.config but I need it whiteout an app.config this is my test code for the adoNetappender.我正在尝试使用它与 app.config 一起使用的 adoNetappender 登录到 sql 服务器,但我需要它 whiteout app.config 这是我的 adoNetappender 测试代码。

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

namespace TestAdoNet {命名空间 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" );

    }
}

I tried the same with the rolingfileappender and it works my only problem now is the sql server.我对 rolingfileappender 进行了同样的尝试,现在我唯一的问题是 sql 服务器。 I don't get any error messages so I don't know what is wrong.我没有收到任何错误消息,所以我不知道出了什么问题。

Thanks @stuartd I found it 谢谢@stuartd我找到了

Wrong: 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;",

Right: 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",

The ";" “;” at the end was the problem :D 最后是问题:D

You can also set as: ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data" .您还可以设置为: ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data"

That way you don't bind yourself to a specific version of the dependency.这样您就不会将自己绑定到特定版本的依赖项。

I found that using the specific Version=1.0.3300.0 was constantly creating new connections to the database.我发现使用特定的 Version=1.0.3300.0 会不断创建与数据库的新连接。 Such connections remained in the Connection Pool on SQL side and were not reused for similar requests - the expected is for the connections in the pool to be reused under the same context.此类连接保留在 SQL 端的连接池中,不会被类似请求重用 - 预期池中的连接将在同一上下文中重用。 My application was periodically going down since the connection pool was reaching it's limit and there was no available connections for the application to consume.我的应用程序定期关闭,因为连接池达到了它的限制并且没有可用的连接供应用程序使用。

When I removed the version (using the code I pasted above), the connection pool became more stable as the connections were being reused.当我删除版本(使用我上面粘贴的代码)时,连接池变得更加稳定,因为连接被重用。

The reason behind it for that specific version?该特定版本背后的原因是什么? I haven't found anything online.我没有在网上找到任何东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM