Git Product home page Git Product logo

log4netadonetappender's People

Contributors

franklnielsen avatar microknights avatar souzaemarcal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

log4netadonetappender's Issues

Error while opening SQL Connection (using .NET Core 3 Preview 6)

Hi,
first of all thanks for this package.

I would love to use this appender to log into the database in a .NET Core 3 Preview 6 application.
Unfortunately when the project starts and I initialise log4net, I get this error:

File name: 'System.Data.SqlClient, Version=4.6.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMarkHandle stackMark, ObjectHandleOnStack assemblyLoadContext, Boolean loadTypeFromPartialName, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext, Boolean loadTypeFromPartialName)
at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
at MicroKnights.Logging.AdoNetAppender.ResolveConnectionType()

I used the configuration file of example available here. Any Idea?

Thanks in advance!

Cannot find ConnectionStringName

Hi,

.NET Core 6, when specifying connectionStringName in log4net, it cannot locate it. ConnectionStrings with connectionStringName is set in appsettings.json.

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Could not open database connection []. Connection string context [Unable to resolve connection string from ConnectionString, ConnectionStrings, or AppSettings.].
System.InvalidOperationException: The ConnectionString property has not been initialized.
   at Npgsql.NpgsqlConnection.Open(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.Open()
   at MicroKnights.Logging.AdoNetAppender.InitializeDatabaseConnection()

Logging get stop after getting Unable to write data to the transport connection: Broken pipe.

I have a mysql8 db with .net core 3.1 application where logging is taking place.
Problem is logging get stopped when i get above exception. I am using Mysql connector 8.0.25
Strange thing is you look like handled this case via

if (ReconnectOnError && (Connection == null || Connection.State != ConnectionState.Open))
            {
                LogLog.Debug(declaringType, "Attempting to reconnect to database. Current Connection State: " + ((Connection == null) ? SystemInfo.NullText : Connection.State.ToString()));

                InitializeDatabaseConnection();
            }

But still logging didn't take place. I have checked the ReconnectOnError property and it is true. now putting log to check connection state when i got this error.
What can i do to resolve this

Is SQLite supported ?

Hello,

I am trying to setup your appender with a SQLite database.
I have a simple console project created with .NET Core 3.1 with a reference to the Microsoft.EntityFrameworkCore.Sqlite 3.1.8 nuget package.
The configuration file most important rows are as follow:

<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.EntityFrameworkCore.Sqlite, Version=3.1.8.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" />
    <connectionString value="sqlite" />
    <connectionStringFile value="connectionstrings.json" />
...

and the connectionstrings.json contents:

{
  "connectionstrings": {
    "sqlite": "Data Source=log4net.db;Version=3;",
  }
}

I already have a log4net.db database file with the correct table in it but I am not sure where to place it exactly in the folder structure (I placed it in the same location as log4net.config), also looking at the documentation you provided I see I need a ConnectionStringFile property and the actual json file. Looking at your tests examples I did not see a SQLite example so I just improvised and also I have the same question: where should it be located ? In the same location as the log4net.config ? or in the bin/Debug/bla/bla folder ? (in my tests it is placed in the same location as log4net.config)
Also all files are marked as Always Copy

PS Funny thing is I am not getting any errors or at least I didn't see any... but the table in db file does not get updated

Any help would be appreciated,

Thank you in advance

%M and %C

I am getting the empty values for %M - Method Name and %C - class name

Support for SQL aliases

As presented in this thread, support for SQL aliases were put down since netcore very beginning. In the link also there's a proposal that I've already added in a local branch. ¿Could I pull request?

Use Oracle as Log Target

Hi,
i've seen a past issue with logging to Oracle DB. I tried to configure it. I've already included the Oracle.ManagedDataAccess.Core package in my project and configured log4net in this way:

    <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
        <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=3.1.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
        <connectionStringName value="OracleConnection" />
        <connectionStringFile value="appsettings.json" />

This works at the first sight, but i get an exception

   at MicroKnights.Logging.AdoNetAppender.SendBuffer(LoggingEvent[] events)
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-01006: bind variable does not exist
   at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, OracleConnection connection, OracleLogicalTransaction& oracleLogicalTransaction, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
   at MicroKnights.Logging.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
   at MicroKnights.Logging.AdoNetAppender.SendBuffer(LoggingEvent[] events)

my parameters are configured like these:

        <parameter>
            <parameterName value=":message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message" />
            </layout>
        </parameter>

I already tried "@" and ":" and checked case etc.

As i get already an ORA- Error the connection to the DB seems to be established.
When i configure a insert statement without any variables then i get the recorid inserted into the table.
As soon as i add one variable then the error occurs.

Have i missed something in my configuration?

Supported custom layout ?

I use Custom layout to store my MS database table,but there are some problems
image
[DongGuan.Web.Models.MyLayout] is my custom layout type

GetAppenders() returns empty collection

I tried to write logs into database with .net 5.0 and netcoreapp3.1 console app. For some reason there is no any appender.

        public static void Main(string[] args)
        {

            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            var loggerConfig = new FileInfo("logger.config");
            XmlConfigurator.Configure(logRepository, loggerConfig);
            var appenders = logRepository.GetAppenders();

            ILog loger = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

            loger.Info("logging to database");
        }

logger.config file is available and not empty;
appsettings.json also not empty and contains DefaultConnection connection string;
I even setup "always copy to output directory" for both;

But "appenders" collection is empty and there is no any new record in DB

My logger.config file:

  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5"/>
    <connectionStringName value="DefaultConnection" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
    ...

Maybe I'm doing something wrong ?

System.TypeLoadException:

I find this issue " Method 'getProperties' in type 'Microsoft.Extensions.Configuration.ConfigurationBuilder' from assembly 'Microsoft.Extensions.Configuration, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation. at MicroKnights.Logging.AdoNetAppender.ResolveConnectionString(String& connectionStringContext) at MicroKnights.Logging.AdoNetAppender.InitializeDatabaseConnection()" for net core 2.0,I think is the assembly version problem, is there any solution?

Problem when creating instance out of default AssemblyLoadContext

Hello,

log4net logger shall be loaded in a plugin which is implemented in .net6.0.

Each plugin has it's own AssemblyLoadContex.

When try to instantiate, following error occurs:

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed to load connection type [System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Das System kann die angegebene Datei nicht finden.

But file System.Data.SqlClient is in plugin folder, which is not application folder of executable.

Any idea to fix this issue?

Net Core 3.1

Same request as for Log4NetHelper.
Any chance this could get updated to the latest net standard to support net core 3.1
I mean I'm sure I can make it work but since I use this in a lot of project I'd prefer to have access to your nuget version :)

Strong-naming

Would it be possible to add strong name to the assembly on nuget? Unfortunately our project needs strong-named assemblies, and I wouldn't want to disable validation for all assemblies because of this one. Obviously this is something that can be done only by the author who is pushing the assembly to nuget.

Add to Documentation

Hi
When using different environments (appsettings.Development/Production/whatever.json) the connectionStringFile tag in log4net.config has to be (The code uses string.fomat and will replace {0} with current Environment.

Dynamic Connection string

I have a different connection string for my dev and production environments. Is there a way to set the connection string dynamically?

.Net Core 5.0 version log4net file in sqlserver code not working

Hello,
My code in the log4net file in my .Net Core 5.0 project is as follows. I cannot log into the database, although I have applied all what I have written. What can I do ?

<logger name="DatabaseLogger">
	<level value="ALL"></level>
	<appender-ref ref="DatabaseLogger"/>
</logger>

Target .NET Standard 2.0

This should be fairly simple. You could probably drop some of the references. I can try to do this myself, but first I'd need the strong-naming to be done, so we can start using this library.

When the connection string is specified in the user secrets, Log4NetAdoNetAppender fails get the connection string

To reproduce add the connection string to the user secrets file. In VS 2022 one can use the Manage User Secrets. See this for more information: https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-7.0&tabs=windows.

Once the connection string is added to the user secrets file, enable debug=true for log4net and run the app.

I get this in the debug output:
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Could not open database connection []. Connection string context [ConnectionStringFile: ...

The config I am using:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <log4net debug="true">
    <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender" > <!-- type="log4net.Appender.AdoNetAppender" --> 
      <bufferSize value="1" />
      <connectionType
        value="System.Data.SqlClient.SqlConnection, System.Data" /> <!-- -->
      <connectionStringName value="mydb" />
      <connectionStringFile value="appsettings.json" />
      <commandText
        value="INSERT INTO log4net.Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="-1" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="-1" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>    
    <appender name="console" type="log4net.Appender.ManagedColoredConsoleAppender">
      <mapping>
        <level value="INFO" />
        <forecolor value="Green" />
      </mapping>
      <mapping>
        <level value="WARN" />
        <forecolor value="Yellow" />
      </mapping>
      <mapping>
        <level value="ERROR" />
        <forecolor value="Red" />
      </mapping>
      <mapping>
        <level value="DEBUG" />
        <forecolor value="Blue" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger.%method[%line] - %message%newline" />
      </layout>
    </appender>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
      <file value="main.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="25MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger.%method[%line] - %message%newline" />
      </layout>
    </appender>    
    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
      <appender-ref ref="console" />
      <appender-ref ref="file" />

    </root>
  </log4net>
</configuration>

This call returns the proper connection value: configuration.GetConnectionString("mydb"); at runtime even when the string is in the user secrets.

User secrets file content:

{
  "ConnectionStrings": {
    "mydb": "Server='<server>'; Database='mydb'; UID='<user>'; PWD='<pwd>';TrustServerCertificate=true"
  }
}

(I replaced the real values with place holders)

I also tried it without the <connectionStringFile value="appsettings.json" /> line hoping the library just uses the default configuration but it doesn't work.

Azure ConnectionString

I have connectionstring define in variable in Azure app service, I try to use ConnectionStringName without and with file but seams it is not working.

How to use that connectionstring?

I saw in source code maybe it is missing to Add Environment Variables in config builder new ConfigurationBuilder().AddEnvironmentVariables()

Api logger sending null entries to DB leading to exception without any post api call

I have used this log4netappender for logging in 3 cases in my application. The API appender is triggered automatically multiple times with null entries leading to DB exception for NOT NULL column. The custom code for API logging only runs in case of POST calls.

DB : PostgreSQL 15
Dot Net : .NET 5.0

Please help as I am unable to find the root cause for this. I think it could be because of the log4net DLL version 2.0.14 we are using.

image

Thanks

Error While making SQL Connection

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed to load connection type [System.Data.SqlClient.SqlConnection,System.Data.SqlClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]
System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified.

Reading ConnectionStringFile property fails for V2 works in v1.0.2

The following config works in v.1.0.2 and will read connection string from
appsettings.json:

{
"ConnectionStrings": {
"Log4Net": "data source=.; initial catalog=DB;integrated security=true;"
},
"APP": {..}
}

log4net.config:

<appender name="AdoNetBusinessAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
 <connectionType value="System.Data.SqlClient.SqlConnection,System.Data,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
 <connectionStringName value="Log4Net" />
 <connectionStringFile value="appsettings.json" />

In V.2 this results in

log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [connectionStringName] to set object on [MicroKnights.Logging.AdoNetAppender]

Anyway i can ignore logs when find certain value in my customer property. Does this class support filtering

I have added following in my appender settings

   <parameter>
      <parameterName value="_context" />
      <dbType value="String" />
      <size value="25" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="Context" />
      </layout>
    </parameter>

    <filter type="log4net.Filter.PropertyFilter">
      <key value="Context" />
      <stringToMatch value="Transaction" />
      <acceptOnMatch value="false" />
    </filter>

What i am doing is logging lot's of scenario. But i wanted to skip logs going to db command when Context Property have value ="Transaction"

But it seems to be not working.
Please let me know what i need to correct

you can check my related question on stackoverflow

https://stackoverflow.com/questions/59751628/how-to-ignore-logs-when-some-property-have-certain-value-in-log4net

no output at all

Hey there,

I'm running core.net 2.0 and as log4net can't log to the AdoNetAppender I'm using your small module. Now when I make a config error it neatly tells me that it doesn't want to load (eg: if I make the appender type="MicroKnights.Logging.AdoNetAppender", so without the assemblyname it just tells me it doesn't exist). But now nothing, no output at all ,nor does anything show up in the database.

So I'm not sure anymore where to look/what to debug. Could you check out my (attached) config. to see if there's any error. And help me figure out how to debug this module?

Kind regards,

André

<appender name="AdoNetAppender_SqlServer" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.6.25921.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <connectionStringName value="LOGSQLConnectionString" />
    <connectionStringFile value="..\\config.json" />
    <commandText value="INSERT INTO [sftpmanager.log] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <commandType value="Text"/>
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout" value="%thread" />
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout" value="%level" />
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout" value="%logger" />
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout" value="%message" />
    </parameter>
  </appender>

Issue when setting ConnectionString at runtime

Hello,

we have found following issue:

Error, when debugging log4net:
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Could not open database connection []. Connection string context [Unable to resolve connection string from ConnectionString, ConnectionStrings, or AppSettings.].
System.InvalidOperationException: The ConnectionString property has not been initialized.
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at MicroKnights.Logging.AdoNetAppender.InitializeDatabaseConnection()

Setting connection string at runtime. Although connection string has been set as desired (after setting AdoNetAppender.ConnectionString will bee checked) the above error occurs.

Using .net 6 Application. SQL Server database.

Example connection string: data source=myserver\myinstance;initial catalog=INTERN_TEST;integrated security=false;persist security info=True;User ID=myuser;Password=mypassword

Application with WebApi and multithreading. Multiple log entries per second possible.

Example Code:
adoNetAppender.ConnectionString = connectionStringFromConfig;
adoNetAppender.ActivateOptions(); // here the error occurs (not thrown since handled exception, but effect is, that log entry is missing - error only shows, when log4net debugging active)

Are there any hints how to solve this issue?

Regards

Jörg

Is this suppossed to work with OracleConnection?

Hey,
I am trying to setup yours appender with OracleDB.
In a project I am referencing Oracle.ManagedDataAccess.Core 2.19.70.
So i have setup connectionType as follow:
<connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=2.0.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
I'am setting connection string at runtime (using call like at Log4NetHelper)
Unfortunatelly after start and logger configuration I'm getting GenericFailure ErrorCode = GenericFailure from appender when running.

Question is do you even support something diefferent than MSSQL?

Duplicate Entry for same Request

I had used this nuget in .net core 3.1 version. I am facing issue of duplicate entries for same request. Sometimes it's two, three, four and more than that. My configuration of log4net is :


<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
    <threshold value="Error" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="WebLog" type="log4net.Appender.RollingFileAppender">
    <threshold value="Error" />
    <file type="log4net.Util.PatternString" value="\Log\logs_" />
    <staticLogFileName value="false" />
    <param name="AppendToFile" value="true" />
    <param name="RollingStyle" value="Date" />
    <param name="DatePattern" value="yyyy-MM-dd'.log'" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date  %-5level %logger  - %message%newline" />
    </layout>
  </appender>

  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <threshold value="INFO" />
    <bufferSize value="1" />
    <connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5" />
    <connectionStringName value="DefaultConnection" />
    <connectionStringFile value="appsettings.Development.json" />
    <commandText value="EXEC sp_InsertLogInTable @TableName, @RequestTime, @Url, @TimeElapsed, @StatusCode, @Headers, @Referer,@IP,@Method,@PostData,@QueryString, @UserId,@UserAgent, @LogLevel" />
    <parameter>
      <parameterName value="@TableName" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TableName}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@RequestTime" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{RequestTime}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Url" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Url}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@TimeElapsed" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TimeElapsed}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@StatusCode" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{StatusCode}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Headers" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Headers}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Referer" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Referer}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@IP" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{IP}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Method" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Method}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@PostData" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{PostData}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@QueryString" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{QueryString}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserId" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserId}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserAgent" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserAgent}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@LogLevel" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
  </appender>

  <root>
    <level/>
    <appender-ref ref="DebugAppender" />
    <appender-ref ref="WebLog" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

format of connectionstring file

Hi, does the connectionstring file look for keys within a Connection string section eg.

"ConnectionStrings": {
"log4net" : " [The connection string]"
}

or is it just a flat file

{
"log4net" : "[The Connection string]"
}

I'm currently reading from my appsettings.json file, is this ok or should i create a separate file ?

I think you can add support for sqlite databases

For the test environment, sqlite testing will be more convenient. The production environment will be directly switched to mssql. With the sqlsugat orm framework, you can see the record results after downloading the code and running it directly to avoid generating a pile of mssql

How can I create a custom column?

I'm trying to create a custom column with the conversionPattern property and would like to know if this functionality is supported.
I'm saving logs of several applications and I want to save the name of the application, as well as an auto incremental number for each application
The way I am implementing it is as follows.

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
	<root>
		<level value="ALL" />
		<appender-ref ref="ADONetAppender" />
	</root>
	<appender name="ADONetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
		<bufferSize value="1" />
		<connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
		<connectionString value="MyServerConnectionString" />
		<commandText value="insert into LogItem(LogItemNumber,LogItemDate,LogItemTimeStamp,LogItemThread,LogItemLevel,LogItemLogger,LogItemMessage,LogItemException) values (@logItemNumber,@logItemDate,@logItemTimeStamp,@logItemThread,@logItemLevel,@logItemLogger,@logItemMessage,@logItemException)" />
		<parameter>
                        <!--here my new column-->
			<parameterName value="@logItemNumber" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%logCounter" />
				<converter>
					<name value="logCounter" />
					<type value="Utilities.LogCounterPatternConverter" />
				</converter>
			</layout>
                        <!--here my new column-->
		</parameter>
		<parameter>
			<parameterName value="@logItemDate" />
			<dbType value="DateTime" />
			<layout type="log4net.Layout.RawTimeStampLayout" />
		</parameter>
		<parameter>
			<parameterName value="@logItemTimeStamp" />
			<dbType value="Int64" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%timestamp" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@logItemThread" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%thread" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@logItemLevel" />
			<dbType value="String" />
			<size value="50" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%level" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@logItemLogger" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%logger" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@logItemMessage" />
			<dbType value="String" />
			<size value="8000" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%message" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@logItemException" />
			<dbType value="String" />
			<size value="8000" />
			<layout type="log4net.Layout.ExceptionLayout" />
		</parameter>
	</appender>
</log4net>

My pattern layout converter class is like this

namespace Utiities
{
    public sealed class LogCounterPatternConverter : PatternLayoutConverter
    {
        private static int LogCounter = 1;
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            writer.Write(LogCounter.ToString(CultureInfo.InvariantCulture));
            LogCounter++;
        }
    }
}

The error

log4net: Created Appender [RollingLogFileAppender]
log4net: Adding appender named [RollingLogFileAppender] to logger [root].
log4net: Loading Appender [ADONetAppender] type: [MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender]
log4net: Setting Property [BufferSize] to Int32 value [1]
log4net: Setting Property [ConnectionType] to String value [System.Data.SqlClient.SqlConnection,System.Data.SqlClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]
log4net: Setting Property [ConnectionString] to String value [MyConnectionString]
log4net: Setting Property [CommandText] to String value [insert into LogItem(LogItemNumber,LogItemDate,LogItemTimeStamp,LogItemThread,LogItemLevel,LogItemLogger,LogItemMessage,LogItemException) values (@logItemNumber,@logItemDate,@logItemTimeStamp,@logItemThread,@logItemLevel,@logItemLogger,@logItemMessage,@logItemException)]
log4net: Setting Property [ParameterName] to String value [@logItemNumber]
log4net: Setting Property [DbType] to DbType value [String]
log4net: Setting Property [Size] to Int32 value [255]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%logCounter]
log4net: Setting Property [Name] to String value [logCounter]
log4net:ERROR Could not create Appender [ADONetAppender] of type [MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender]. Reported error follows.
System.TypeLoadException: Could not load type 'NotificacionProgramadaWS.Utilidades.LogCounterPatternConverter' from assembly 'log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.
   at System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext)
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Util.TypeConverters.TypeConverter.ConvertFrom(Object source)
   at log4net.Util.OptionConverter.ConvertStringTo(Type target, String txt)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ConvertStringTo(Type type, String value)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.SetParameter(XmlElement element, Object target)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.SetParameter(XmlElement element, Object target)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.SetParameter(XmlElement element, Object target)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.SetParameter(XmlElement element, Object target)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
log4net:ERROR Appender named [ADONetAppender] not found.
log4net: Hierarchy Threshold []

The configuration is working fine as I have records in the database, but when I try to add the custom column I get the error

imagen

Update Configuration at runtime

Hi, I need to dynamically update log4net configuration. ConnectionString update is working fine, but ConnectionType and probably CommandText are not updating. If'll not specify them in log4net.config, there is an error on config read. I need to override them to use different providers based on configuration.

    public static class Log4NetAppender
    {
        public static void Configure(string provider, string connectionString)
        {
            Hierarchy logHierarchy = LogManager.GetRepository() as Hierarchy;
            if (logHierarchy != null)
            {
                var appender = logHierarchy.GetAppenders()
                                               .OfType<MicroKnights.Logging.AdoNetAppender>()
                                               .SingleOrDefault();

                if (appender == null)
                    throw new InvalidOperationException("Can't locate a database appender");

                appender.ConnectionString = connectionString;

                if (provider == "Postgres")
                {
                    appender.ConnectionType = "Npgsql.NpgsqlConnection, Npgsql, Version=7.0.4.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7";
                    appender.CommandText = "INSERT INTO Log (Date,Machine,UserName,Thread,Level,Logger,Message) VALUES (@log_date, @machine, @username, @thread, @log_level, @logger, @message)";
                }
                else if (provider == "SqlServer")
                {
                    appender.ConnectionType = "Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=5.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5";
                    appender.CommandText = "INSERT INTO Log ([Date],[Machine],[UserName],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @machine, @username, @thread, @log_level, @logger, @message)";
                }
                appender.ReconnectOnError = true;

                appender.ActivateOptions();
            }
        }
    }

log4net in database

hello, good afternoon, I have this configuration in log4net.config, I'm trying to save my logs in the database, which is already created.

but the error that shows in the console is this

log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [bufferSize] to set object on [log4net.Layout.PatternLayout]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [connectionType] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [connectionString] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [commandText] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [parameter] to set object on [log4net.Appender.ConsoleAppender]
Hello Word
Hello Word
Hello Word

This comment "Hello Word" I do it in program. cs with
log.Error("Hello Word");
log.Warn("Hello Word");
log.Info("Hello Word");

can you help me?

Attempted to read past the end of the stream. In Mysql 8 with buffer settings.

I am using buffer for inserting the logs. I am having following error at the time of buffered.Flush

MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered attempting to read the resultset.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed.
 ---> System.IO.EndOfStreamException: Attempted to read past the end of the stream.
   at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at MicroKnightsLogging.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
   at MicroKnightsLogging.AdoNetAppender.SendBuffer(LoggingEvent[] events)
   at log4net.Appender.BufferingAppenderSkeleton.SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer)
   at log4net.Appender.BufferingAppenderSkeleton.Flush(Boolean flushLossyBuffer)
   at log4net.Appender.BufferingAppenderSkeleton.Flush()

I am using .net core 3.1 with Mysql 8

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.