microknights / log4netadonetappender Goto Github PK
View Code? Open in Web Editor NEW.Net Standard 1.3-2.1 AdoNetAppender
License: Apache License 2.0
.Net Standard 1.3-2.1 AdoNetAppender
License: Apache License 2.0
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!
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()
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
Can someone help me in creating a Dapper version of MicroKnightsLogging which i want to use in .net core 3.1 application with Mysql 8.0
Like to take advantage of some async and other features in dapper
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
I am getting the empty values for %M - Method Name and %C - class name
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?
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?
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 ?
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?
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?
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 :)
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.
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.
I have a different connection string for my dev and production environments. Is there a way to set the connection string dynamically?
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>
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.
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.
it wors well when website start
but zhe next day it can't log to mysql
when website restart it works again
my website running in linux .net core 2.2.103
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()
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.
Thanks
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.
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]
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
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>
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(TaskCompletionSource
1 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
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?
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>
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 ?
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
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
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();
}
}
}
I want to define MicroKinghts AdoNetAppender connectionstring from code behind. I don't want to define connection string in AppSettings.Json in AspNetCore application
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?
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.