Log4Net not writing to the database - c#

I've checked the connection string (I got it from the server explorer).
I've checked the commandText in log4net config.
I've checked the database permissions (integrated security is fine and works outside of the log4net class).
I've checked the repository's configured property (it is configured, it finds the config file fine).
I've also checked that the fields defined in the config file match the attributes (field size etc.) of the table in the database.
Any ideas?
When I'm debugging it seems to be hitting all the right methods at all the right times, with no exceptions raised.
<log4net>
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="" />
<commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message]) VALUES ('01-01-2001', 'test', 'test', 'test', 'test')"/>
<!--<commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MachineName],[CultureId],[SourcePage],[Details],[Method]) VALUES (#log_date, #thread, #log_level, #logger, #message, #exception, #MachineName, #CultureId, #SourcePage, #Details, #Method)" />-->
<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>
...more parameters
<securitycontext type="log4net.Util.WindowsSecurityContext">
<credentials value="Process">
</credentials>
</securitycontext>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="LogTest.txt"/>
<param name="AppendToFile" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-2p %c [%x] - %m%n"/>
</layout>
</appender>
<root>
<appender-ref ref="ADONetAppender"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
It's writing to neither appender.

Right, after hours of pulling my hair out - I've cracked it.
This line:
log4net.Config.XmlConfigurator.Configure();
Needed putting in prior to any logging (well, as early as possible in the app). That's it. That was all it took. This is one of those problems were I'm extremely relieved but frustrated at the same time.

I would recommend turning on Log4Net debugging:
<add key="log4net.Internal.Debug" value="true"/>
That may point you in the right direction if there's an error that's occurring behind the scenes. The output will be directed to the console output in the IDE or in the command line.

Check if log4net.dll is placed in the same folder as your application.
Try to enable log4net self-logging, maybe it'll help to find out:
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
See also the official log4net FAQ.

I ran into a similar issue yesterday, Log4Net was just not writing to the database. I copied the configuration from another existing appender that successfully writes logs to the database. My solution was to run SQL Server Profiler to try and catch what was happening. Profiler showed that the INSERT statements were being sent by Log4Net, but it was failing on the SQL Server side. Manually running the INSERT statement in SQL Server Management Studio showed me exactly what was wrong with it, in my case, it was inserting NULL into a column that didn't accept NULL.

per the ADONetAppender config example:
<commandText value="INSERT INTO dbo.Log4Net
([Date],[Thread],[Level],[Logger],[Message])
VALUES (#log_date, #thread, #log_level, #logger, #message)"/>
This uses the ADO.NET parameterized query format, so you need to use that syntax. Additionally, you may not want to use integrated security for the db connection (esp. if you are running a web site or a service). For your file appender, I recommend a fully qualified path, and make sure it is writeable by the logger.
I assume you have already created the table in the specified database?
NOTE I recommend setting the trace appender in Debug mode too, to make sure you are actually logging stuff.

Add this line in the AssemblyInfo.cs file
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
As the official configuration manual states "The log4net configuration can be configured using assembly-level attributes rather than specified programmatically", which I found as a more clear approach. Some people might find my answer as a more straightforward.
Source: https://logging.apache.org/log4net/release/manual/configuration.html

for sql server connectivity I'm using my live account to login to azure and sql server and due to that I had to change integrated security to "SSPI" instead of "true" did the trick
only found out it was the con string by adding this
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\Logs\log4net.txt" />
</listeners>
</trace>

Related

Not able to get log4net working to write to file

I am using sharpdevelop to create a console application in C#. I have added in the reference for log4net and I added my logging statements while I was writing the code but I never looked at the log file. Now I am done with the code I need to get the log file working. My program runs fine, even the logging statements, but I can't find the log file.
I have tried to cobble together a couple of examples on getting log4net working. I have the lines to read from the configuration and then to instantiate the object, these are the first lines in my program to run:
log4net.Config.XmlConfigurator.Configure();
ILog datalogger = LogManager.GetLogger("myLog"); //initiate the data logger
Then in various places throughout the code I have this:
datalogger.Info(DateTime.Now.ToString() + ": using file: " + ProDirectory.ToString() + #"\" + myProFile.ToString());
I have also put the following in my app.config file:
<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
<file value="myLog.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level - %message%n" />
</layout>
</appender>
<logger name="myLog">
<level value="All"></level>
<appender-ref ref="myLogAppender" />
</logger>
No matter what I do, I can't see the log file being produced. I have changed the directory and even paused the program to see if I could find a handle open to the log file. Each time I come up empty. Not sure what I could be doing wrong.
not sure if this will help. I also had hard times making log4net work in different scenarios.
I use log4net root xml node to specify the appender. hope it will help.
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="250KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
UPDATE
You might also want to check Visual Studio output log. First setup the output log to log "ALL" (somewhere in VS settings). Then you should see exact error message of log4net in the output window of Visual Studio.
Whenever I have had issues with log4net creating the log file, it usually wound up being a file / directory permissions issue.
Change your <file value="log.txt" /> to something that you know will be accessible by the current user / process running devhost.
For example: <file value="%USERPROFILE%\Documents\log.txt" /> will create a log file in the user's My Documents folder. This is a folder that the user has permissions to write data to, and shouldn't give you any troubles with.
For more information on special folder values, see this link.
Looks like I just had to clean up my XML a little, after I did the log file is working fine:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections> <!-- Level 1 -->
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,
log4net"/> <!-- Level 2 -->
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<log4net>
<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
<file value="myLog.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level - %message%n" />
</layout>
</appender>
<logger name="myLog">
<level value="All"></level>
<appender-ref ref="myLogAppender" />
</logger>
</log4net>
</configuration>

Log4net doesn't write to file

I want add new log to file.this is my appender:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="mylogfile.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="5"/>
<maximumFileSize value="10MB"/>
<staticLogFileName value="true"/>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="test"/>
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="error"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception"/>
</layout>
</appender>
<root>
<level value="All"/>
<appender-ref ref="RollingFileAppender"/>
</root>
and on my class I add
[assembly: XmlConfigurator(Watch = true)]
and I add access everyone for the file but: log4net doesn't write to file. Why?
Log4net fails silently when there's a problem. The design conceit is that no logging is preferable to taking down the application. To figure out what's wrong, turn on Log4net's internal debugging by adding this key to your [app/web].config file:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
The debug messages will be written to the console or to the System.Diagnostics.Trace system. More details from Phill Haack at http://haacked.com/archive/2006/09/26/Log4Net_Troubleshooting.aspx/
There are any number of reasons Log4net might fail. Permissions problems on the log file directory, for starters (especially true for server processes, where your likely running under a restricted set of permissions for security).
You just need to call Configure:
log4net.Config.XmlConfigurator.Configure();
You can see more details here:
Log4net does not write the log file
You need to initialise the logging as the very first step in your app, and from the same assembly that you have the [assembly] tag:
From the docs:
Therefore if you use configuration attributes you must invoke log4net
to allow it to read the attributes. A simple call to
LogManager.GetLogger will cause the attributes on the calling assembly
to be read and processed. Therefore it is imperative to make a logging
call as early as possible during the application start-up, and
certainly before any external assemblies have been loaded and invoked.
Add something like this in your start up code:
LogManager.GetLogger("Initialises logging from assembly attributes");
You should add this config section:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
to refer the log4net configuration.

Log4Net Not Logging When Deployed

Using version 1.2.11. Logging works on my dev machine, but won't create the directory or log when deployed.
I tried:
giving full directory access to IUSR, Everyone, local users.
running the app pool as a local admin account.
to use internal debugging as Phil Haack describes here.
Stopped and started the app pool after each change.
Nothing is produced in the output file.
My log4Net config is below. Any thoughts on what to try next?
<?xml version="1.0"?>
<log4net debug="true">
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="..\Logging\log.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<threshold value="DEBUG" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<appender name="console" type="log4net.Appender.DebugAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</root>
</log4net>
If the directory and the file is not being created, then most likely, the configuration is not being read (and therefore used) at runtime.
I always forget to add the single line of code for Log4net that hooks up the configuration. This code usually appears in the bootstrap class in the application (e.g. Global.asax for an ASP.NET app).
XmlConfigurator.Configure(new System.IO.FileInfo(configFile)); // configFile being the path to the file.
Instead of the above in-line, you can add this attribute to the AssemblyInfo.cs file:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Either way, this will wire up log4net. More information is found in the Manual Configuration section of the log4net docs.
If you're using IIS, make sure the correct group has modify access to the Logs folder (usually IIS_USERS).
Sounds like a permissions issue to me. I almost always use a directory where I don't have to enable any special permissions for the applications to write the log files to.
Here is what I generally use with log4net:
<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Company Name>/Logs/<Program Name>/<Log file name>.txt" />
Of cource you'll need to substitute Company Name, Program Name and Log file name in the above with actual values.
This will write to the ProgramData folder where access is typically not restricted. You can navigate to this folder in File Explorer by typing %ProgramData% or %AllUsersProfile%
Another thing I like about this method is that it works on nearly every microsoft O/S. XP, Vista, 7, 8
You probably do not know where you are logging:
<file value="..\Logging\log.txt" />
Will is derived from your running directory, which is iis its directory. You can better use a full path like:
<file value="c:\Logging\log.txt" />
Then you can give the right access rights to the logging directory. Log4net will not create any directories as far as I know. So you have to create the c:\logging directory first.
Non of the answers worked for me until I put these lines to the web.config app settings:
<add key="log4net.Config" value="Log.config" />
<add key="log4net.Config.Watch" value="True" />

unable to write logs to a file using log4net in an ASP.NET Web Forms Site

I'm having a problem logging to a text file using log4net dll.
I'm using vs 2012 express on a windows server 2008 r2 standard (64).
I have preform the following steps:
Open a new asp.net web forms
Install log4net via nuget manager.
in the global.asax file I have this in Application_Start :
log4net.Config.XmlConfigurator.Configure ();
In the web config I have added to the configSections node this line :
< section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
In the web config I have added this section :
<log4net debug="true">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\webSite\extraDownloadServerResources\Logs\ALU\log.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite"/>
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n%-5p %d %5rms %-22.22c{1} %-18.18M %n - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
In a start up page I have fetch instance of the logger :
private static readonly ILog log = LogManager.GetLogger ( System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType );
In the Page_Load I have wrote this line :
log.Debug ( "test" );
I have add to the log.txt file security the Dedualt App Pool user with read/write permissions.
I have ended up with nothing in my log file.
To test the steps I did I have created a new empty web site and follow these steps one by one.
alas (I like this word) this time the log have been written to the file.
Can any one point me to a possible solution ?
To debug issues with log4net configuration you should enable log4net internal debugging.
Inside appSettings add log4net.Internal.Debug key as following:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
This will enable log4net to output all messages to console and to the Trace. To forward all diagnostics messages to file you can add a trace listener:
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
These snippets were taken directly from the log4net FAQ and here only for quick reference.
This at least will give you understanding of what is going on as you will get error messages.
i have managed to solve my problem.
i have downloaded a tool to monitor all iss trafic.
When monitoring the traffic i saw the user name wasn't defaultAppPool nor AppPoolName.
it was ASP.NET v4.0.
After i granted the permissions and restarted everything , i finally saw some logs in the file...

Is there a way to implement rolling log out put using standard .NET trace listener config (as opposed to one massive file)

I'm using .net web config to create trace listener for debug and trace output in a .NET web app.
The problem is that if left, the log file, which always uses the same name can get massive and has actually caused me some application issues today.
I can't find a method on the net of setting a log file size limit, or a method of using a dynamic name, such as one that uses a date string as part of the name.
Does anyone know if this is possible?
So far I am using:
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="CollectionLister" type="System.Diagnostics.TextWriterTraceListener" initializeData="Collections.log" />
</listeners>
</trace>
</system.diagnostics>
Personally, I would use a more sophisticated logging framework, like nlog
That can do the file splitting policy stuff for you.
Like Will, I'd suggest using another logging framework.
My preference is Microsoft Enterprise Libraries's logging application blog.
See Apache log4net
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread]
%-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
Codeplex hosts a project that has additional trace listeners and filters that plug directly into the existing .NET Trace system you are using. That should minimise any need to change your code.
This includes a rolling flat file logger.
See essentialdiagnostics for details.

Categories

Resources