I am currently using Log4net to log in a table but I need to stop using that table and log everything in another table for logging errors. Basically I just changed the log4net values and parameters and the table in which I am logging. Here is the Log file
<!--SQL LOG TABLE Appender-->
<appender name="LogAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<!--THIS SETTING ALTERS HOW OFTEN IT WRITES ALL THE LOGGING TO THE DB-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!--local logging connection string-->
<connectionStringName value="DSFDefaultConnection" />
<commandText value="INSERT INTO ProviderHistoryLog ([LogDate],[Event], [CalledPackageName],[ActivityDescription],[SubPackageTaskName],[TaskName]) VALUES (#log_date, #thread, #logger, #message, #notApplicable, #requesturi)" />
<parameter>
<parameterName value="#ProviderId" />
<dbType value="long" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="null" />
</layout>
</parameter>
<parameter>
<parameterName value="#log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawUtcTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="#thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="#logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger | %class " />
</layout>
</parameter>
<!--<parameter>
<parameterName value="#identity" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="DPPAdmin#aez.com"/>-->
<!-- <converter>-->
<!-- <name value="httpuser" />-->
<!-- <type value="fi360.DataServiceFramework.Common.Logging.HttpIdentityUserPatternConverter" />-->
<!-- </converter>-->
<!-- </layout>-->
<!-- </parameter>-->
<parameter>
<parameterName value="#message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="#notApplicable" />
<dbType value="String" />
<size value="-1" />
<layout type="%notApplicable" />
</parameter>
<parameter>
<parameterName value="#requesturi" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%requesturi"/>
<converter>
<name value="requesturi" />
<type value="fi360.DataServiceFramework.Common.Logging.RequestUriUserPatternConverter" />
</converter>
</layout>
</parameter>
</appender>
The problem is, it's not logging in the ProviderHistoryLog table. It's not logging anything. As you can see the value for the buffer size is 1 so I am thinking the issue is in the INSERT INTO statement.
Related
I have been using log4net to log to an Oracle database for the past few weeks and everything was working until I was told that Native Network Encryption had been turn on. This caused my logging to cease and I'm clueless on how to fix it. No errors are given, it just won't write to the DB. I am using the following logger.xml file:
<log4net>
<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
<immediateFlush value="true" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
<connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<connectionStringName value="Payments" />
<commandText value="INSERT INTO CROWN.EOB_LOG (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />
<bufferSize value="1" />
<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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender_Oracle" />
</root>
</log4net>
As I said this was working perfectly until NNE was turned on. The application I am using is a C# console app. Can anyone point me in the right direction?
I have a problem with the AdoNetAppender of log4net in my ASP.NET Core application (netcoreapp1.1).
If I want to use the AdoNetAppender, I get the following error:
System.TypeLoadException: Could not load type 'log4net.Appender.AdoNetAppender' from assembly 'log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.
Is there anybody who have the AdoNetAppender running under ASP.NET Core (netcoreapp1.1)? If not, is there a good alternative to log with log4net into a database? I also use Entity Framework Core.
The AdoNetAppender isn't supported at present on .NET Core 1.0 / .NET Standard 1.3: https://logging.apache.org/log4net/release/framework-support.html#Appenders
For .Net Core you can use nuget.org/packages/MicroKnights.Log4NetAdoNetAppender . It has a bit differences in set up compare to AdoNetAppender, but is very straightforward too, to Find how to set it up here: github.com/microknights/Log4NetAdoNetAppender
Here an example that works for me
<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" />
<connectionStringName value="log4net" />
<connectionStringFile value="appsettings.json" />
<commandText value="INSERT INTO Log ....." />
<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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="#exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
and in your appsettings.json
"ConnectionStrings": {
"log4net": "Data Source=.\\SQLEXPRESS;Initial Catalog=LogDB;User ID=user;Password=pass",
}
I want use Log4Net in my application for logging to console and database(Oracle)
I made this setting :
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%thread] - Level%newline - %level%newlineMessage - %message%newlineUTC Date - %utcdate{ABSOLUTE}%newlineDate - %date{ABSOLUTE}%newline%newline "/>
</layout>
</appender>
<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
<connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
<connectionString value="DATA SOURCE= (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myIpAddress)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xe))); USER ID=user_name PASSWORD=my_password;"/>
<commandText value="INSERT INTO LOG (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />
<bufferSize value="1" />
<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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<root>
<level value="All"/>
<appender-ref ref="AdoNetAppender_Oracle"/>
<appender-ref ref="ConsoleAppender"/>
</root>
On console I have output, but after start there is some Exception thrown: 'Oracle.ManagedDataAccess.Client.OracleException' in Oracle.ManagedDataAccess.dll
And of course there is no new line in Oracle table.
Any suggestion why not working ?
Thank you.
This is a working configuration for my custom table but you can use the default columns. Pay attention on which OracleDataAccess use in your application (Version=2.121.2.0) Check here AdoNetAppender.ConnectionType Property
<appender name="DatabaseAppender" type="log4net.Appender.AdoNetAppender">
<connectionString value="Data Source=HR;User Id=HRL;Password=HR;Max Pool Size=30" />
<connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<commandText value="INSERT INTO HRPORTAL.LOG_WEB (DATA,SESSIONE,ENTITA,DESCRIZIONE,DETTAGLIO,MODULO) VALUES (:data, :sessione,:entita,:descrizione, :dettaglio,:modulo)" />
<bufferSize value="1" />
<parameter>
<parameterName value=":data" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value=":sessione" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{sessione}" />
</layout>
</parameter>
<parameter>
<parameterName value=":entita" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{entita}" />
</layout>
</parameter>
<parameter>
<parameterName value=":descrizione" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{descrizione}" />
</layout>
</parameter>
<parameter>
<parameterName value=":dettaglio" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{dettaglio}" />
</layout>
</parameter>
<parameter>
<parameterName value=":modulo" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{modulo}" />
</layout>
</parameter>
</appender>
<root >
<level value="ALL" />
<appender-ref ref="ColoredConsoleAppender" />
</root>
I have a webapp that I would like to use a different log4net config file when running under DEBUG mode compared to running under RELEASE mode.
I am using log4net version 2.0.3.
In my AssemblyInfo.cs class I have this code:
#if DEBUG
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4netDebug.xml", Watch = true)]
#else
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4netLive.xml", Watch = true)]
#endif
In my Global.asax.cs class I have this code:
log4net.Config.XmlConfigurator.Configure();
log = LogManager.GetLogger(typeof(GlobalApp));
(log is a public static member of GlobalApp.)
In my log4netDebug.xml file I have this code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Configuration for logging using log4net-->
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- Show logging in the Visual Studio output window-->
<appender name="TraceAppender"
type="log4net.Appender.TraceAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-6level - %message%newline" />
</layout>
</appender>
<appender
name="AdoNetAppender"
type="log4net.Appender.AdoNetAppender">
<threshold>INFO</threshold>
<bufferSize
value="1" />
<connectionType
value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=BLAH;initial catalog=BLAH;integrated security=True;persist security info=True" />
<commandText value="INSERT INTO Logs ([Date],[Thread],[Source],[Level], [Logger],[Message],[Exception],[HostName]) VALUES (#log_date, #thread, 'LOG SOURCE',#log_level, #logger, #message, #exception, #hostname)" />
<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="#hostname" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{log4net:HostName}" />
</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>
<root>
<level value="ALL" />
<!-- Show logging in the Visual Studio output window-->
<appender-ref ref="TraceAppender" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</configuration>
I have tested this config script and it works if I place it in my web.config file.
The log4netDebug.xml file has the Copy always property set.
When I try to do something like this:
System.IO.FileInfo fi = new System.IO.FileInfo("Log4NetDebug.xml");
log4net.Config.XmlConfigurator.ConfigureAndWatch(fi);
This doesn't work either.
I have read several stackoverflow and other web pages that describe how to do this and I seem to be doing what they recommend doing but it still deson't seem to work.
Any ideas why?
If you look at the Constructor for the FileInfo class, you will see that it expects The fully qualified name of the new file, or the relative file name..
So when you do this System.IO.FileInfo fi = new System.IO.FileInfo("Log4NetDebug.xml"); you need to specify the full path to the file.
As this is in a web app, you probably want something like this:
var logFile = new FileInfo(Path.Combine(HttpRuntime.BinDirectory, "Log4NetDebug.xml"));
I have a problem with Log4Net. It doesn't add any entry in the table...
here is the table query
CREATE TABLE [dbo].[Log4Net_Error](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar](255) NOT NULL,
[Level] [varchar](50) NOT NULL,
[Logger] [varchar](255) NOT NULL,
[Message] [varchar](4000) NOT NULL,
[Exception] [varchar](2000) NULL
) ON [PRIMARY]
GO
and the code in the web.config is bellow:
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=.\SQLEXPRESS;Initial Catalog=pnawebloket;Integrated Security=True" />
<commandText value="INSERT INTO Log4Net_Error2 ([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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="#exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</root>
Also, in global.asax.cs in Aplication_Start i added the line
log4net.Config.XmlConfigurator.Configure();
And i still have no entry in the table.
public ActionResult Employees()
{
log4net.ILog logger = log4net.LogManager.GetLogger(this.GetType());
logger.Info("test");
//throw new Exception("ex");
ViewBag.Message = "Bellow is a table with employee's";
var employees = employeerepository.FindAllEmployee().ToList();
return View(employees);
}
If i try to add the message in a text file work's fine.
App is in MVC3 and i'm using sql server 2008r2
Any suggestions??
Your Log table : Log4Net_Error ; Log Table at configuration file : Log4Net_Error2. You should change table name as Log4Net_Error at configuration file.